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

BeW*_*ned 9 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();
Run Code Online (Sandbox Code Playgroud)

输出是:

preparing select 1 from dual
prepare statement created
num rows is 0
result_metadata exists
fetch object returns NULL
Run Code Online (Sandbox Code Playgroud)

Zor*_*ing 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();
Run Code Online (Sandbox Code Playgroud)


小智 9

MySql Native Driver扩展(mysqlnd),具有get_result方法:

$stmt->execute();
$obj = $stmt->get_result()->fetch_object();
Run Code Online (Sandbox Code Playgroud)

  • 警告:这仅在您使用`mysqlnd`驱动程序时才有效 (3认同)

Rol*_*man 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();
Run Code Online (Sandbox Code Playgroud)

将结果集元数据(本身表示为结果集)分配给 $result 变量。根据文档(http://www.php.net/manual/en/mysqli-stmt.result-metadata.php),您只能在这些“特殊”类型的结果集上使用方法的子集,并且 fetch_object( ) 不是其中之一(至少没有明确列出)。

也许这些元数据结果集没有实现 fetch_object() 是一个错误,也许您应该在bugs.mysql.com上提交有关该错误的错误。