Как получить все в массиве assoc из подготовленного оператора?

Я пробую этот код:

if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?")) { $result->bind_param("i",$id); $result->execute(); while ($data = $result->fetch_assoc()) { $statistic[] = $data; } echo "<pre>"; var_dump($statistic); echo "</pre>"; } 

но это вызывает следующую ошибку

[Пт Июн 15 12:13:11 2012] [ошибка] [клиент 127.0.0.1] PHP Неустранимая ошибка: вызов неопределенного метода mysqli_stmt :: fetch_assoc () в [myfile.php]

А также я пробовал:

 if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?")) { $result->bind_param("i",$id); $rows = $result->execute(); while ($data = $rows->fetch_assoc()) { $statistic[] = $data; } echo "<pre>"; var_dump($statistic); echo "</pre>"; } 

что делает это:

[Пт Июн 15 12:22:59 2012] [ошибка] [клиент 127.0.0.1] PHP Неустранимая ошибка: вызов функции-члена fetch_assoc () для не-объекта в [myfile.php]

Что еще я могу сделать для получения результата или того, что я делаю неправильно? Мне нужен массив-член из БД, похожий на $data[0]["id"] = 1

Мой оригинальный ответ был НЕПРАВИЛЬНО! но в конце я оставляю оригинальный ответ в качестве примера того, почему вы не должны слушать все, что я говорю, когда-либо.

На самом деле вы можете сделать это довольно легко, вы просто не можете сделать это с mysqli_stmt объекта mysqli_stmt , вам нужно извлечь основной mysqli_result , вы можете сделать это, просто вызвав mysqli_stmt::get_result() . Примечание: для этого требуется расширение mysqlnd (MySQL Native Driver), которое не всегда доступно.

Тем не менее, ниже приводится рекомендация PDO по MySQLi, и это является ярким примером того, почему: API-интерфейс MySQLi не имеет смысла. Мне потребовалось несколько лет с перерывами в работе с MySQLi, чтобы я открыл механизм, описанный выше. Теперь я признаю, что разделение формулировки и понятий конечного набора имеет смысл, но в этом случае почему оператор имеет метод fetch() ? Пища для размышлений (если вы все еще сидите на заборе между MySQLi и PDO).

Для полноты, вот образец кода, основанный (свободно) на исходном коде в вопросе:

 // Create a statement $query = " SELECT * FROM `mytable` WHERE `rows1` = ? "; $stmt = $this->mysqli->prepare($query); if (!$stmt) { // handle error } // Bind params and execute $stmt->bind_param("i", $id); if (!$stmt->execute()) { // handle error } // Extract result set and loop rows $result = $stmt->get_result(); while ($data = $result->fetch_assoc()) { $statistic[] = $data; } // Proof that it's working echo "<pre>"; var_dump($statistic); echo "</pre>"; 

Оригинальный ответ ниже:


Операторы, подготовленные MySQLi, не позволяют использовать традиционные механизмы типа fetch_array() для получения результатов. mysqli_stmt::bind_result() этого вы должны использовать mysqli_stmt::bind_result() для заполнения переменных отдельными полями при вызове mysqli_stmt::fetch() .

Это становится еще более сложным и долговечным, если вы хотите SELECT * , так как может быть неопределенное количество возвращенных полей. Эта тема была рассмотрена ранее на SO, поэтому я не буду писать ее снова, вместо этого я просто буду направлять вас сюда для решения.

IMHO это серьезное ограничение MySQLi, и это основная причина, по которой я рекомендую PDO_mysql .

Ты можешь сделать:

 $conn = mysqli_connect('host','username','password','database') $query = 'select * from tablename'; $result = $conn->query($query); $data = mysqli_fetch_all($result,MYSQLI_ASSOC); 

$data содержит весь результат в массиве.

* Следует отметить, что эта mysqli_fetch_all() работает только с пакетом mysqlnd . http://php.net/manual/en/mysqli-result.fetch-all.php

не пробовал, но изменил условие цикла во время следующего теста и снова проверил

$data = $result->fetch()

благодаря

Метод execute () возвращает TRUE или FALSE, а не набор результатов, и поэтому метод fetch_assoc нельзя использовать, поскольку он не существует в буле. Что вам нужно

 mysqli_fetch_assoc($result); //Use in association with query(); 

Если хотите, я могу отправить вам пример кода. Надеюсь это поможет.

Это всего лишь образец:

 class admin{ public static function admin($con){ $users = $con -> query("SELECT * FROM felhasznalok"); $show = $users-> fetch_all(MYSQLI_ASSOC); return $show; } } $con = new mysqli("localhost", "root", "", "teszt"); $s = admin::admin($con); echo "<table > "; if (is_array($s)) { foreach ($s as $key => $value) { echo "<tr>"; foreach ($value as $key2 => $value2) { echo "<td><strong>$key2: </strong> $value2</td>"; } echo "</tr>"; } echo "</table>"; } ?>