【发布时间】:2014-10-03 14:19:10
【问题描述】:
我已经能够使用 mysqli(在 PHP 中)执行多个准备好的语句。 但是,由于某种原因,当我尝试运行“SELECT”命令时,准备好的语句总是会遇到错误。 比如下面这行就成功了:
$stmt=$mysqli->prepare("UPDATE events SET category='m' WHERE id=(?)");
但是,以下行将失败:
$stmt=$mysqli->prepare("SELECT * FROM events WHERE id=(?)");
当我说失败时,我的意思是接下来的三行将为 UPDATE 命令返回 1(表示更改了一行)...
$stmt->bind_param('i',$id);
$stmt->execute();
echo $stmt->affected_rows;
接下来的三行将为 SELECT 返回 0:
$stmt->bind_param('i',$id);
$stmt->execute();
echo $stmt->num_rows;
作为记录,我知道准备好的语句对于单个 SELECT 来说效率不高 - 这个问题主要是学术性的。
【问题讨论】:
-
用 $stmt->num_rows 代替 SELECT 命令的 $stmt->affected_rows 得到 0。所以这仍然不能解决问题 - 我期待 1。
-
I'm aware that prepared statements aren't that efficient for a single SELECT- 谁在暗示?它们的效率不亚于任何 SQL 查询 -
这似乎是许多博客中反复出现的观点。声称是由于您必须与 MySQL 服务器通信两次(一次使用准备好的语句,然后第二次使用实际参数),因此双程会产生性能成本。你认为这是不正确的吗?
-
执行函数将 Statement 和 Bind Vars 都发送到 MySQL,而不是两个单独的步骤。 MySQL 将识别它是一个准备好的语句并检查它的编译语句缓存。如果语句已经在缓存中,它将加载并使用它;如果没有,那么它将编译该语句并将其存储在已编译的语句缓存中。然后它将绑定变量添加到它的执行中......对于语句和绑定变量,仍然只有一个与数据库服务器的通信,而不是每个单独的通信
-
感谢您的精彩回答