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