【问题标题】:mysqli bind_param fails or throws non-object error?mysqli bind_param 失败或抛出非对象错误?
【发布时间】:2013-11-01 15:28:59
【问题描述】:

嗨,我正在从正常的做事方式转变为这种“新”对象方式......我不会说谎,我很困惑,希望有人能在这里帮助我......

下面是我的代码

<?php
    include("common/functions.inc.php");
    $mysqli = new MySQLi($settings['mysql']['host'], $settings['mysql']['user'], $settings['mysql']['pass'], $settings['mysql']['db']);
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    if($stmt = $mysqli->prepare("INSERT INTO tbl_survey (fld_submituid, fld_q1answer, fld_q2answer, fld_q3answer, fld_q4answer, fld_q5answer, fld_q6answer) VALUES (:uid, :q1, :q2, :q3, :q4, :q5, :q6)")) {
        $stmt->bindParam(":uid",$uid, PDO::PARAM_INT);
        $stmt->bindParam(":q1",$q1, PDO::PARAM_STR, 12);    
        $stmt->bindParam(":q2",$q2, PDO::PARAM_STR, 12);
        $stmt->bindParam(":q3",$q3, PDO::PARAM_STR, 12);
        $stmt->bindParam(":q4",$q4, PDO::PARAM_STR, 12);
        $stmt->bindParam(":q5",$q5, PDO::PARAM_STR, 12);
        $stmt->bindParam(":q6",$q6, PDO::PARAM_STR, 12);
        $uid = 1;
        $q1 = "q1";
        $q2 = "q2";
        $q3 = "q3";
        $q4 = "q4";
        $q5 = "q5";
        $q6 = "q6";

        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        if($stmt->execute()) {
            echo 'true';
        } else {
            echo 'false';
        }
    } else {
        echo 'fail';
    }

我仍然不知道为什么我的代码失败了,请有人帮助我吗?谢谢你

【问题讨论】:

  • 1 - 不要检查使用 isset($_POST["btn_submit"]) 的提交。使用if($_SERVER['REQUEST_METHOD'] == "POST")。 2 - 你为什么要制作不必要的变量?请阅读第 1-4 点here 以改进和稳定您的代码。
  • 我本来打算为 mysqli_real_escape 创建一个函数,但是在阅读了这个之后,这是我正在走的路,还没有修改很多代码,但是谢谢 :)
  • 1. mysqli_report 必须添加BEFORE CONNECT,而不是执行。 2. mysqli中没有像bindParam这样的没有这样的方法。 3. 手册页上显示了正确的示例。你为什么不跟着它呢?

标签: php mysql oop mysqli


【解决方案1】:

mysqli 不支持命名占位符。

请阅读documentation并遵循正确的语法

要收到来自prepare() 的错误消息,请在连接前添加此行:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

【讨论】:

  • 如果您希望使用命名占位符,请查看 PDO:php.net/manual/en/pdostatement.bindparam.php
  • 太好了,我正在阅读这个 $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)"); $stmt->bind_param('sssd', $code, $language, $official, $percent);你能向我解释一下'sssd'部分吗?我就是不明白,字母是什么意思?谢谢
  • @JoshBlue 为什么要我为你朗读this very manual page
  • s - 字符串? d - 双倍??我明白了!
  • “不工作”不是一个[毫无价值的]解释。它会发出任何错误吗?顺便问一下,这些“两种”方法是什么?到目前为止,我只给你看了一个。
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多