返回由mysqli_stmt_bind_param创建的语句

时间:2010-03-28 00:08:23

标签: php mysql

我正在使用mysqli_stmt_bind_param()来创建INSERT语句。出于某种原因,我收到了一个错误。我使用mysqli_error()来查看错误消息,但它并不是特别有用。

有没有办法只看到实际执行的查询?

产生的错误:

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'desc,date,expdate,mintix,maxtix,contactname,contactemail,contactphone'附近使用正确的语法VALUES(?'在第1行

2 个答案:

答案 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);