2 votes

Requête qui fonctionne en SQL mais pas en PHP

J'ai des problèmes avec une requête SQL que j'ai insérée dans un morceau de code PHP pour récupérer des données. La requête elle-même fonctionne parfaitement dans SQL, mais lorsque je l'utilise dans mon script PHP, le système indique "Error in Query" (erreur dans la requête) puis récite l'intégralité de l'instruction SQL. Si je copie et colle l'instruction SQL du message d'erreur directement dans MySQL, elle s'exécute sans erreur.

D'après mes recherches, je crois qu'il me manque une apostrophe quelque part, de sorte que PHP peut confondre les clauses, mais je ne suis pas assez expérimenté pour savoir où les insérer.

La requête utilise une variable appelée $userid qui est spécifiée plus tôt dans le script de PHP.

$sql= <<<END

SELECT sum(final_price)  
FROM (
    SELECT Table_A.rated_user_id, Table_B.seller, Table_B.final_price
    FROM Table_A
       INNER JOIN Table_B ON Table_A.id=Table_B.id
) AS total_bought
WHERE seller != $userid
AND rated_user_id = $userid

    UNION ALL

SELECT sum(final_price)  
FROM (
    SELECT Table_A.rated_user_id, Table_C.seller, Table_C.final_price
    FROM Table_A
        INNER JOIN Table_C ON Table_A.id=Table_C.id
) AS total_bought
WHERE seller != $userid
AND rated_user_id = $userid

END;

Après cette section, le script continue à définir la sortie et à envoyer les éléments nécessaires comme d'habitude. Je suis satisfait de la dernière partie du code car elle fonctionne ailleurs, mais le problème que je rencontre semble se situer dans la section ci-dessus.

Quelqu'un peut-il repérer l'erreur ?

Modifié pour ajouter les informations supplémentaires suivantes :

Tous les champs sont des valeurs numériques, aucun n'est du texte. J'ai essayé de mettre '$userid' mais cela ne fait qu'afficher le ' ' autour de cette valeur dans les résultats de l'erreur. Le problème reste le même. L'ajout de parenthèses n'a pas aidé non plus. J'ai fait quelques essais et erreurs avant de poster ma question.

Si cela peut vous aider, la dernière partie du code utilisé par Bieng est la suivante :

$result = mysql_query($sql);
if (!$res) {
  die('Error: ' . mysql_error() . ' in query ' . $sql);
}
$total_bought = 0;
while ($row = mysql_fetch_array($result)) {
  $total_bought += $row[0];
}
$total_bought = number_format($total_bought, 0);
echo '<b>Your purchases:  '  . $total_bought . '</b>';
echo "<b> gold</b>";

8voto

John Rasch Points 28874

Vous êtes en train de vérifier !$res il devrait être !$result :

$result = mysql_query($sql);
if (!$result) {
  die('Error: ' . mysql_error() . ' in query ' . $sql);
}

0voto

soulmerge Points 37314

Je suppose que vous êtes echo() en plaçant la requête quelque part et en la copiant-collant depuis le navigateur. Se pourrait-il que le $userid contient des balises xml ? Elles ne seraient pas affichées dans le navigateur, il faudrait voir la source de la page pour les repérer.

0voto

instanceof me Points 8419

Vous devriez tester avec $userid entre guillemets, et des parenthèses autour des deux déclarations.

0voto

Steve Mallory Points 2713

Je suppose que rated_user_id est un champ numérique, mais de quel type est le vendeur ? Si c'est un champ de caractère, alors $userid devrait être cité comme streetpc le suggère.

Une autre chose à vérifier est que vous avez au moins un espace après la fin de vos lignes pour chaque ligne de la requête. Cela m'a déjà fait trébucher. Parfois, en passant de votre éditeur/IDE à l'outil de base de données, ces problèmes sont silencieusement résolus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X