Php 当相同的常规查询成功时,MySQLi prepared语句失败

Php 当相同的常规查询成功时,MySQLi prepared语句失败,php,mysql,sql,mysqli,prepared-statement,Php,Mysql,Sql,Mysqli,Prepared Statement,我有一个很好的常规查询,如下所示: $result = $mysqli->query("SELECT value FROM activities WHERE name = 'Drywall'"); $stmt = $mysqli->prepare("SELECT value FROM activities WHERE name = 'Drywall'"); $stmt->execute(); $res = $stmt->get_result(); $row = $res

我有一个很好的常规查询,如下所示:

$result = $mysqli->query("SELECT value FROM activities WHERE name = 'Drywall'");
$stmt = $mysqli->prepare("SELECT value FROM activities WHERE name = 'Drywall'");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();
这将成功返回一行。但是,为了诊断准备语句的问题,我尝试了与准备语句相同的查询,如下所示:

$stmt = $mysqli->prepare("SELECT value FROM activities WHERE name = 'Drywall'");
$stmt->execute();

尽管这些是相同的查询字符串,$stmt->num\u行始终为0。为什么常规查询可以工作,而准备好的语句却不能工作,因为它们是相同的精确查询?此外,我意识到在准备好的查询字符串中包含“Drywall”与准备好的语句的目的背道而驰,但我只是想消除bind_param()是罪魁祸首的可能性。因此,我使用bind_param()来填充占位符,这也不起作用,尽管我在运行时仔细检查了绑定的变量是否包含正确的值。

检查mysqli->prepare是否正确使用。函数取决于要传递的参数。这与传递值不同​​直接在查询中,但可以使用另一种方式
验证手册:

您是否尝试过这样的方法:

$result = $mysqli->query("SELECT value FROM activities WHERE name = 'Drywall'");
$stmt = $mysqli->prepare("SELECT value FROM activities WHERE name = 'Drywall'");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();
附言:

准备好的陈述很好。我会敦促你经常考虑使用它们。


但是在这种情况下,一个简单的查询将比一个准备好的语句更有效率(需要更少的往返)

$stmt->store_result();
电话前

$stmt->num_rows();

有关$stmt->num_rows()(),请参阅手册中描述符的最后一行。

您可以直接将参数传递给准备好的语句,或在执行之前在查询构造中显式指定的参数。感谢提供详细信息。根据文档,查询字符串“可以通过在适当位置嵌入问号(?)字符在SQL语句中包含一个或多个参数标记。”因此它不必包含参数标记。虽然正如我在OP中所说,我一开始就已经这样做了,但它不起作用。
num_rows
方法不可靠,如果您没有从stmt句柄获取所有(或任何)行。第一行代码中的
query
方法使用默认的
MYSQLI\u STORE\u RESULT
行为调用,该行为获取所有行。使用
store\u result
方法或获取所有行,对准备好的语句执行等效操作。之后,调用
num_rows
方法。(
num_rows
并不神奇。它实际上只是获取的行的计数。您可以执行循环获取行并增加您自己的行计数器变量,您将得到一个等效的结果。)您需要使用准备好的语句添加另一行,使其与第一行代码等效:
$result=$stmt->store_result()不幸的是,get_result()在我的服务器上似乎不起作用。它安装了PHP5.3.6,这应该是最新的,但我已经在文档中看到,它只在原生MySQL驱动程序中可用,所以我的服务器不能运行该驱动程序。不过我敢打赌这会解决我的问题。另外,关于在这种情况下使用准备好的陈述,是的,这只是一个用于诊断目的的简化测试。在我的实际案例中,我必须防范SQL注入攻击。我相信我的问题不是首先调用store_result()或fetch()。我相信这两种方法都能解决问题。谢谢