【问题标题】:Is it possible to use mysqli_fetch_object with a prepared statement是否可以将 mysqli_fetch_object 与准备好的语句一起使用
【发布时间】:2010-12-30 21:23:36
【问题描述】:

我看到的所有使用 mysqli_fetch_object 的示例都使用 mysql_query(),我无法让它与准备好的语句一起使用。有谁知道这段代码 sn-p 有什么问题,因为 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

【问题讨论】:

  • 如果您期望返回一个非空对象,那么 num 行肯定应该 > 0?

标签: php mysqli


【解决方案1】:

这是我用来从准备好的语句创建对象的代码。
或许可以用在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();

【讨论】:

    【解决方案2】:

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

    $stmt->execute();
    $obj = $stmt->get_result()->fetch_object();
    

    【讨论】:

    • 这是一个不错的解决方案;让您检索结果 OO 样式与 $obj->db_field_name; 等,正是我正在寻找的,谢谢。
    • 警告:这仅在您使用 mysqlnd 驱动程序时有效
    【解决方案3】:

    我不相信界面会这样工作。

    按照文档和示例 (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 变量。根据文档 (http://www.php.net/manual/en/mysqli-stmt.result-metadata.php),您只能在这些“特殊”类型的结果集上使用方法的子集,而 fetch_object() 不是其中之一(至少没有明确列出)。

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

    【讨论】:

    • 我想使用 fetch_object 所以我不必定义一个类并显式绑定成员变量。我将尝试为准备好的语句创建自己的 fetch_object。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多