Я пробую этот код:
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>"; } ?>