【问题标题】:Mysqli "Prepare statement" is not creating the ObjectMysqli“准备语句”没有创建对象
【发布时间】:2011-07-30 17:27:16
【问题描述】:

我是 Mysqli 但不习惯,我对以下代码有问题..

$mysql = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die('There was a problem connecting to the database');
     if (mysqli_connect_errno()) {
        printf("DB error: %s", mysqli_connect_error());
        exit();
     }

     $query = "INSERT INTO employee(id, name, age, address, phone, email, department,
         designation, joindt, terminate, salary, deduction, tds, pf)
         VALUES (:id, :name, :age, :address, :phone, :email, :department,
         :designation, :joindt, :terminate, :salary, :deduction, :tds, :pf)";

     $ins = $mysql->prepare($query);
     if(!ins){
            echo "prepare failed\n";
      echo "error: ", $mysql->error, "\n";
      echo "OBJECT NOT CREATED";
      return;

     }

运行此代码时,我的浏览器中出现以下错误:

( ! ) 致命错误:未捕获的异常 'mysqli_sql_exception' 与 message '你有一个错误 SQL 语法;检查手册 对应你的 MySQL 服务器 使用正确语法的版本 在附近 C:\wamp\www\payroll\new_backend.php 上 第 40 行

( ! ) mysqli_sql_exception: 你有 SQL 语法错误;检查 对应于您的 MySQL 的手册 正确语法的服务器版本 使用近'加入,终止,薪水, 扣除, tds, pf) 值 (:id, :name, :age, ' 在 C:\wamp 的第 2 行 \www\payroll\new_backend.php 上线 40

我猜 PREPARE 语句没有创建 $ins 对象。有什么帮助吗?

【问题讨论】:

  • 对不起水平滚动..
  • 我假设您知道 SQL 语法错误是未创建对象的原因... :-?
  • @Alvaro - 我正在使用本教程中的语法 - net.tutsplus.com/tutorials/databases/sql-for-beginners 你能告诉我正确的语法吗?或者我可以学习的页面?
  • 您是否从链接的教程中获得代码?它甚至没有提到 mysqli 扩展。
  • 我在我的答案中添加了一个应该有效的示例。

标签: php mysql mysqli prepared-statement


【解决方案1】:

join 是 mySQL 中的保留字。您需要将其括在反引号中:

`join` 

或者 - 更好 - 更改列的名称。

此外,mysqli 似乎不支持 PDO 样式的 :fieldname 绑定。查看manual on prepare().中的示例

我现在无法对此进行测试,但正确的语法应该是这样的(缩写):

$id = 10;
$name = "John Doe";

$query = "INSERT INTO employee(id, name) values (?, ?)";
$query->bind_param("i", $id);
$query->bind_param("s", $name);

【讨论】:

  • 是的..我刚才把它改成了joindt..同样的错误。
  • @Hrishikesh :fieldname 首先在 mysqli 中有效吗?那是 PDO 表示法,不知道 mysqli 是否也支持它。你从哪里得到这些值?
  • 哦是的..!非常感谢.. 所以我把 Mysqli 和 PDO 符号混在一起了.. 呵呵.. 谢谢.. 我在你的帮助下解决了.. 下面是解决方案..
  • @Pekka:最后一件事。当我绑定 DATE 参数时,我应该使用哪种数据类型? “我”还是“我”?
  • @Hrishikesh 是的。 IIRC,日期选择器可以自动将日期转换为您想要的格式。
【解决方案2】:

查看 mysqli::prepare() 的手册页:

准备好的语句期望 ? 作为占位符,而不是 :foo

【讨论】:

    【解决方案3】:

    这是我在 Pekka 的帮助下得出的解决方案.. :)

     $mysql = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die('There was a problem connecting to the database');
         if (mysqli_connect_errno()) {
            printf("DB error: %s", mysqli_connect_error());
            exit();
         }
    
         $query = "INSERT INTO employee(name, age, address, phone, email, department,
             designation, joindt, terminate, salary, deduction, tds, pf)
             VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
    
         $ins = $mysql->prepare($query);
         if(!$ins){
                echo "prepare failed\n";
          echo "error: ", $mysql->error, "\n";
          return;
    
         }
    
         $ins->bind_param('sisisssiiiiii', $data['name'], $data['age'], $data['address'],
                 $data['phone'], $data['email'], $data['department'], $data['designation'],
                 $data['joindate'], $data['terminationdate'], $data['salary'], $data['leave_deduction'], $data['tds'], $data['pf']);
    
         $ins->execute();
    

    【讨论】:

    • 很高兴您不需要阅读手册 :-P — 请使用{} 工具栏按钮来格式化源代码。这次我替你做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2013-10-22
    • 2012-02-02
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多