0

我创建了这段代码:

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

print_r( $object );

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

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

4

3 回答 3

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);
于 2009-08-08T11:43:53.180 回答
3

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

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

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

于 2009-08-08T11:53:03.443 回答
1

我认为问题在于mysqli_stmt::result_metadata()返回一个mysqli_result没有任何实际结果的对象——它只保存元数据。

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

bind-result() 文章下的评论之一显示了如何对像 yours 这样的查询执行此操作,您不一定知道要返回的所有列。

于 2009-08-08T11:50:01.997 回答