Php mysqli::prepare()与mysqli_stmt::prepare()的比较

Php mysqli::prepare()与mysqli_stmt::prepare()的比较,php,mysqli,Php,Mysqli,我使用以下代码对准备好的语句进行查询: 我使用的是mysqli::prepare(),而不是mysqli_stmt::prepare(),因此不必初始化$res。它由mysqli::prepared返回 达到该代码时,出现以下错误: Call to a member function bind_param() on a non-object 我寻找答案,但是所有的问题在SQL查询字符串中都有错误,或者它们没有释放以前的结果。他们都没有帮我,所以我试着改变一些事情。我将代码更改为: $sql2

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

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

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 . ']');
}

您正在检查db->prepare是否在第一个示例中起作用,如果它不起作用,则无论如何都要使用$res,它现在不是一个对象,因为它没有初始化。
在第二个示例中,您首先声明并初始化它。

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

在文档中:

mysqli_stmt_init-初始化一条语句并返回一个对象以供mysqli_stmt_使用

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

链接:

在文档中:

mysqli_stmt_init-初始化一条语句并返回一个对象以供mysqli_stmt_使用

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


链接:

正如我们在注释中所讨论的,它可能是
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”=>字符串“b”(长度=1)

因此,您需要在$res的赋值周围加上括号

if(($res = $db->prepare($sql2)) == FALSE) 

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

,正如我们在注释中所讨论的,在
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”=>字符串“b”(长度=1)

因此,您需要在$res的赋值周围加上括号

if(($res = $db->prepare($sql2)) == FALSE) 


因为您的方式,您错误地将$res重新分配给
FALSE
,并且对象已丢失

我们可以看到您的$db对象是如何声明的吗我们可以看到您的$db对象是如何声明的吗编辑是真的,但分配没有完成,无论是真是假
$res=…
是$db->stm_init()在哪里;在第一个示例中,我被混淆了,在第一个示例中,不需要
init
也不需要stmt_init()。mysqli_stmt对象是由mysqli::prepare()返回的。@Sorin true,我首先想到了这一点,但后来弄糊涂了,到底是哪一个返回了实际需要的对象。但是,在
if()
语句之后,
var\u dump($res)
说了什么?如果
If
中的赋值完成,可能以后准备失败,或者没有构建正确的对象。这是真的,但赋值没有完成,不管是真是假
$res=…
is$db->stmt_init()在哪里;在第一个示例中,我被混淆了,在第一个示例中,不需要
init
也不需要stmt_init()。mysqli_stmt对象是由mysqli::prepare()返回的。@Sorin true,我首先想到了这一点,但后来弄糊涂了,到底是哪一个返回了实际需要的对象。但是,在
if()
语句之后,
var\u dump($res)
说了什么?如果
If
中的分配完成,可能以后准备失败,或者没有构建正确的对象。他确实有
$res=$db->prepare($sql2)
,根据准备文档(
If($stmt=$mysqli->prepare(“从城市中选择地区,名称=?”){
)可以吗?如果你在php站点上看到这个链接,它们首先已经初始化。prepare是在初始化之后使用的。对,我第一次没有看到这个。很抱歉,itI在这里没有提到需要
init
。我没有使用mysqli_stmt::prepare(),但是mysqli::prepare(),它返回一个mysqli_stmt对象。这样,不需要初始化。我编辑了帖子并在那里放了一个链接。他确实有
$res=$db->prepare($sql2)
,根据prepare docs(
if($stmt=$mysqli->prepare(“从城市中选择地区,名称=?”){
)可以吗?如果你在php站点上看到这个链接,它们首先已经初始化。prepare是在初始化之后使用的。对,我第一次没有看到这个。很抱歉,itI在这里没有提到需要
init
。我没有使用mysqli_stmt::prepare(),但是mysqli::prepare(),它返回一个mysqli_stmt对象。这样,不需要初始化。我编辑了文章并在那里放置了一个链接。你是对的。我放了括号,第一个版本可以工作。我在这里也选中了:,并且==运算符的优先级高于=。谢谢!!你是对的。我放了括号,第一个版本可以工作。我也在这里选中了:,并且==运算符的优先级高于=。谢谢!!