web-dev-qa-db-fra.com

Comment utiliser mysqli_query () en PHP?

Je code en PHP. J'ai la table mySQL suivante:

CREATE TABLE `students` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `Name` varchar(255) DEFAULT NULL,
  `Start` int(10) DEFAULT NULL,
  `End` int(10) DEFAULT NULL,
   PRIMARY KEY (`ID`)
 ) ENGINE=InnoDB;

J'essaie d'utiliser la fonction mysqli_query dans PHP pour décrire la table.

Voici mon code:

$link = mysqli_connect($DB_Host, $DB_USER, $DB_PASS, $DATABASE);
$result = mysqli_query($link,"DESCRIBE students");

La documentation indique Pour des requêtes SELECT, SHOW, DESCRIBE ou EXPLAIN réussies, mysqli_query () renverra un objet mysqli_result .

Mais à partir de là, je ne sais pas comment imprimer $result pour qu'il affiche les résultats de la requête. Si possible, je veux imprimer $ result pour qu'il ressemble à ceci:

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| ID       | int(10)      | NO   | PRI | NULL    | auto_increment |
| Name     | varchar(255) | YES  |     | NULL    |                |
| Start    | int(10)      | YES  |     | NULL    |                |
| End      | int(10)      | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+ 

Mon autre question est de savoir comment imprimer la requête SHOW CREATE TABLE students.

$result = mysqli_query($link,"SHOW CREATE TABLE students");
5
cooldood3490

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

$result = mysqli_query($link,"DESCRIBE students");
while ($row = $result->fetch_assoc())
{
    foreach($row as $value) echo "<td>$value</td>";
}

Dans le cas où 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 la fonction fetch_all(). Dans un tel cas, remplissez $ data array de manière habituelle:

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

Je dois ajouter deux notes importantes.

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

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
  2. Remarque la plus importante: contrairement à mysql_query(), mysqli_query() a une utilisation très limitée. Vous ne pouvez utiliser cette fonction que si aucune variable ne sera utilisée dans la requête. Si une variable PHP est va être utilisé, vous ne devez jamais utiliser mysqli_query(), mais toujours coller à instructions préparées, comme ce:

    $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. Donc, pour une utilisation quotidienne, au lieu d'utiliser les fonctions mysqli telles quelles, il faut adopter une sorte de wrapper, qui masquera tout le code répété à l'intérieur. Il existe de nombreux emballages, mais je pense que le mien est le meilleur ^ _ ^. Il s'appelle Safemysql et il vous permettra d'écrire à la fois du code sûr et concis:

$data = $db->getAll("DESCRIBE ?n", $table);

Mais si vous n'aimez pas utiliser des bibliothèques tierces, alors restez sur PDO.

12
Your Common Sense