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).
|
- 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();
?>
|
- 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).
|
- 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].
|
- 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].
|