Vous êtes ici : Accueil > Archives > Tutoriels > PHP et MySQL > Fonctions MySQL de PHP

< Retour
Fonctions MySQL
1er script par l'exemple

Fonctions MySQL de PHP

Derni�re mise à jour : 30.07.2005

Ce chapitre dressera un portrait simple et illustré d'exemples des principales fonctions MySQL dont PHP se sert pour interroger les bases.

Rappels et compl�ments d'information :
  • les éléments entre crochets ('[' & ']') sont facultatifs, les parenthèses '(' & ')' sont à saisir, et enfin les valeurs entre accolades ('{' & '}') séparées par des slashes ('/') sont des choix entre différentes valeurs (une seule à la fois !).
  • en PHP, les index, c'est à dire les 'niveaux' des variables multidimensionnelles, commencent à zéro. Un ensemble de 10 valeurs occupera donc la plage d'index de 0 à 9...
  • le caractère arobase ('@') sert à évincer les éventuels messages d'erreur d'exécution de la fonction MySQL.

Fonctions élémentaires
Se connecter à son serveur de BdD MySQL et choisir sa base de travail.

mysql_connect()
$connection = [@]mysql_connect( $adresse_ip_de_l_hote, $nom_d_utilisateur, $mot_de_passe );
Paramètre(s) :
  • $adresse_ip_de_l_hote est une chaîne de caractères contenant l'adresse ip du serveur ;
  • $nom_d_utilisateur est une chaîne de caractères contenant le nom d'utilisateur ;
  • $mot_de_passe est une chaîne de caractères contenant le mot de passe (en clair) de l'utilisateur.

Résultat :
  • $connection contient une référence de ressource SQL affectée par MySQL.

mysql_connect() établi une connection à la base MySQL. Les arguments sont "adresse IP de l'hôte", "nom d'utilisateur" et "mot de passe". Par défaut, les valeurs "localhost", "root" et "" (chaîne vide) sont possibles, mais il est très préférable d'avoir des nom et mot de passe personnels définis pour des raisons évidentes de sécurité !
Attention, avertissement ! Attention ! Certains hébergeurs fonctionnent en « mysql_connect less », c'est en fait une sorte de connection MySQL définie dans le compte utilisateur.
Attention, avertissement ! Attention ! Certains hébergeurs ne tolèrent pas de connection distante, c'est-à-dire qu'un script PHP d'un serveur 'A' se connecte à une base de données qui soit située sur le serveur 'B' ; c'est le serveur 'B' qui va alors refuser l'entrée au serveur 'A'... Vérifiez cela avant de vous lancer dans un développement à distance.

Exemple :
<?php
$connection = mysql_connect( "127.0.0.1", "webmaster", "password" );
?>

Exemple :
<?php
$serveur = "127.0.0.1";
$utilisateur = "webmaster";
$motdepasse = "password";
?>
...
<?php
$connection = mysql_connect( $serveur, $utilisateur, $motdepasse ) or die( "impossible de se connecter, le serveur est HS." );
?>

Voir aussi :
PHP / fonctions MySQL / >> mysql_close()
mysql_select_db()
[@]mysql_select_db( $nom_de_la_base [,$connection ] );
Paramètre(s) :
  • $nom_de_la_base est une chaîne de caractères contenant le nom de la base de données ;
  • $connection est un identifiant de ressource, obtenu par la fonction mysql_connect() (>).

Résultat :
  • Ouverture d'une connexion vers la base de données spécifiée...

mysql_select_db() sélectionne la base de données MySQL a utiliser. Il suffit de passer son nom, et éventuellement la variable contenant l'identifiant de ressource héritée du mysql_connect() (>) vu précédement.

Fonctions d'exécution...
Exécuter une requête SQL.
Il existe plusieurs fonctions pour exécuter une requête, mais je ne vais parler que de la plus répandue et la plus simple.

$oSqliDb->query()
$curseur = [@]mysql_query( $requete_sql [, $connection] );
Paramètre(s) :
  • $requete_sql est une chaîne de caractère contenant une requête SQL ;
  • $connection est un identifiant de ressource, obtenu par la fonction mysql_connect() (>) (facultatif).

Résultat :
  • un identifiant de ressource SQL, générée par MySQL, et qui contient le résultat de la requête.

Exécute une requête SQL, saisie directement entre guillemets ou placée dans une variable. Le résultat retourné sera l'identifiant d'une ressource MySQL contenant le résultat, qu'il faudra ensuite exploiter aux travers des fonctions mysql_fetch_*() (>).

... et de test.
.. analyser son résultat : est-ce que ma requête de sélection m'a donné un résultat ? Y'a-t'il eu une erreur ??...

mysql_num_rows()
$taille_curseur = [@]mysql_num_rows( $curseur );
Paramètre(s) :
  • $curseur est un identifiant de ressource résultant de la fonction mysql_query() (>).

Résultat :
  • $taille_curseur est un entier.

Renvoi le nombre de lignes du curseur, c'est à dire la taille de la première dimension du résultat de mysql_query() (>), ou si vous préferez, le nombre d'éléments qui ont répondus à votre requête SQL.
Attention, avertissement ! Attention ! Cette fonction ne peut �tre utilis�e qu'avec une requ�te SQL de type « SELECT », pour les requ�tes « UPDATE », voir la fonction >> mysql_affected_rows().
Attention, avertissement ! Attention ! Si vous utilisez la clause MySQL « LIMIT », le nombre retourné sera au maximum égal à la valeur du nombre d'éléments choisi. Je m'explique : dans la requete « SELECT * FROM matable LIMIT 0,50 », même si il y a 100 éléments dans la table matable, mysql_num_rows() ne retournera que 50, car c'est le nombre de tuples effectivement sélectionnés...

Voir aussi :
PHP / fonctions MySQL / >> mysql_affected_rows()
mysql_error()
$erreur = mysql_error( [$curseur] );
Paramètre(s) :
  • Le paramètre est optionnel. Par défaut la fonction mysql_error() s'applique à la dernière ressource issue d'un mysql_query() (>). On peut aussi spécifier une variable contenant un identifiant de ressource MySQL...

Résultat :
  • Soit rien, soit un message d'erreur de MySQL (en anglais).

Il s'agit d'une des façons de gérer les erreurs de MySQL. Il en existe plusieurs mais elles se situent plutôt dans la programmation PHP (recours à die, contrôles à l'aide d'instructions if ... else, etc.), car la plupart des fonctions MySQL de PHP renvoient soit des identifiants de ressources, càd des entiers qui peuvent servir de booléens, soit des éléments que PHP peut interprêter comme nuls ou valués, un peu comme un booléen. Après, c'est à chacun, en fonction de sa façon de coder, de choisir telle ou telle méthode.
Attention, avertissement ! Attention ! Dans le cas de la mise en place d'une gestion d'erreur, pensez bien à mettre le @ devant les fonctions MySQL, sinon les utilisateurs auront deux fois les messages d'erreur ;-)

Exemple :
<?php
$requete = "SELECT * FROM matable";
$execution = mysql_query( $requete );
if( mysql_error() )
echo "Votre requête renvoie une erreur ! MySQL dit : " . mysql_error();
else
{
/* traitement des données */
}
?>

Extraire un résultat
Je vous donne cette fonction pour information, évitez de l'utiliser, elle consomme énormément de mémoire !

mysql_result()
$une_valeur = [@]mysql_result( $curseur, $index, $colonne );
Paramètre(s) :
  • $curseur est un identifiant de ressource résultant de la fonction mysql_query() (>) ;
  • $index est un entier (un chiffre) représentant le numéro de la ligne de résultat souhaitée. Les index commencent à zéro en PHP ;
  • $colonne peut être soit un entier représentant l'index de la colonne, soit une chaîne de caractères contenant le nom de la colonne.

Résultat :
  • Une valeur, dont le type est fonction du format de colonne dans MySQL...

Extrait du curseur spécifié en premier paramètre une valeur. La variable $index contient ou est une valeur numérique, qui est la première dimension du tableau / curseur ; en l'absence de l'index, mysql_result() retourne la première valeur de la colonne spécifiée dans le troisième paramètre. $colonne est soit un entier représentant le numéro de colonne des dimensions suivantes (la première colonne ayant l'index de colonne à zéro) soit une chaîne de caractère portant le nom d'un champ contenu dans la clause « SELECT » de la requête SQL.
Attention, avertissement ! Attention ! Évitez d'utiliser mysql_result(), car ce n'est pas une économie de ressources au niveau du serveur, elle est très gourmande en mémoire, donc préférez lui de loin n'importe lequel des mysql_fetch_*() (>) !! Prendre en compte les ressources (toujours limitées) d'un serveur est un gage de pérénité pour votre application, alors pensez-y.

mysql_fetch_*
Ou les fonctions pour interprêter le résultat d'une requete SELECT passée dans $oSqliDb->query().

mysql_fetch_row()
$tuple_tableau = [@]mysql_fetch_row( $curseur [, $connection] );
Paramètre(s) :
  • $curseur est un identifiant de ressource généré par la fonction mysql_query() (>) ;
  • $connection est l'identifiant de ressource de la connection, et est généré par le mysql_connect() (>) placé en début de script (facultatif).

Résultat :
  • $tuple_tableau est une ligne du curseur, sous la forme d'un tableau non-associatif.

mysql_fetch_row() charge une ligne du curseur passé en paramètre, et ce sous la forme d'un tableau non-associatif, c'est-à-dire que la variable stockant le résultat n'a pour index de colonne que les seuls chiffres du rang de l'index des élements sélectionnés...

exemple & explications :
  • dans le cas d'une requête SQL du type « SELECT colonne1, colonne5 FROM matable », les champs colonne1 et colonne5, après le mysql_query() (>) d'une part, et d'autre part le mysql_fetch_row(), ne pourront être appelées que sous la forme $tuple_tableau[0] et $tuple_tableau[1].
  • dans le cas d'une requête « SELECT * FROM matable » et si matable contient 15 colonnes, les index de la variable de résultat $tuple_tableau seront 0 pour la colonne 1, 1 pour la colonne 2, etc.. et l'index 14 pour la colonne 15.
  • Les valeurs des index numériques sont donc liées au nombre et à l'ordre de l'appel des colonnes qui sont chargées via la clause « SELECT » de la requête SQL. Je ne sais pas si cette explication était vraiment nécessaire, mais je l'ai apportée ;-)

    <?php
    $requete = "SELECT colonne1, colonne5 FROM matable";
    $execution = mysql_query( $requete );
    while( $tuple = mysql_fetch_row( $execution ) )
    {
    echo "colonne1 = " . $tuple[0] . "<br />\n";
    $colonne5 = $tuple[1];
    echo "colonne5 = " . $colonne5 . "<br />\n";
    }
    ?>

    Voir aussi :
    SQL standard / manipulation de données / >> clause SELECT
    PHP / structures de contrôle / >> while
mysql_fetch_array()
$tuple_tableau = [@]mysql_fetch_array( $curseur [, $connection] );
Paramètre(s) :
  • $curseur est un identifiant de ressource généré par la fonction mysql_query() (>) ;
  • $connection est l'identifiant de ressource de la connection, et est généré par le mysql_connect() (>) placé en début de script (facultatif).

Résultat :
  • $tuple_tableau est une ligne du curseur, sous la forme d'un tableau associatif.

mysql_fetch_array() charge une ligne du curseur qui est passé en paramètre, et stocke le résultat sous la forme d'un tableau associatif.

Exemple(s) :
  • dans le cas d'une requête « SELECT colonne4, colonne5, colonne15 FROM matable », il sera possible de charger les valeurs à l'aide de $tuple_tableau["colonne4"], $tuple_tableau["colonne5"] et $tuple_tableau["colonne15"], mais aussi à l'aide des index numériques $tuple_tableau[0], $tuple_tableau[1] et $tuple_tableau[2].
  • dans le cas d'une requête « SELECT * FROM matable », il est alors plus facile de charger les valeurs du résultat en appellant les noms des colonnes, sans avoir à se soucier de leur rang dans la clause SELECT ou dans la définition de la table... C'est dans ce genre de cas que mysql_fetch_array() représente un avantage sur mysql_fetch_row() (>).

<?php
$requete = "SELECT colonne4, colonne5, colonne15 FROM matable";
$execution = mysql_query( $requete );
while( $tuple = mysql_fetch_array( $execution ) )
{
echo "colonne4 = " . $tuple["colonne4"] . "<br />\n";
$colonne5 = $tuple["colonne5"];
echo "colonne5 = " . $colonne5 . ", colonne15 = " . $tuple["colonne4"] . "<br />\n";
}
?>
mysql_fetch_object()
$tuple_objet = [@]mysql_fetch_object( $curseur [, $connection] );
Paramètre(s) :
  • $curseur est un identifiant de ressource généré par la fonction mysql_query() (>) ;
  • $connection est l'identifiant de ressource de la connection, et est généré par le mysql_connect() (>) placé en début de script (facultatif).

Résultat :
  • $tuple_objet est une ligne du curseur, stockée dans un objet.

Comme je ne maîtrise pas tellement la syntaxe objet, je vais éviter de tenir des propos hasardeux :D

Exemple général commenté

Nous supposons qu'il existe à la racine « www » d'EasyPHP un fichier connect.inc.php qui contient les lignes necessaires à la connection à notre base de données de test.
Un utilisateur spécifique à été créé, mais rien ne vous empêche de recourir aux valeurs "root" et "" pour les nom d'utilisateur et mot de passe...
<?php
// Connection à la BdD
$connection = mysql_connect( "localhost", "testeur", "test" ) or die( "Connection impossible. MySQL renvoi le message d'erreur suivant : " . mysql_error() );
// Sélection de la BdD
mysql_select_db( "tests", $connection ) or die( "Selection de la base impossible. MySQL renvoi le message d'erreur suivant : " . mysql_error() );
?>
Pour les besoins du script ci-dessous, il nous faut une petite table contenant des personnes, c'est-à-dire des noms et prénoms...
Voici un petit schéma MySQL avec quelques tuples.
# structure de la table `personnes`

CREATE TABLE `personnes` (
`personne_id` int( 11 ) unsigned NOT NULL auto_increment,
`prenom` varchar( 50 ) NOT NULL default '',
`nom` varchar( 75 ) NOT NULL default '',
PRIMARY KEY ( `personne_id` )
) TYPE=MyISAM;

# Contenu de la table `personnes`

INSERT INTO `personnes` ( `personne_id`, `prenom`, `nom` ) VALUES ( 1, 'Joël', 'Vindret' );
INSERT INTO `personnes` ( `personne_id`, `prenom`, `nom` ) VALUES ( 2, 'Céline', 'Cuz' );
INSERT INTO `personnes` ( `personne_id`, `prenom`, `nom` ) VALUES ( 3, 'Cédric', 'Cuz' );
INSERT INTO `personnes` ( `personne_id`, `prenom`, `nom` ) VALUES ( 4, 'Anthony', 'Revillard' );

<html>
<head><title>
Test</title></head>
<body>

<?php
include( "connect.inc.php" );

// requête simple de sélection
$requete = "SELECT nom, prenom FROM personnes ORDER BY nom";
/*
- première remarque, le point-virgule à la fin des requêtes SQL n'est plus nécessaire ici !
- la casse MAJUSCULES / minuscules n'a pas d'importance pour les mots réservés du SQL.
*/


// exécution de la requête
$curseur = mysql_query( $requete );
// ou alors
$curseur = mysql_query( "SELECT nom, prenom FROM personnes ORDER BY nom" );
// ou encore
$curseur = mysql_query( $requete, $connection );
/*
la variable '$connection' contenant la chaîne de connection à la base, initialisée dans le fichier 'connect.inc.php'

Pour comprendre le principe des index et autres dimensions, voyons à quoi ressemble le contenu et la structure du fameux curseur :

|-----------|------------|
| 0 "nom" | 1 "prenom" |
|---|-----------|------------|
| 0 | Cuz | Céline |
| 1 | Cuz | Cédric |
| 2 | Revillard | Anthony |
| 3 | Vindret | Joël |
|---|-----------|------------|

La variable $curseur est donc assimilable à un tableau. Mais attention, c'est une "image", en fait $curseur est un identifiant de ressource qui pointe vers une sorte de tableau !.
Sa première dimension, c'est la colonne de chiffres à gauche, les 'index de lignes'.
Ses autres dimensions sont les deux autres colonnes, 'nom' et 'prenom', dont les 'index de colonne' sont zéro et un. J'espère que cet exemple est clair.
*/

?>
<br />
<?php
// taille du résultat
$taille = mysql_num_rows( $curseur );
echo "le nombre de lignes retournées par la requête \"<i>" . $requete . "</i>\" est <b>" . $taille . "</b>.<br />\n";
/*
le nombre de lignes retournées par la requête "<i>SELECT nom, prenom FROM personnes ORDER BY nom</i>" est <b>4</b>.<br />
Voici donc le résultat du premier 'echo', du point de vue du code source. Voyons maintenant comment afficher les résultats du curseur lui-même.
*/
?>
<br />
<?php
for( $x = 0; $x < mysql_num_rows( $curseur ) - 1; $x++ )
{
echo "$x - " . mysql_result( $curseur, $x, "prenom" ) . " " . mysql_result( $curseur, $x, "nom" ) . "<br />\n";
}
/*
En nous servant de la taille du curseur, on peut le parcourir à l'aide d'une instruction 'FOR'. On commence à zéro, et tant que l'index reste inférieur à la taille du curseur, on le parcours. Le résultat donne ceci (code source HTML) :

0 - Céline Cuz<br />
1 - Cédric Cuz<br />
2 - Anthony Revillard<br />
3 - Joël Vindret<br />

*/
?>
<br />
<?php
/*
Il est aussi possible de se servir d'une autre commande, qui s'affranchie de la taille du curseur, mysql_fetch_array.
La commande 'fetch' charge, dans ce cas un tableau d'une ligne et n colonnes (autant que de champs dans le SELECT).
Chaque utilisation de mysql_fetch_* garde en mémoire le dernier index du curseur qui a été chargé, combiné avec un 'TANT QUE ... FAIRE ...' qui teste avant de faire, et voici que l'affichage est quasi-automatique, sans avoir à se soucier des dimensions, mis à part les colonnes...
*/

$curseur = mysql_query( $requete );
while( $un_element = mysql_fetch_array( $curseur ) )
{
echo "- " . $un_element["nom"] . ", " . $un_element["prenom"] . "<br />\n";
}
/*
le résultat donne ceci dans le code source HTML :
- Cuz, Céline<br />
- Cuz, Cédric<br />
- Revillard, Anthony<br />
- Vindret, Joël<br />
*/

?>
</body>
</html>

>> Fonctions MySQL, suite.