Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment utiliser mysqli_query() en PHP ?

Je dois admettre, mysqli_query() l'entrée manuelle ne contient pas d'exemple propre sur la façon de récupérer plusieurs lignes. C'est peut-être parce que la routine est tellement routinière, connue des gens de PHP depuis des décennies :

$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";
    }
}

Si vous souhaitez imprimer les titres des colonnes, vous devez d'abord sélectionner vos données dans un tableau imbriqué, puis utiliser les clés de la première ligne :

// 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>";
    }
}

Certains hôtes peuvent ne pas prendre en charge le fetch_all() une fonction. Dans ce cas, remplissez le champ $data tableau de la manière habituelle :

$data = [];
$result = $link->query("DESC students");
while ($row = $result->fetch_assoc())
{
    $data[] = $row;
}

Deux remarques importantes que je dois ajouter.

  1. Vous devez configurer mysqli pour lancer automatiquement les erreurs au lieu de les vérifier manuellement pour chaque instruction mysqli. Pour ce faire, ajoutez cette ligne avant mysqli_connect() :

     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
  2. La remarque la plus importante : contrairement à mysql_query() , mysqli_query() a un usage très limité. Vous ne pouvez utiliser cette fonction que si aucune variable ne sera utilisée dans la requête. Si une variable PHP doit être utilisée, vous ne devez jamais utiliser mysqli_query() , mais respectez toujours les instructions préparées , comme ceci :

     $stmt = $mysqli->prepare("SELECT * FROM students WHERE class=?");
     $stmt->bind_param('i', $class);
     $stmt->execute();
     $data = $stmt->get_result()->fetch_all();
    

C'est un peu verbeux, je dois l'admettre. Afin de réduire la quantité de code, vous pouvez soit utiliser PDO, soit adopter une fonction d'assistance simple pour faire toutes les opérations de préparation/liaison/exécution à l'intérieur :

$sql = "SELECT * FROM students WHERE class=?";
$data = prepared_select($mysqli, $sql, [$class])->fetch_all();