PHP - mysqli :: prepare返回false

时间:2013-10-19 12:54:32

标签: php binding mysqli prepared-statement

我有这个非常简单的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,第一次绝对没问题。更奇怪的是,如果我删除第一行代码(即第一次准备),第二行将毫无问题地工作......

编辑2:好吧,我现在可以说的是WTF。事实证明,如果我删除了作业,(我不做$stmt = prepare()...)但只是调用该函数,$mysqli->error列表不为空 - 它说“命令不同步;你无法运行这个命令现在“。如果我做了作业,它就是空的......

EDIT3:我切换到PDO,它完美无缺。在我能证明不是这样之前,我会假设MySQLi是错误的。

3 个答案:

答案 0 :(得分:5)

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

...
//do sth with the data

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

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

答案 1 :(得分:1)

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

此代码返回什么内容?

print_r($mysqli->error_list);

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

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

答案 2 :(得分:-1)

我发现,当prepare的返回值被赋值给一个先前持有MYSQLi预处理语句的变量名时,它会默默地失败(errno = 0,error =“”),但是如果一个新变量将返回正确的错误消息用来。甚至可能这样的事实表明关于PHP执行模型的负面信息恕我直言。

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

我在现有的框架中工作,但我衷心建议切换到PDO,这是规范的方式。