我使用mysqli_fetch_object看到的所有示例都使用mysql_query()
,我无法使用预处理语句。有没有人知道这段代码有什么问题,因为fetch_object返回null。
$sql = "select 1 from dual";
printf("preparing %s\n", $sql);
$stmt = $link->prepare($sql);
printf("prepare statement %s\n", is_null($stmt) ? "is null" : "created");
$rc = $stmt->execute();
printf("num rows is %d\n", $stmt->num_rows);
$result = $stmt->result_metadata();
printf("result_metadata %s\n", is_null($result) ? "is null" : "exists");
$rc = $result->fetch_object();
printf("fetch object returns %s\n", is_null($rc) ? "NULL" : $rc);
$stmt->close();
输出结果为:
preparing select 1 from dual
prepare statement created
num rows is 0
result_metadata exists
fetch object returns NULL
答案 0 :(得分:11)
这是我用来从预准备语句创建对象的代码。
它可能用在mysqli的子类中?
$query = "SELECT * FROM category WHERE id = ?";
$stmt = $this->_db->prepare($query);
$value = 1;
$stmt->bind_param("i", $value);
$stmt->execute();
// bind results to named array
$meta = $stmt->result_metadata();
$fields = $meta->fetch_fields();
foreach($fields as $field) {
$result[$field->name] = "";
$resultArray[$field->name] = &$result[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $resultArray);
// create object of results and array of objects
while($stmt->fetch()) {
$resultObject = new stdClass();
foreach ($resultArray as $key => $value) {
$resultObject->$key = $value;
}
$rows[] = $resultObject;
}
$stmt->close();
答案 1 :(得分:9)
MySql本机驱动程序扩展程序(mysqlnd)具有get_result方法:
$stmt->execute();
$obj = $stmt->get_result()->fetch_object();
答案 2 :(得分:0)
我不相信界面就是这样的。
通过文档和示例(http://www.php.net/manual/en/mysqli.prepare.php),似乎$ stmt-> execute()不返回结果集,而是返回表示成功/失败(http://www.php.net/manual/en/mysqli-stmt.execute.php)的布尔值。要实际获得结果,您需要使用$ stmt-> bind_result(http://www.php.net/manual/en/mysqli-stmt.bind-result.php)将变量绑定到结果集(在执行调用之后)。
完成所有操作后,您可以重复调用$ stmt-> fetch()(),以使用当前行的列值填充绑定变量。我没有看到任何提及$ stmt-> fetch_object(),也没有看到该接口如何与所描述的变量绑定方案一起工作。
所以这是从mysqli准备的声明中获取“正常”结果的故事。
在你的代码中,有一些我怀疑是错误的,或者至少我不确定你是否打算这样做。 你排队:
$result = $stmt->result_metadata();
将结果集元数据(本身表示为结果集)分配给$ result变量。根据doc(http://www.php.net/manual/en/mysqli-stmt.result-metadata.php),你只能在这些'特殊'类型的结果集上使用方法的子集,而fetch_object()不是其中之一(至少它没有明确列出)。
对于这些元数据结果集,可能没有实现fetch_object()的错误,也许你应该在bugs.mysql.com 处提交一个关于该错误的错误。