Трябва да призная, mysqli_query()
ръчното въвеждане не съдържа чист пример за това как да извлечете няколко реда. Може би защото рутината е толкова рутинна, позната на PHP хората от десетилетия:
$result = $link->query("DESCRIBE students");
while ($row = $result->fetch_assoc()) {
// to print all columns automatically:
foreach ($row as $value) {
echo "<td>$value</td>";
// OR to print each column separately:
echo "<td>",$row['Field'],"</td><td>",$row['Type'],"</td>\n";
}
}
В случай, че искате да отпечатате заглавията на колоните, първо трябва да изберете данните си във вложен масив и след това да използвате клавишите на първия ред:
// getting all the rows from the query
// note that handy feature of OOP syntax
$data = $link->query("DESC students")->fetch_all(MYSQLI_ASSOC);
// getting keys from the first row
$header = array_keys(reset($data));
// printing them
foreach ($header as $value) {
echo "<td>$value</td>";
}
// finally printing the data
foreach ($data as $row) {
foreach ($row as $value) {
echo "<td>$value</td>";
}
}
Някои хостове може да нямат поддръжка за fetch_all()
функция. В такъв случай попълнете $data
подредете по обичайния начин:
$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
$data[] = $row;
}
Две важни бележки, които трябва да добавя.
-
Трябва да конфигурирате mysqli да хвърля грешки автоматично, вместо да ги проверявате ръчно за всеки израз на mysqli. За да направите това, добавете този ред преди
mysqli_connect()
:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
-
Най-важната забележка: за разлика от
mysql_query()
,mysqli_query()
има много ограничена употреба. Можете да използвате тази функция само ако в заявката няма да се използват променливи. Ако ще се използва някаква PHP променлива, никога не трябва да използватеmysqli_query()
, но винаги се придържайте към подготвени изявления , като това:$stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?"); $stmt->bind_param('i', $class); $stmt->execute(); $data = $stmt->get_result()->fetch_all();
Малко е многословно, трябва да призная. За да намалите количеството код, можете да използвате PDO или да приемете проста помощна функция за да извършите цялата подготовка/свързване/изпълнение вътре:
$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();