【问题标题】:PHP - mysqli::prepare returning falsePHP - mysqli::prepare 返回 false
【发布时间】:2013-10-19 12:54:31
【问题描述】:

我有这个非常简单的 PHP 代码:

$mysqli = new mysqli('localhost', 'xxx', 'xxxxx', 'xxx');

$query = "SELECT * FROM questions WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('d', $_GET['qid']);
$stmt->execute();
$stmt->bind_result($id, $content, $correct_ans, $lol);
$stmt->fetch();

//do sth with the data

$query = "SELECT * FROM answers WHERE question_id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('d', $_GET['qid']);
$stmt->execute();
$stmt->bind_result($id, $content, $lol);

while($stmt->fetch())
{
    //do sth
}

基本上,似乎无论我做什么,第二个mysqli::prepare() 总是返回false,但是mysqli::error 出于某种原因是空的。任何人都可以在这里看到错误吗?

PS。这不是重复的问题;是的,已经有人问了:MySQLi prepared statement returning false 但作者懒得和大家分享他的解决方案。

编辑:我想我应该解释一下:只有第二个准备返回 false,第一个绝对没问题。更奇怪的是,如果我删除第一行代码(即第一行准备),第二行将毫无问题地工作......

EDIT2:好吧,我现在只能说WTF。事实证明,如果我删除分配,(我不执行 $stmt = prepare()...) 而是调用函数,$mysqli->error 列表不为空 - 它显示“命令不同步;您现在无法运行此命令” .如果我做作业,它是空的......

EDIT3:我切换到 PDO,它运行良好。除非我能证明不是这样,否则我会假设 MySQLi 有问题。

【问题讨论】:

  • -1 表示 EDIT3。 Mysqli 只是一个底层驱动,而 PDO 是一个半 DBAL。
  • @YourCommonSense 我刚刚浪费了一个小时来解决这个问题,所以如果我的帖子有点情绪化,我很抱歉;)。好吧,但是你能解释一下 EDIT2 中描述的荒谬行为吗?

标签: php binding mysqli prepared-statement


【解决方案1】:

在第二次使用 mysqli::prepare() 之前,您必须要么 free mysqli result 要么 close current mysqli statement

...
//do sth with the data

$mysqli->free(); // or $stmt->close();

$query = "SELECT * FROM answers WHERE question_id = ?";
$stmt  = $mysqli->prepare($query);
...

【讨论】:

    【解决方案2】:

    您是否为数据库访问设置了正确的凭据?用户名、密码……

    这段代码返回什么?

    print_r($mysqli->error_list);

    http://www.php.net/manual/en/mysqli.error-list.php

    SQL 查询看起来不错,但可能您的数据库名称或表结构有误...

    【讨论】:

    • >无论我做什么,第二个 mysqli::prepare() 都会返回 >false 也许你需要将第二个 $stmt 重命名为 $stmt2
    • 不,是准备返回 false。
    【解决方案3】:

    我发现当prepare的返回值被分配给一个变量名时,它会静默失败(errno=0,error=""),但是如果一个新的变量会返回正确的错误信息用来。这甚至是可能的事实说明了 PHP 执行模型恕我直言的负面影响。

    与上面的其他答案相反,您可以有多个准备好的语句并同时使用它们,它是古老的mysql(不是mysqli)驱动程序,不能走路和嚼口香糖。

    我正在使用现有框架,但我强烈建议切换到 PDO,这是执行此操作的规范方式。

    【讨论】:

    • ...或规范引用?
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多