我正在使用mysqli_stmt_bind_param()来创建INSERT语句。出于某种原因,我收到了一个错误。我使用mysqli_error()来查看错误消息,但它并不是特别有用。
有没有办法只看到实际执行的查询?
产生的错误:
您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'desc,date,expdate,mintix,maxtix,contactname,contactemail,contactphone'附近使用正确的语法VALUES(?'在第1行
答案 0 :(得分:2)
根据this answer,确实无法获得最终生成的语句(这很糟糕!),但mysqli_report中显示的this question可以帮助您调试查询。
答案 1 :(得分:2)
mysqli_prepare()创建的预备语句是服务器端准备好的语句。
当你执行这样一个准备好的语句时,只传递语句id和参数,而不是一些查询字符串,好像你要用实际参数替换占位符(在客户端,即你的php脚本)。
但是您可以在MySQL服务器的常规日志中看到结果,请参阅Prepared Statement Logging
编辑:在您的情况下,语句的准备失败,因为desc
是保留关键字
有关关键字列表以及如何将其用作标识符(如有必要),请参阅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);