是否可以将mysqli_fetch_object与预准备语句一起使用

时间:2009-12-29 19:28:19

标签: php mysqli

我使用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

3 个答案:

答案 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 处提交一个关于该错误的错误。