首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysqli::prepare() vs mysqli_stmt::prepare()

mysqli::prepare() vs mysqli_stmt::prepare()
EN

Stack Overflow用户
提问于 2014-01-27 11:47:41
回答 3查看 1.1K关注 0票数 1

我使用下面的代码对准备好的语句进行查询:我使用mysqli::$res (),而不是mysqli_stmt::prepare(),因此不必初始化$res。它由mysqli::准备返回。php.net链路

代码语言:javascript
复制
$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();

当到达该代码时,出现以下错误:

代码语言:javascript
复制
Call to a member function bind_param() on a non-object

我寻找答案,但所有的问题在SQL查询字符串中都有错误,或者它们没有释放之前的结果。他们谁也帮不了我,所以我试着改变一些事情。我把我的代码改为:

代码语言:javascript
复制
$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对象定义如下:

代码语言:javascript
复制
$db = new mysqli("localhost", "user", "pass", "database");
if($db->connect_errno > 0) {
    die('Unable to connect to database [' . $db->connect_error . ']');
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-27 12:23:09

当我们在注释中讨论它时,它可能是if()块中的错误分配。

我测试了什么。如果像你这样的街区:

代码语言:javascript
复制
$x = (object)array('a'=>'b');

if ($a = $x == false) {
    echo 'a';
}

var_dump($a);

输出:

布尔假

然后,我在分配的周围加上圆括号:

代码语言:javascript
复制
$x = (object)array('a'=>'b');


if (($a = $x) == false) {
    echo 'a';
}

var_dump($a);

输出:

对象(StdClass)1公共'a‘=> string 'b’(length=1)

因此,您需要在分配给$res时加上括号。

代码语言:javascript
复制
if(($res = $db->prepare($sql2)) == FALSE) 

因为按照您的方式,您错误地将$res重新分配到FALSE,并且对象丢失了。

票数 3
EN

Stack Overflow用户

发布于 2014-01-27 11:51:44

在第一个示例中,您正在检查db-> object是否有效,如果没有,则使用$res,因为它没有初始化,所以现在它不是一个对象。在第二个示例中,首先声明并初始化它。

票数 1
EN

Stack Overflow用户

发布于 2014-01-27 11:53:04

在文件中:

mysqli_stmt_init -初始化语句并返回用于mysqli_stmt_prepare的对象

在您的prev代码中,您没有初始化。在初始化后的第二个代码片段中,它工作了。

链接:http://www.php.net/manual/en/mysqli.stmt-init.php

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21380074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档