Действительно ли возможно использовать mysqli_fetch_object с подготовленным оператором

Все примеры я вижу использование mysqli_fetch_object использование mysql_query(), Я не могу заставить это работать с подготовленными операторами. Делает любой знает что не так с этим фрагментом кода, как fetch_object пустой указатель возвратов.

$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
9
задан BeWarned 29 December 2009 в 19:28
поделиться

2 ответа

Не думаю, что интерфейс так работает.

Просматривая документацию и примеры (http://www.php.net/manual/en/mysqli.prepare.php), кажется, что $stmt->execute() не возвращает resultet, а булевую индикацию успеха/неудачи (http://www.php.net/manual/en/mysqli-stmt.execute.php). Чтобы действительно получить результат, необходимо привязать переменные к resultetу (после вызова выполнения) с помощью $stmt->bind_result (http://www.php.net/manual/en/mysqli-stmt.bind-result.php).

После того, как вы сделали все это, вы можете сделать повторные вызовы $stmt->fetch()(), чтобы заполнить связанные переменные значениями столбцов из текущей строки. Я не вижу ни упоминания о $stmt->fetch_object(), ни того, как этот интерфейс мог бы работать со схемой привязки переменных, как описано выше.

Итак, это история получения "нормального" результата от подготовленных mysqli statments.

В вашем коде есть что-то, что, как я подозреваю, является ошибкой, или, по крайней мере, я не уверен, что вы собирались это сделать. В строке:

$result = $stmt->result_metadata();

присваивает переменной $result метаданные результирующего результата, которая сама по себе представлена в виде результирующего результата. Согласно doc (http://www.php.net/manual/en/mysqli-stmt.result-metadata.php) вы можете использовать только подмножество методов на этих "специальных" типах результирующих множеств, и fetch_object() не является одним из них (по крайней мере, она не указана явно).

Возможно, это ошибка, что fetch_object() не реализована для этих результирующих множеств метаданных, возможно, вам стоит написать об этом ошибку на bgs.mysql.com .

.
0
ответ дан 4 December 2019 в 10:32
поделиться

Этот код я использую для создания объекта из подготовленного оператора.
Возможно, его можно использовать в подклассе микли?

    $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();
11
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: