sql >> Databáze >  >> RDS >> Mysql

Jak používat mysqli_query() v PHP?

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.

  1. 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);
    
  2. 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žívat mysqli_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();



  1. Konverze časového pásma v dotazu SQL

  2. Neplatný text JSON v argumentu 2 - json_contains v MySQL 5.7.8

  3. Jak získat století z data v Oracle

  4. Funkce TANH() v Oracle