【问题标题】:Using same MySql Connection For Two Prepared Statements对两个准备好的语句使用相同的 MySql 连接
【发布时间】:2014-04-27 17:34:43
【问题描述】:

所以我的 PHP 代码有问题,我试图运行两个准备好的语句,这些语句已经用相同的 $mysqli 对象“准备好了”。

        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()

【问题讨论】:

  • 啊抱歉,这会有所帮助。我得到的错误是关于 $prepared->bind_param("sss", $username, $key, "#FFFFFF');行

标签: php mysql mysqli prepared-statement


【解决方案1】:
  1. To get the actual error
  2. To solve it。从错误中您可以看出之前的查询有待处理的结果。需要存储它们

【讨论】:

  • 感谢您这么快回来。不要以为您对 store_result 函数有更好的解释...... PHP 文档没有详细说明原因。
【解决方案2】:

我以程序方式做我的事情,但也有同样的问题。所以我创建了两个不同的数据库连接变量(只是一个 hack 不是正确的解决方案)而不是这样做:

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. 准备语句(初始化和绑定参数)
  2. 执行语句
  3. 获取结果 (mysqli_stmt_get_result)
  4. 结束声明。

(特别感谢您的常识)

【讨论】:

  • 显然你可以,但你的答案是错误的
  • 非常感谢您的友好回复。您的意思是当以过程方式使用准备好的语句时,我们可以使用相同的连接变量在同一个脚本中准备两个语句?
  • 当然可以。你有没有偶然注意到我下面的回答?
  • 这个答案非常具有误导性。您可以使用单个连接准备任意数量的语句。每次都打开一个新连接是一种可怕的黑客行为,它会阻止您使用事务。
  • @Dharman 请考虑编辑部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多