2010-03-28 6 views
3

J'utilise mysqli_stmt_bind_param() pour créer une instruction INSERT. Pour une raison quelconque, je reçois une erreur. J'ai utilisé mysqli_error() pour voir le message d'erreur, mais ce n'est pas particulièrement utile.instruction de retour créée par mysqli_stmt_bind_param

Existe-t-il un moyen de voir quelle requête est en cours d'exécution?

l'erreur résultant:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,date,expdate,mintix,maxtix,contactname,contactemail,contactphone) VALUES (?' at line 1

+3

S'il vous plaît nous montrer votre code. Il est difficile de vous aider autrement. –

+0

En plus de ce que byronh a commenté, vous devriez pouvoir stocker votre requête dans une variable, puis {log, echo, save} l'instruction de requête avec le code d'erreur. – bdl

+1

@bdl Je ne pouvais pas trouver un moyen de convertir une instruction préparée en chaîne (je pense que bigmac demande). –

Répondre

2

Les instructions préparées créées par mysqli_prepare() sont côté serveur instructions préparées.
Lorsque vous exécutez une instruction préparée, seuls l'ID d'instruction et les paramètres sont transférés, pas une chaîne de requête comme si vous remplaciez les espaces réservés par les paramètres réels (côté client, c'est-à-dire votre script PHP).
Mais vous pouvez voir le résultat dans le journal général du serveur MySQL, voir Prepared Statement Logging

modifier: dans votre cas, la préparation de la déclaration échoue parce que desc est un mot-clé réservé.
Pour une liste des mots-clés et comment les utiliser comme identifiants (le cas échéant) voir http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

$q = ' 
    INSERT INTO 
    `event` 
    (
     `cityid`, `name`, `desc`, `date`, 
     `expdate`, `mintix`, `maxtix`, 
     `contactname`, `contactemail`, `contactphone` 
    ) 
    VALUES 
    (
     ?,?,?,?, 
     ?,?,?, 
     ?,?,? 
    ) 
'; 

if (false===($stmt=mysqli_prepare($dblink, $q))) { 
    /* 
    in production-code you might not want to reveal 
    the error string to each and every user 
    ...but for this example and for debugging purposes: 
    */ 
    die('mysqli_prepare failed: '.htmlspecialchars(mysqli_error($dblink))); 
} 

$rc = mysqli_stmt_bind_param(
    $stmt, 
    "issssiisss", 
    $city,$name,$desc,$date, 
    $expdate,$mintix,$maxtix, 
    $contactname,$contactemail,$contactphone 
); 
if (false===$rc) { 
    die('mysqli_stmt_bind_param failed: '.htmlspecialchars(mysqli_stmt_error($stmt))); 
} 


if (false===mysqli_stmt_execute($stmt)) { 
    die('mysqli_stmt_execute failed: '.htmlspecialchars(mysqli_stmt_error($stmt))); 
} 

mysqli_stmt_close($stmt); 
+0

Ahh, donc * c'est la raison pour laquelle ni mysql ni PDO ne le supportent correctement. Merci. –

+0

PDO peut effectuer des instructions préparées côté client et côté client (émulé) (PDO :: ATTR_EMULATE_PREPARES). Dans ce dernier cas, il serait possible d'imprimer une chaîne de requête bien qu'elle ne semble pas exposée. – VolkerK

+0

Je pensais avoir déjà utilisé desc comme nom de colonne avant, mais j'avais tort. Je suis surpris que phpMyAdmin me laisse l'utiliser. J'ai juste essayé de le changer et phpMyAdmin a affiché une erreur. Il a quand même réussi à le changer et maintenant tout fonctionne. Merci pour toutes ces façons d'attraper les erreurs. C'est vraiment utile. Je n'ai pas réalisé que tout cela était possible. – burger

2

Selon this answer, il est en effet impossible d'obtenir la déclaration produite finale (ce qui est horrible!), Mais peut-être mysqli_report comme indiqué dans this question peut vous aider à déboguer votre requête.

Questions connexes