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

Все примеры, которые я вижу с помощью 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 

Я не верю, что интерфейс работает так.

Исходя из документации и примеров ( 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 .

Это код, который я использую для создания объекта из подготовленного оператора.
Его можно было бы использовать в подклассе 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(); 

Расширение внутреннего драйвера MySql ( mysqlnd ) имеет метод get_result :

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