为啥这个准备语句在 MYSQLI 中不起作用?

Posted

技术标签:

【中文标题】为啥这个准备语句在 MYSQLI 中不起作用?【英文标题】:Why doesn't this prepare statement work in MYSQLI?为什么这个准备语句在 MYSQLI 中不起作用? 【发布时间】:2009-08-08 11:18:54 【问题描述】:

我创建了这段代码:

$statement = $db->prepare("SELECT * FROM phptech_contact");
$statement->execute();
$result = $statement->result_metadata();
$object = $result->fetch_object();

print_r( $object );

当我运行它时,它不起作用。谁能告诉我为什么它不起作用?

我在这个表中有 20 行,所以应该返回数据。

【问题讨论】:

【参考方案1】:

来自http://ch.php.net/manual/en/mysqli-stmt.result-metadata.php

Note: The result set returned by mysqli_stmt_result_metadata() contains only metadata. It does not contain any row results. The rows are obtained by using the statement handle with mysqli_stmt_fetch().

只要你不需要这个元数据,你就不需要调用这个方法。

$statement = $db->prepare("SELECT fld1, fld2 FROM phptech_contact");
$statement->execute();
$stmt->bind_result($fld1, $fld2);

while ($stmt->fetch()) 
    echo "$fld1 and $fld2<br />";

但我真的不喜欢 mysqli 扩展。 PDO 更酷... ;-)

$db = new PDO('...');
$stmt = $db->prepare("SELECT fld1, fld2 FROM phptech_contact");
$stmt->execute();

while ($obj = $stmt->fetchObject()) 
    // ...

$objs = stmt->fetchAll(PDO::FETCH_OBJ);

【讨论】:

闭嘴我像你一样“$fld1”和“$fld2”我想如果我选择* out。 :) 是的,PDO 很容易,我知道我在 bot 之前使用 PDO 我现在尝试 mysqli bot 我可以确定我可能不想去 MySQLi bot 去 PDO。 :) 大量寻求帮助。 PDO 是两者中更现代的一种。如今,通常没有理由使用其他任何东西。【参考方案2】:

如果你想从数据库中获取行,你需要的函数是mysqli_stmt::fetch(),而不是mysqli_stmt::fetch_metadata()

您还缺少几个步骤。使用prepared statements时,必须指定要返回的字段,而不是使用星号通配符,然后使用mysqli_stmt::bind_result()指定数据库字段应该放在哪些变量中。

如果您更熟悉原始 MySQL 扩展,则准备好的语句可以使用不同的过程。如果你的select语句有参数(例如,“WHERE value=?”)prepared statements肯定是推荐的,但是对于你的简单查询,mysqli:query()就足够了,和mysql_query()的过程差别不大

【讨论】:

【参考方案3】:

我认为问题在于 @987654321@ 返回一个 mysqli_result 对象,没有任何实际结果——它只保存元数据。

所以你要做的是use $result = $statement-&gt;bind_result(...),然后反复调用$result-&gt;fetch()得到结果。

One of the comments under the bind-result() article shows how to do this for a query like yours,您不一定知道要返回的所有列。

【讨论】:

以上是关于为啥这个准备语句在 MYSQLI 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥此语句在 java x ^= y ^= x ^= y 中不起作用;

为啥这个下拉菜单在 IE 中不起作用?

新的 mysqli 连接在我的 Cpanel 中不起作用,但在我的计算机中起作用 [重复]

为啥这个切换按钮在颤振 - 飞镖中不起作用?

为啥这个 SVG 在 EPUB 文件中不起作用

为啥这个嵌套的 SVG 在 Firefox 中不起作用?