【问题标题】:returning statement created by mysqli_stmt_bind_param返回由 mysqli_stmt_bind_param 创建的语句
【发布时间】:2011-02-01 15:37:40
【问题描述】:

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

有没有办法查看实际正在执行的查询?

产生的错误:

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

【问题讨论】:

  • 请向我们展示您的代码。否则很难为您提供帮助。
  • 除了 byronh 评论的内容之外,您应该能够将查询语句存储在变量中,然后将查询语句与错误代码一起{log, echo, save}。
  • @bdl 我找不到将准备好的语句转换回字符串的方法(我认为 bigmac 要求什么)。
  • 我认为 Brendan 是对的,但我添加了代码。也许我只是看不到多余的逗号或其他东西。

标签: php mysql


【解决方案1】:

根据this answer,确实不可能得到最终生成的语句(太可怕了!),但也许this question中显示的mysqli_report可以帮助您调试查询。

【讨论】:

    【解决方案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);
    

    【讨论】:

    • 啊,所以 这就是 mysql 和 PDO 都不支持这个的原因。谢谢。
    • PDO 可以执行服务器端和客户端(模拟)准备语句 (PDO::ATTR_EMULATE_PREPARES)。在后一种情况下,可能打印一个查询字符串,尽管它似乎没有被暴露。
    • 我以为我以前用 desc 作为列名,但我错了。我很惊讶 phpMyAdmin 让我使用它。我只是尝试更改它并且 phpMyAdmin 显示错误。它仍然设法改变它,现在一切正常。感谢所有这些捕获错误的方法。这真的很有用。没想到所有这些都是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2013-10-21
    相关资源
    最近更新 更多