Почему этот оператор подготовки не работает в MYSQLI? - PullRequest
0 голосов
/ 08 августа 2009

Я создал этот код:

$statement = $db->prepare("SELECT * FROM phptech_contact");
$statement->execute();
$result = $statement->result_metadata();
$object = $result->fetch_object();

print_r( $object );

Когда я запускаю его, он не работает. Кто-нибудь может сказать мне, почему это не работает?

В этой таблице 20 строк, поэтому данные должны быть возвращены.

Ответы [ 3 ]

5 голосов
/ 08 августа 2009

С http://ch.php.net/manual/en/mysqli-stmt.result-metadata.php

Note: The result set returned by mysqli_stmt_result_metadata() contains only metadata. It does not contain any row results. The rows are obtained by using the statement handle with mysqli_stmt_fetch().

Пока вам не нужны эти метаданные, вам не нужно вызывать этот метод.

$statement = $db->prepare("SELECT fld1, fld2 FROM phptech_contact");
$statement->execute();
$stmt->bind_result($fld1, $fld2);

while ($stmt->fetch()) {
    echo "$fld1 and $fld2<br />";
}

Но мне действительно не нравится расширение mysqli. PDO намного круче ...; -)

$db = new PDO('...');
$stmt = $db->prepare("SELECT fld1, fld2 FROM phptech_contact");
$stmt->execute();

while ($obj = $stmt->fetchObject()) {
    // ...
}

или

$objs = stmt->fetchAll(PDO::FETCH_OBJ);
3 голосов
/ 08 августа 2009

если вы пытаетесь получить строки из базы данных, вам нужна функция mysqli_stmt::fetch(), а не mysqli_stmt::fetch_metadata()

Вы также пропустили несколько шагов. При использовании подготовленных операторов вы должны указать поля, которые вы хотите вернуть, вместо использования подстановочного знака «звезда», а затем использовать mysqli_stmt::bind_result(), чтобы указать, в какие переменные должны быть помещены поля базы данных.

Если вы более знакомы с исходным расширением MySQL, подготовленные операторы могут использовать другой процесс. Если ваш оператор выбора имеет параметр (например, «WHERE value =?»), То подготовленные операторы определенно рекомендуются, но для вашего простого запроса будет достаточно mysqli:query(), и он не будет сильно отличаться от процесса из mysql_query()

1 голос
/ 08 августа 2009

Я считаю, что проблема в том, что <a href="http://us2.php.net/manual/en/mysqli-stmt.result-metadata.php" rel="nofollow noreferrer">mysqli_stmt::result_metadata()</a> возвращает объект mysqli_result без каких-либо реальных результатов & mdash; он содержит только метаданные.

Итак, вы хотите использовать $result = $statement->bind_result(...), а затем повторно вызывать $result->fetch() для получения результатов.

В одном из комментариев к статье bind-result () показано, как это сделать для запроса, подобного вашему , где вы не обязательно знаете все возвращаемые столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...