Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
准备好的声明不适用于;选择";命令,在PHP中使用mysqli_Php_Mysql_Mysqli - Fatal编程技术网

准备好的声明不适用于;选择";命令,在PHP中使用mysqli

准备好的声明不适用于;选择";命令,在PHP中使用mysqli,php,mysql,mysqli,Php,Mysql,Mysqli,我已经能够使用mysqli(在PHP中)执行多个准备好的语句。 但是,由于某些原因,当我尝试运行“SELECT”命令时,准备好的语句总是会遇到错误。 例如,以下行将成功: $stmt=$mysqli->prepare("UPDATE events SET category='m' WHERE id=(?)"); 但是,以下行将失败: $stmt=$mysqli->prepare("SELECT * FROM events WHERE id=(?)"); 当我说fail时,我的意思

我已经能够使用mysqli(在PHP中)执行多个准备好的语句。 但是,由于某些原因,当我尝试运行“SELECT”命令时,准备好的语句总是会遇到错误。 例如,以下行将成功:

$stmt=$mysqli->prepare("UPDATE events SET category='m' WHERE id=(?)");
但是,以下行将失败:

$stmt=$mysqli->prepare("SELECT * FROM events WHERE id=(?)");
当我说fail时,我的意思是接下来的三行将为UPDATE命令返回1(表示一行已更改)

接下来的三行将为SELECT返回0:

$stmt->bind_param('i',$id);
$stmt->execute();
echo $stmt->num_rows;

作为记录,我知道准备好的陈述对于单个选择来说并没有那么有效——这个问题主要是学术性的。

如果你这样做,你会得到什么

echo $stmt->num_rows;
不能对SELECT语句使用受影响的行方法

此函数(受影响的行)仅适用于更新表的查询。要从SELECT查询中获取行数,请改用mysqli_stmt_num_rows()

确保先存储结果

$stmt->execute();

/* store result */
$stmt->store_result();

printf("Number of rows: %d.\n", $stmt->num_rows);

返回受上次插入、更新、替换或删除查询影响的行数


谢谢-我得到一个0。这是不应该发生的-我希望是1。请看我上面的答案,您需要存储结果以获得非零。将$stmt->infected_行替换为$stmt->num_行作为SELECT命令将得到0。因此,这仍然不能解决问题-我希望是1。
我知道,准备好的语句对于单个SELECT来说并没有那么有效
-是谁建议的?它们的效率不比任何SQL查询高,也不比任何SQL查询低,而SQL查询在许多博客中似乎是经常出现的观点。这种说法是因为您必须与MySQL服务器进行两次通信(一次是使用准备好的语句,第二次是使用实际参数),所以这种双重通信会导致性能损失。您认为这是错误的吗?是execute函数将语句和绑定变量发送到MySQL,而不是两个单独的步骤。MySQL将识别它是一个准备好的语句,并检查它的编译语句缓存。如果该语句已经在缓存中,它将加载并使用它;如果不是,则它将编译语句并将其存储在已编译语句缓存中。然后它将把绑定变量添加到它的执行中。。。。。对于语句和bind变量,仍然只有一次与数据库服务器的通信,而不是每个变量都有一次单独的通信。对于伟大的答案,我认为最好的方法是按照这里的示例绑定结果并获取
$stmt->execute();

/* store result */
$stmt->store_result();

printf("Number of rows: %d.\n", $stmt->num_rows);