我使用下面的代码对准备好的语句进行查询:我使用mysqli::$res (),而不是mysqli_stmt::prepare(),因此不必初始化$res。它由mysqli::准备返回。php.net链路
$sql2 = "INSERT INTO best_scores(`user_id`, `test_id`, `score`) VALUES(?, ?, ?)";
if($res = $db->prepare($sql2) == FALSE) echo $db->error . "\n";
$res->bind_param("sii", $user_id, $_GET['test'], $max);
$res->execute();
$res->free_result();当到达该代码时,出现以下错误:
Call to a member function bind_param() on a non-object我寻找答案,但所有的问题在SQL查询字符串中都有错误,或者它们没有释放之前的结果。他们谁也帮不了我,所以我试着改变一些事情。我把我的代码改为:
$sql2 = "INSERT INTO best_scores(`user_id`, `test_id`, `score`) VALUES(?, ?, ?)";
$res = $db->stmt_init();
if($res->prepare($sql2) == FALSE) echo $db->error . "\n";
$res->bind_param("sii", $user_id, $_GET['test'], $max);
$res->execute();
$res->free_result();现在起作用了。但为什么不一样呢?第一次尝试有什么问题?
编辑:我的$db对象定义如下:
$db = new mysqli("localhost", "user", "pass", "database");
if($db->connect_errno > 0) {
die('Unable to connect to database [' . $db->connect_error . ']');
}发布于 2014-01-27 12:23:09
当我们在注释中讨论它时,它可能是if()块中的错误分配。
我测试了什么。如果像你这样的街区:
$x = (object)array('a'=>'b');
if ($a = $x == false) {
echo 'a';
}
var_dump($a);输出:
布尔假
然后,我在分配的周围加上圆括号:
$x = (object)array('a'=>'b');
if (($a = $x) == false) {
echo 'a';
}
var_dump($a);输出:
对象(StdClass)1公共'a‘=> string 'b’(length=1)
因此,您需要在分配给$res时加上括号。
if(($res = $db->prepare($sql2)) == FALSE) 因为按照您的方式,您错误地将$res重新分配到FALSE,并且对象丢失了。
发布于 2014-01-27 11:51:44
在第一个示例中,您正在检查db-> object是否有效,如果没有,则使用$res,因为它没有初始化,所以现在它不是一个对象。在第二个示例中,首先声明并初始化它。
发布于 2014-01-27 11:53:04
在文件中:
mysqli_stmt_init -初始化语句并返回用于mysqli_stmt_prepare的对象
在您的prev代码中,您没有初始化。在初始化后的第二个代码片段中,它工作了。
链接:http://www.php.net/manual/en/mysqli.stmt-init.php
https://stackoverflow.com/questions/21380074
复制相似问题