Maîtrisez MySQLi sans POO !

Maîtrisez MySQLi sans POO !

Mis à jour le mardi 19 novembre 2013

Dans ce tutoriel, qui est mon premier, nous allons apprendre à utiliser une extension de PHP, qui est MySQLi.

D'accord, mais c'est quoi, MySQLi ?

MySQLi permet de communiquer avec une base de données MySQL.

Mais pourquoi utiliser MySQLi ?

Je dirais que c'est juste une histoire de goûts.
On peut utiliser MySQLi sans passer par la programmation orientée objet, ce qui peut être un avantage pour ceux qui ne connaissent rien à la POO en PHP (comme moi ;) ).
Peut-être que par la suite, certains trouveront que MySQLi est plus simple à utiliser que la technique enseignée par M@teo21 dans son tutoriel PHP.

Nous allons donc apprendre à nous servir de MySQLi.
Ah ! Au passage, vous remarquerez que toute les fonctions de MySQLi commencent par… mysqli_ !

Se connecter à la base de données

Pour se connecter à MySQL, on va utiliser cette fonction :

<?php
$bdd = mysqli_connect('serveur', 'utilisateur', 'mot_de_passe', 'base');
?>
  • $bdd correspond à une variable où seront stockées les informations de la base de données. On s'en servira souvent.

  • serveur correspond au serveur SQL.

  • utilisateur correspond au nom d'utilisateur pour se connecter au serveur SQL.

  • mot_de_passe correspond au mot de passe pour le serveur SQL !

  • base correspond à votre base de données du serveur SQL.

On peut tester si la connexion a réussi ou non :

<?php
if($bdd = mysqli_connect('localhost', 'root', '', 'base'))
{
	// Si la connexion a réussi, rien ne se passe.
}
else // Mais si elle rate…
{
	echo 'Erreur'; // On affiche un message d'erreur.
}
?>

Dans cet exemple, MySQLi se connecte au serveur local.

Une fois que la connexion est établie, nous pouvons passer à nos premières requêtes...

Les requêtes simples

Nous allons apprendre à gérer les requêtes simples.

Qu'appelles-tu requêtes simples ?

Ce sont les requêtes qui ne sont pas préparées, car ces dernières sont un peu plus complexes.

Le code de la requête

Le code de la requête est le suivant :

<?php
$resultat = mysqli_query($bdd, 'requete');
?>
  • $resultat est la variable où seront stockées les données.

  • $bdd est la variable retournée par la fonction de connexion à la base de données, voir plus haut.

  • 'requete' est une requête SQL.

Exemple :

<?php
$resultat = mysqli_query($bdd, 'SELECT * FROM membres LIMIT 0, 10');
?>

Voilà, requete était une simple requête SQL !

Mais maintenant, comment afficher ces résultats ?

C'est ce que nous allons voir…

Afficher le résultat d'une requête simple

Pour afficher le résultat de ce type de requêtes, il suffit de fetcher dans une boucle while.

<?php
while($donnees = mysqli_fetch_assoc($resultat))
{
	echo $donnees['id'];
	echo "\n";
	echo $donnees['pseudo'];
}
?>

Que se passe-t-il ? En réalité, c'est relativement simple : $donnees est transformé en un tableau avec les noms des colonnes demandées dans la requête. Cette transformation est réalisée grâce à la fonction mysqli_fetch_assoc($resultat), $resultat étant le résultat brut de la requête. Cette fonction sert aussi et surtout à passer au résultat suivant, d'où l'utilisation de la boucle while.

Oups ! J'ai oublié quelque chose ! :-°

<?php
while($donnees = mysqli_fetch_assoc($resultat))
{
	echo $donnees['id'];
	echo "\n";
	echo $donnees['pseudo'];
}
mysqli_free_result($resultat);
?>

C'est mieux comme ça ! :lol:
Eh oui, il ne faut pas oublier de fermer le curseur avec la fonction suivante :

<?php
mysqli_free_result($resultat);
?>

Fermer le curseur permet de libérer les données récupérées lors d'une requête SQL.

Résumé

<?php
// include du fichier de connexion à SQL.

$resultat = mysqli_query($bdd, 'SELECT * FROM membres LIMIT 0, 10');
while($donnees = mysqli_fetch_assoc($resultat))
{
	echo $donnees['id'];
	echo "\n";
	echo $donnees['pseudo'];
}
mysqli_free_result($resultat);
?>

Les requêtes préparées

Pour travailler avec les requêtes préparées, il y a un certain ordre à suivre :

  1. préparer la requête ;

  2. lier les variables à la requête ;

  3. exécuter la requête ;

  4. si la requête renvoie un résultat, on continue : lier le résultat à des variables ;

  5. fetcher le résultat.

Quasiment toutes les fonctions concernant les requêtes préparées commenceront par mysqli_stmt_.

Préparer la requête

On prépare la requête avec cette fonction :

<?php
$req_pre = mysqli_prepare($bdd, 'SELECT * FROM membres WHERE id = ?');
?>

$req_pre est une variable qui contient la requête préparée. À part ça, vous n'avez pas vraiment besoin d'explications. :lol:

Lier les variables à la requête préparée

On les lie avec cette fonction un peu plus complexe :

<?php
mysqli_stmt_bind_param($req_pre, "i", $id);
?>

Cette fonction est en effet un peu particulière.
$req_pre est la variable de la requête préparée. i est le type de la variable qui suit. La variable coorespond à ce qui va remplacer le point d'interrogation dans la requête.
Concernant les types de variables possibles, voici un petit tableau :

Lettre

Correspond à

i

un nombre entier

d

un nombre décimal

s

une chaîne de caractères

Ces lettres doivent être placées selon l’ordre dans lequel apparaissent les variables après, tel que les variables doivent apparaître dans l'ordre des points d'interrogation dans la requête. Les lettres doivent être dans le même paramètre.
Un exemple vaut mieux qu'un long discours :

<?php
$req_pre = mysqli_prepare($bdd, 'INSERT INTO membres (pseudo, age, poids) VALUES ( ?, ?, ?)');
mysqli_stmt_bind_param($req_pre, "sid", $pseudo, $age, $poids);
?>

Disons que $pseudo vaut quelquun, que $age vaut 23 et que $poid vaut 52,357 (par exemple, hein :lol: ).

Exécuter la requête

Rien de bien sorcier :

<?php
mysqli_stmt_execute($req_pre); 
?>

(Sans commentaires.)

Si la requête ne renvoie pas de résultat (les requêtes d'insertion, de mise à jour, de suppression), on s'arrête là. Sinon, il faut lier le résultat de l'exécution à des variables.

Lier le résultat à des variables

Personnellement, je lie le résultat d'une requête préparée à un tableau dont chacun aura le nom de la colonne du résultat. Vous allez vite comprendre :

<?php
mysqli_stmt_bind_result($req_pre, $donnees['pseudo'], $donnees['age'], $donnees['email']);
?>

Voilà, si vous choisissez de tout sélectionner dans la requête, vous aurez une variable par colonne de la base. Si vous avez sélectionné les colonnes que vous souhaitez obtenir dans la requête, il faudra une variable par colonne demandée.

Fetcher le résultat

Si vous savez qu'il n'y aura qu'un résultat, il faut fetcher de cette façon :

<?php
mysqli_stmt_fetch($req_pre);
?>

Et seulement ensuite vous pourrez utiliser le tableau $donnees.

S'il y aura plusieurs résultats, il faut faire une boucle :

<?php
while(mysqli_stmt_fetch($req_pre))
{
      echo $donnees['pseudo'] . ", " . $donnees['age'] . " ans," . $donnees['email'];
}
?>

Exemples

Avec une requête qui ne renvoie pas de résultat

<?php
// include de la connexion SQL.

$req_pre = mysqli_prepare($bdd, 'INSERT INTO membres (pseudo, age, email) VALUES (?, ?, ?)');
mysqli_stmt_bind_param($req_pre, "sis", $pseudo, $age, $email);
mysqli_stmt_execute($req_pre);
?>

Avec une requête qui renvoie des résultats

<?php
// include de la connexion SQL.

$req_pre = mysqli_prepare($bdd, 'SELECT * FROM membres WHERE age = ? LIMIT 0, ?');
mysqli_stmt_bind_param($req_pre, "ii", $age, $nombre_resultat);
mysqli_stmt_execute($req_pre);
mysqli_stmt_bind_result($req_pre, $donnees['pseudo'], $donnees['age'], $donnees['email']);
while(mysqli_stmt_fetch($req_pre))
{
	echo $donnees['pseudo'] . ", " . $donnees['age'] . " ans, " . $donnees['email'];
}
?>

Quelques fonctions supplémentaires...

Même si vous les trouverez toutes dans la doc' de MySQLi, je vais vous montrer quelques fonctions, que je pense vous aurez besoin de temps en temps.

Connaître le nombre d'entrées retournées

Connaître le nombre d'entrées dans une table peut parfois être utile: donner le nombre de commentaires dans un blog, le nombres de réponse dans un forum... Nous allons voir ça en détail avec des requêtes simples et préparées.

Avec une requête simple

Vous devez utiliser la fonction suivante:

<?php
mysqli_num_rows($requete);
?>

La fonction vous retournera le nombre d'entrées dans la table qu'elle a obtenu selon la requête SQL.

Exemple:

<?php
// include de la connexion à la BDD.
$req = mysqli_query($bdd, 'SELECT * FROM commentaires');
$nb = mysqli_num_rows($req);

echo 'Il y a ' . $nb . ' commentaire(s).';
?>

Avec des requêtes préparées

Là, c'est un peu plus compliqué. En réalité, vous devez d'abord stocker (je n'sais trop où...) le résultat de la requête préparée et seulement ensuite demander le nombre d'entrées retournées par la requête.
Après avoir exécuté la requête préparée, utilisez cette fonction qui stocke les informations:

<?php
mysqli_stmt_store_result($stmt);
?>

Ensuite, vous pouvez gentiment demander combien d'entrées ont été retournées par la requête:

<?php
$nb = mysqli_stmt_num_rows($stmt);

Un petit exemple qui retourne les commentaires d'un article (tiré de mon site) et ensuite le nombre de commentaires:

<?php
// include de la connexion à la BDD.
$stmt = mysqli_prepare($bdd, 'SELECT contenu, auteur, date_post FROM commentaires WHERE id_article = ? AND ok = 1 ORDER BY date_post');
mysqli_stmt_bind_param($stmt, "i", $_GET['id']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$nb = mysqli_stmt_num_rows($stmt);
?>

(Vous vous doutez bien qu'ensuite j'affiche ce nombre, et les commentaires à la suite ! :p )

Non, non, ne vous inquiétez pas, je vais vous la donner, l'adresse de la DOC ! Attention, la voici, la voilà :
http://www.php.net/manual/fr/mysqli.summary.php

Voilà, le tutoriel touche à sa fin. N'hésitez pas à laisser des commentaires ! :)
Si vous avez un souci, si vous souhaitez proposer une amélioration ou autre, n'hésitez pas à me contacter par MP !

déroulement d'un cours

  • 1

    Dès aujourd'hui, vous avez accès au contenu pédagogique et aux exercices du cours.

  • 2

    Vous progressez dans le cours semaine par semaine. Une partie du cours correspond à une semaine de travail de votre part.

  • !

    Les exercices doivent être réalisés en une semaine. La date limite vous sera annoncée au démarrage de chaque nouvelle partie. Les exercices sont indispensables pour obtenir votre certification.

  • 3

    À l'issue du cours, vous recevrez vos résultats par e-mail. Votre certificat de réussite vous sera également transmis si vous êtes membre Premium et que vous avez au moins 70% de bonnes réponses.

Exemple de certificat de réussite
Exemple de certificat de réussite