对两个准备好的语句使用相同的MySql连接



所以我的PHP代码有问题,我试图运行两个用同一$mysqli对象"prepare"的prepare语句。

        require 'database.php';
        $mysqli = new mysqli($database_host, $database_user, $database_pass, $database_name);
        /*First check if there is already a preference record for this user
          with this particular course.*/
        $query = "SELECT * FROM timetablePrefs WHERE username=? AND courseID=?";
        $stmt = $mysqli->prepare($query);
        foreach ($courseList as $key => $value)
        {
            $stmt->bind_param("ss", $username, $key);
            $stmt->execute();
            if (($stmt->num_rows) === 1)
                continue;
            else
            {
                $query = "INSERT INTO timetablePrefs (username, courseID, hexColour, hidden) ";
                $query .= "VALUES (?, ?, ?, 0)";
                $prepared = $mysqli->prepare($query);
                $prepared->bind_param("sss", $username, $key, "#FFFFFF");
                if (!($prepared->execute()))
                    print("Sorry couldnt change your colour preferences.");
                $prepared->close();
            }
        }
        $stmt->close();
        $mysqli->close();

我可能在这里错过了什么;你能同时运行两个吗?如有任何帮助,我们将不胜感激!如有任何问题,请提出;)

我收到的错误是关于线路的;$prepared->bind_param("sss", $username, $key, "#FFFFFF");致命错误:在非对象上调用成员函数bind_param()

  1. 获取实际错误
  2. 解决它。从错误中可以看出有上一个查询的结果挂起。需要储存

我用程序化的方式做我的事情,但也遇到了同样的问题。所以我创建了两个不同的DB连接变量(只是一个破解而非正确的解决方案),而不是:

stmt_pnl = mysqli_stmt_init($conn);
stmt_bank = mysqli_stmt_init($conn);

我做到了:

stmt_pnl = mysqli_stmt_init($conn);
stmt_bank = mysqli_stmt_init($conn_bank);

错误消失了,它起了作用。

编辑:上面的答案只是一个破解的问题,而不是一个实际的解决方案。解决此错误的正确方法是遵循以下顺序:

  1. Prepare语句(初始化和绑定参数)
  2. 执行语句
  3. 获取结果(mysqli_stmt_Get_result)
  4. 结束语

(特别感谢您的常识)

最新更新