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

时间:2009-08-08 11:18:54

标签: php sql mysqli

我创建了这段代码:

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

print_r( $object );

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

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

3 个答案:

答案 0 :(得分:5)

来自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);

答案 1 :(得分:3)

如果您尝试从数据库中获取行,则您需要的功能是mysqli_stmt::fetch(),而不是mysqli_stmt::fetch_metadata()

你也错过了几个步骤。使用预准备语句时,必须指定要返回的字段而不是使用星形通配符,然后使用mysqli_stmt::bind_result()指定应将数据库字段放入哪些变量。

如果您对原始MySQL扩展更熟悉,则预准备语句具有不同的使用过程。如果你的select语句有一个参数(例如,“WHERE value =?”),那么绝对建议使用预编译语句,但是对于你的简单查询,mysqli:query()就足够了,mysql_query()的过程也就不一样了。 }}

答案 2 :(得分:1)

我认为问题是mysqli_stmt::result_metadata()返回mysqli_result对象而没有任何实际结果 - 它只保存元数据。

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

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