Pré-requis

POO en PHP

Sécurité

Injection SQL

6.Le langage PHP

6.15.Utilisation de bases de données avec PHP

6.15.3.PHP et MySQL (avec MySQLi)

6.15.3.1.Introduction

Le module MySQLi est la nouvelle interface proposée par PHP pour accéder aux serveurs de base de données[c'est quoi?] MySQL. Elle prend petit à petit le pas sur l'interface historique encore très présente dans le code des scripts existants et que nous vous avons présenté dans un autre chapitre[où?].
Le module MySQLi peut être utilisé en mode procédural ou en programmation orientée objet[c'est quoi?]. C'est ce second mode (plus adapté) que nous allons vous présenter.

6.15.3.2.Installation

Il y a de fortes chances que le module MySQLi soit déjà activé dans votre environnement. Si ce n'est pas le cas, il suffit d'installer[comment?] le module mysqli (i.e. php_mysqli.dll sous windows).
rem
  • Sous debian et ubuntu, vous devez installer[comment?] l'archive php5_mysql

6.15.3.3.Pré-requis

Avant de commencer, si ce n'est pas vous qui avez créé la base de données, vous devez récupérer les paramètres d'accès auprès de votre hébergeur ou de l'administrateur du serveur. Il vous faut connaitre
  • Le nom (ou adresse IP) du serveur de la base de données
  • Le nom de la base
  • Le nom d'utilisateur
  • Le mot de passe

6.15.3.4.Utilisation

6.15.3.4.1.Introduction

D'une manière générale l'accès à une base de données se réalise en 3 étapes:
  • La connexion
  • La requête SQL
  • La déconnexion

6.15.3.5.La connexion

La connexion à la base MySQL se fait de façon transparente. Il suffit d'instancier[c'est quoi?] un objet MySQLi. Le constructeur attend essentiellement 4 paramètres (ceux évoqués précédemment) à savoir, dans l'ordre, le nom (ou adresse) du serveur de la base de données, le nom d'utilisateur, le mot de passe et le nom de la base de données.
<?php
$mysql = new MySQLi($serveur, $nomUtilisateur, $motDePasse, $base);
?>
Sur une installation standard WAMP l'instanciation se fera par
<?php
$mysql = new MySQLi('localhost', 'root', '', $base);
?>
Pour être complet sachez que le constructeur accepte 2 paramètres supplémentaires bien moins souvent utilisés: le port d'accès à la base de données et le "socket".

6.15.3.6.La déconnexion

La déconnexion de la base MySQL se fait par appel de la méthode close().
<?php
$mysql->close();
?>

6.15.3.7.Requête SQL ne retournant pas de résultat (ex: CREATE TABLE, INSERT, UPDATE, etc.)

Pour exécuter une requête SQL[c'est quoi?] nous pouvons faire appel à la méthode query().
Pour exemple, voici un script permettant la création d'une table "blog" (si elle n'existe pas déjà) et l'ajout d'un message dans cette table MySQL.
<?php
define('MYSQL_SERVEUR', 'localhost');
define('MYSQL_UTILISATEUR', 'root');
define('MYSQL_MOTDEPASSE', '');
define('MYSQL_BASE', 'test');

$mysql = new MySQLi(MYSQL_SERVEUR,
                    MYSQL_UTILISATEUR,
                    MYSQL_MOTDEPASSE,
                    MYSQL_BASE);
$sql = 'CREATE TABLE IF NOT EXISTS blog'.
       ' (login VARCHAR(64)'.
        ',message TEXT'.
        ',dateheure DATETIME)';
$mysql->query($sql);

$sql = 'INSERT INTO blog (login, message, dateheure)'.
       ' VALUES(\'phpfacile\', \'Tuto MySQL\', NOW())';
$mysql->query($sql);

$mysql->close();
?>
rem
  • Notez bien que le script ci-dessus n'affiche rien. Il agit juste sur le contenu de la base MySQL. Vous pouvez en constater les effets soit via le script du chapitre suivant soit via une interface d'administration MySQL comme PHPMyAdmin[comment?].
  • En pratique, la création de la (ou les) table(s) se fait "en dehors" des scripts d'insertion: dans un script d'initialisation de la base MySQL. Cette initialisation peut se faire via un script PHP ou un script SQL avec éventuellement l'aide d'un outil d'administration MySQL.

6.15.3.8.Requête SQL retournant des résultats (ex: SELECT)

Pour une requête de type SELECT sur une base MySQL, nous ferons également appel à la méthode query(). Cette méthode retourne un objet résultat de type MySQLi_Result (ici la variable $res) qui possède, entre autres, une méthode fetch_array() permettant de récupérer, sous forme de tableau à la fois associatif[c'est quoi?] et indexé, le résultat suivant non lu. S'il n'y a pas ou plus d'enregistrement à lire, cette méthode retourne NULL.
Une méthode classique pour lister les résultats d'une requête MySQL de type SELECT consiste donc à employer une boucle while[c'est quoi?]
<?php
define('MYSQL_SERVEUR', 'localhost');
define('MYSQL_UTILISATEUR', 'root');
define('MYSQL_MOTDEPASSE', '');
define('MYSQL_BASE', 'test');

$mysql = new MySQLi(MYSQL_SERVEUR,
                    MYSQL_UTILISATEUR,
                    MYSQL_MOTDEPASSE,
                    MYSQL_BASE);
$sql = 'SELECT * FROM blog';
$res = $mysql->query($sql);
while (NULL !== ($row = $res->fetch_array())) {
    echo $row['login'].':'.$row['dateheure'].':'.$row['message'].'<br />'."\n";
}
$mysql->close();
?>
Si vous exécutez ce script vous obtiendrez autant de lignes de résultat que de fois où vous avez lancé le script d'insertion précédent, avec à chaque fois la date de l'insertion.
Les clés du tableau (associatif) retourné par fetch_array() correspondent au nom des champs de (ou des) table(s) impliquée(s) dans la requête (ou leurs aliases si la requête en génère).
rem
  • Si la requête implique plusieurs tables avec des champs portant le même nom (ex: SELECT table1.id, table2.id FROM table1, table2 ...) le contenu de l'élement du tableau associé à la clé portant le nom du champ incriminé (ici 'id') est "indéterminé". Autre façon de dire les choses, les clés du tableau ne contiennent QUE le nom du champ et par conséquent ne contiennent pas le nom de la table (il n'y a pas de clé 'table1.id' et 'table2.id' mais une unique clé 'id'). Pour traiter ce type de cas, il est préférable de faire appel à des aliases (ex: SELECT table1.id AS table1id, table2.id AS table2id FROM ...) ou "au pire" s'appuyer sur les index du tableau.
Les index du tableau (indexé) correspondent à l'ordre du champ dans le résultat de la requête (la colonne la plus à gauche étant associée à l'index 0). Ainsi dans la requête SELECT login, message FROM ... $row['login'] peut aussi être récupéré en faisant appel à $row[0].
rem
  • Ceci peut être utilisé pour des requêtes de type SELECT COUNT(*) FROM ... où par défaut il n'y a pas de nom de champ associé au résultat de la requête (on trouvera alors le résultat du COUNT dans $row[0]). Ceci dit, là aussi, un alias peut être utilisé si l'on préfère utiliser un tableau indexé (SELECT COUNT(*) AS c FROM ...) et dans ce cas $row['c'] sera l'équivalent de $row[0].
Ici vous pouvez apprendre :
1.Introduction
2.Installation de PHP
3.Exécuter un script PHP
4.Configuration et environnement d'exécution de PHP
5.L'environnement de développement
6.Le langage PHP
6.1.Introduction
6.2.Mon premier script
6.3.La syntaxe
6.4.Les boucles (for, while, foreach, do) en PHP
6.5.Les tableaux (array) en PHP
6.6.Les fonctions
6.7.Include
6.8.Programmation orientée objet
6.9.Les fonctions de manipulation de tableaux
6.10.Les dates
6.11.Fichiers et répertoires
6.12.Les paramètres d'entrée d'un script PHP
6.13.Utilisation de la librairie graphique
6.14.JpGraph pour tracer courbes et diagrammes
6.15.Utilisation de bases de données avec PHP
6.15.1.Introduction
6.15.2.Utilisation de SQLite
6.15.3.PHP et MySQL (avec MySQLi)
6.15.3.1.Introduction
6.15.3.2.Installation
6.15.3.3.Pré-requis
6.15.3.4.Utilisation
6.15.3.5.La connexion
6.15.3.6.La déconnexion
6.15.3.7.Requête SQL ne retournant pas de résultat (ex: CREATE TABLE, INSERT, UPDATE, etc.)
6.15.3.8.Requête SQL retournant des résultats (ex: SELECT)
6.15.4.Utilisation de MySQL avec PHP
6.15.5.PDO: PHP Data Objects
6.15.6.Association Objet-Relationnel (ORM) avec Doctrine
6.16.LDAP
6.17.Parser un document XML
6.18.Génération de documents PDF en PHP
6.19.Envoyer un mail
6.20.Créer un webmail avec IMAP
6.21.Droits utilisateurs: chmod 777
6.22.Localization (l10n) et Traduction
7.PHP pour le web
8.Internationalisation (i18n) et encodage en PHP
9.Les débogueurs
10.Programmer en PHP en toute sécurité
11.Bibilothèque PEAR
12.Zend Framework 2 et 3
13.Installation de Zend Framework 2
14.Joomla
15.Composer
16.PHPUnit
17.PHPDocumentor
18.Exemples de scripts PHP
19.Erreurs fréquentes et les solutions
20.Archives
Forum PHP
Version imprimable: imprimer