Musím přiznat, že mysqli_query()
ruční zadání neobsahuje čistý příklad, jak načíst více řádků. Možná je to proto, že rutina je tak rutinní, známá lidem s PHP po celá desetiletí:
$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";
}
}
V případě, že chcete vytisknout názvy sloupců, musíte nejprve vybrat svá data do vnořeného pole a poté použít klávesy prvního řádku:
// 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>";
}
}
Někteří hostitelé nemusí mít podporu pro fetch_all()
funkce. V takovém případě vyplňte $data
pole obvyklým způsobem:
$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
$data[] = $row;
}
Musím přidat dvě důležité poznámky.
-
Musíte nakonfigurovat mysqli tak, aby automaticky vyvolávalo chyby, místo abyste je kontrolovali pro každý příkaz mysqli ručně. Chcete-li tak učinit, přidejte tento řádek před
mysqli_connect()
:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
-
Nejdůležitější poznámka: na rozdíl od
mysql_query()
,mysqli_query()
má velmi omezené použití. Tuto funkci můžete použít pouze pokud v dotazu nebudou použity žádné proměnné. Pokud se má použít jakákoli proměnná PHP, nikdy byste neměli používatmysqli_query()
, ale vždy se držte připravených prohlášení , takto:$stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?"); $stmt->bind_param('i', $class); $stmt->execute(); $data = $stmt->get_result()->fetch_all();
Je to trochu rozvláčné, musím uznat. Chcete-li snížit množství kódu, můžete buď použít PDO, nebo přijmout jednoduchou pomocnou funkci dělat veškerou přípravu/svazování/provádění činností uvnitř:
$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();