Construction et exploitation des données d'une base MYSQL. Cette fiche vous permettra rapidement d'installer et de faire fonctionner une base de données sur votre site. Elle vous donnera aussi les bases nécessaires pour une compréhension plus aisée de ces mécanismes.
SQL (sigle de Structured Query Language, en français langage de requête structurée) est un langage informatique normalisé servant à effectuer des opérations sur des bases de données relationnelles. Ce langage se décompose en 4 parties.
Partie langage de manipulation de données pour rechercher, d'ajouter, de modifier ou de supprimer des données dans les bases de données.
Partie langage de définition de données pour créer, et de modifier l'organisation des données dans la base de données.
Partie langage de contrôle de transaction pour commencer et terminer des transactions.
Partie langage de contrôle de données pour autoriser ou interdire l'accès à certaines données.
Le tableau suivant donne une liste non exhaustive de fonctions supportées par MSQL. Les fonctions marquées en style gras/vert sont celles que nous aborderons dans cette fiche
Lors de votre inscription la majorité des fournisseurs d'accés internet (FAI) vous offrent les possibilités (en plus de l'accés ADSL) d'utiliser des emplacements pour vos pages internet et mettent souvent à votre disposition une base de données. Votre FAI vous fourni le nom du host (sql.free.fr chez le FAI free), le nom de la base de données qui vous est réservée, le login et le mot de passe pour pouvoir y accéder.
La base doit être préalablement disponible et on doit pouvoir définir les informations suivantes.
Code php
Commentaires sur le code
error_reporting(0);
error_reporting() gère l'affichage des erreurs durant l'exécution du script. error_reporting(0) par exemple bloque l'affichage des erreurs générées par le script durant son exécution. Mais on peut ne présenter que les erreurs (error_reporting(E_ERROR)), ou bien que les warning (error_reporting(E_WARNING)) ou bien encore que les Erreurs et les Warning : error_reporting(E_ERROR | E_WARNING) etc.
Celà permet de pouvoir maitriser sa propre gestion des erreurs : die('Connexion échouée') ou die('Sélection échouée').
Nota : die est un alias de exit : c'est une fonction native de PHP qui permet de stopper l'exécution du script. Si une chaîne de caractères est passée en argument, elle est affichée avant l'arrêt.
mysql_connect()
mysql_connect ouvre ou réutilise une connexion à un serveur MySQL.
syntaxe :
mysql_connect(server(string) ,username(string), password(string), new_link(booléen), client_flags(integer)); .
Cette fonction retourne l'identifiant de connexion MySQL en cas de succès ou FALSE en cas d'échec.
Paramètres
server : => Le serveur MySQL. Il peut aussi inclure le numéro de port. C'est-à-dire "hostname:port" ou le chemin vers le socket local, c'est-à-dire ":/path/to/socket" pour localhost. La valeur par défaut est 'localhost:3306'.
username : => Le nom d'utilisateur qui détient le processus du serveur.
password : => Le mot de passe de l'utilisateur qui détient le processus du serveur.
new_link : => Si un deuxième appel est fait à mysql_connect avec les mêmes arguments, aucune nouvelle connexion ne sera établie, mais plutôt, l'identifiant de la connexion déjà ouverte sera retourné. Le paramètre new_link modifie ce comportement et permet à mysql_connect de toujours ouvrir une nouvelle connexion, même si mysql_connect a été appelée avant avec les mêmes paramètres.
client_flags : => Ce paramètre peut être une combinaison des constantes suivantes :
MYSQL_CLIENT_SSL => Utilise le protocole avec compression
MYSQL_CLIENT_COMPRESS => Autorise les espaces après les noms de fonction
MYSQL_CLIENT_IGNORE_SPACE => Autorise interactive_timeout secondes d'inactivité sur la connexion (au lieu de wait_timeout )
MYSQL_CLIENT_INTERACTIVE => Utilisation du chiffrement SSL.
mysql_select_db()
Il y a généralement plusieurs bases de données sur un serveur. Effectivement, si vous possédez plusieurs sites, il est possible d'héberger plusieurs bases de données différentes sur votre serveur. Par conséquent, une fois que la connexion à ce serveur à été effectuée avec mysql_connect, il va falloir désigner la base de données sur laquelle vous allez travailler.
syntaxe :
mysql_select_db (database_name(string) , link_identifier(resource) ).
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Paramètres
database_name => Le nom de la base de données à sélectionner.
link_identifier => La connexion MySQL résultat de mysql_connect(). Si elle n'est pas spécifiée, la dernière connexion ouverte avec la fonction mysql_connect sera utilisée. Si une telle connexion n'est pas trouvée, la fonction tentera d'ouvrir une connexion, comme si la fonction mysql_connect avait été appelée sans argument. Si aucune connexion n'est trouvée ou établie, une alerte E_WARNING est générée.
mysql_query() : la commande d'envoi d'une requête
Syntaxe générale
mysql_query ( la requête SQL sous forme de chaine , La connexion à la base);
Cette fonction attend 2 paramètres dont le deuxième est facultatif.
Le premier argument est la requête à exécuter sur la base de données. C'est cet argument qui va nous permettre de manipuler les données de la base : lire avec SELECT, mettre à jour avec UPDATE, enregistrer avec INSERT ou supprimer avec DELETE et plus encore. Le deuxième argument est le lien renvoyé plutôt par la fonction mysql_connect. Même si cet argument est surtout utile lorsque plusieurs connexion à une base de données sont ouvertes en même temps, il est conseillé de toujours le spécifier pour une question de clarté. Attention :
Cette fonction envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante.
Ne pas terminer la chaine requête SQL par un poit virgule
Réponses à l'exécution de la fonction
Pour les requêtes du type SELECT , SHOW , DESCRIBE ou EXPLAIN , mysql_query retournera une ressource en cas de succès, ou FALSE en cas d'erreur.
Pour les autres types de requêtes, UPDATE , DELETE , DROP , etc., mysql_query retourne TRUE en cas de succès ou FALSE en cas d'erreur.
mysql_query(CREATE TABLE ()) : Créer une table
Pré-requis
Au moment de créer une table, on doit se demander ce qu'elle va contenir car le type (de données) de chaque champ est très important.
Code php
Le résultat au niveau de la base de données
Commentaires sur le code
mysql_query(INSERT INTO : ) : Enregistrer des données
Code php
Le résultat au niveau de la base de données
Commentaires sur le code
mysql_query(SELECT ) : Récupération des données
Généralités
SELECT est utilisé pour obtenir des enregistrements venant d'une ou plusieurs tables et celà en fonction de critères de choix définis dans la requête.
Le résultat retourné (dans nos exemples $res) sera l'identifiant d'une ressource MySQL contenant le résultat, qu'il faudra ensuite exploiter aux travers des fonctions mysql_numrows() et mysql_fetch_*
Syntaxe
mysql_query("SELECT QUOI FROM OUCOMMENT")
Quelques combinaisons
Commandes SELECT
SELECT * FROM nom_Table
SELECT * FROM table N°départ, Nb résultats
SELECT nom_Colonne(s) FROM nom_Table
SELECT DISTINCT nom_Colonne(s) FROM nom_Table
SELECT nom_Colonne(s) FROM nom_Table ORDER BY nom_Colonne [ASC|DESC]
SELECT nom_Colonne(s) FROM nom_Table WHERE nom_Colonne opérateur value
SELECT nom_Colonne(s) FROM nom_Table WHERE condition AND|OR condition
SELECT nom_Colonne(s) FROM nom_Table WHERE nom_Colonne BETWEEN value1 AND value2
SELECT nom_Colonne(s) FROM nom_Table WHERE nom_Colonne IN (value1,value2,..)
SELECT DISTINCT nom_Colonne(s) ORDER BY nom_Colonne ASC WHERE condition AND|OR condition
Les Clauses des combinaisons précédentes
Clauses
Commentaires
*
pour toutes les colonnes.
FROM
indique la ou les tables à partir desquelles on va obtenir les enregistrements.
ORDER BY
trier des résultats. Vous avez 2 possibilités supplémentaires : par ordre croissant: ASC ou par ordre décroissant: DESC.
LIMIT
limiter le nombre de résultats d'une requête
WHERE
récupérer uniquement les données qui répondent à certains des critères.
DISTINCT
Récupération uniquement d'informations distinctes (les doublons sont ignorés).
BETWEEN
Operateur pour récupérer des données dont les valeurs se situent ENTRE deux valeurs. Les valeurs peuvent être des nombres, du texte ou des dates.
AND|OR
ET et OU ( et XOR exclusif) opérateurs logiques pour évaluer des valeurs.
operator
Pour illustrer les exemples du tableau des opérateurs on prendra A=10 et B =20. Dans le cas de chaines de caractères l'opérateur s'applique sur l'ensemble du champ.
Opérateurs
Description
Exemple
=
Teste l'égalité, si égalité renvoi TRUE. La condition peut s'appliquer aussi bien sur des valeurs numériques que des chaines de caractères.
(A = B) est FALSE
!=
Teste la différence, si différent renvoi TRUE. La condition peut s'appliquer aussi bien sur des valeurs numériques que des chaines de caractères.
(A != B) est TRUE
>
Teste si la première valeur est supérieure à la seconde, si oui renvoi TRUE.
(A > B) est FALSE
<
Teste si la première valeur est inférieure à la seconde, si oui renvoi TRUE.
(A < B) est TRUE
>=
Teste si la première valeur est supérieure ou égale à la seconde, si oui renvoi TRUE.
(A >= B) est FALSE
<=
Teste si la première valeur est inférieure ou égale à la seconde, si oui renvoi TRUE.
(A <= B) is TRUE
Quelques Clauses liées aux recherches de chaines de caractères
Utilisation de LIKE
Dans certains cas il peut être utile de rechercher une chaine de caractères particulière dans un ou des champs particuliers.
Pour cela on va utiliser l'opérateur LIKE. Tout seul il est quasiment identique à l'opérateur =. Son intérêt principal est lorsqu'il est utilisé avec des caractères wildcard : un caractère wildcard pour se substituer à n'importe quel(s) charactère(s) dans une chaine.
Caractères wildcard
wildcard
Actions
%
substitut pour zero ou plus de charactères.
_ (tiret bas)
substitut pour un caractère uniquement.
abcdef
comparaison à une chaine spécifique.
^abcdef
comparaison pour
!abcdef
Identique au précédent
Testez
Pour illustrer notre propos concernant LIKE nous allons tester les différentes combinaisons avec une table dont le nom est "test" et dont les tables et leur contenu sont les suivants :
Construisez votre requête =>
mysql_numrows(); : nombre d'enregistrements disponibles
La fonction mysql_numrows() permet de récupérer le nombre d'enregistrements disponibles suite à une requête SELECT
Syntaxe
int mysql_num_rows ( id_resource ) avec id_resource comme identifiant de la ressource MySQL contenant le résultat.
Exemple lié à notre code php
$NbRecords = mysql_numrows($res); avec $res comme identifiant de la ressource MySQL contenant le résultat suite à l'exécution de la fonction $res = mysql_query(SELECT..).
mysql_fetch_* : Exploiter les résultats
Ces fonctions permettent de récupérer les informations initiées par la requête SELECT
Les différentes possibilités
Fonctions
Commentaires
mysql_fetch_row(P1,P2)
Retourne une ligne de résultat MySQL sous la forme d'un tableau simple (les colonnes sont indexées de 0 à x) ou FALSE s'il n'y a plus de ligne à lire. Le pointeur interne de données est automatiquement déplacé à la ligne suivante aprés chaque lecture (ce qui autorise des boucles comme while pour lire l'ensemble des lignes)
P1 : identifiant de mysql_query().
P2 : identifiant de mysql_connect(). Ce paramètre est facultatif.
mysql_fetch_array(P1,P2)
Retourne une ligne de résultat MySQL sous la forme d'un tableau associatif ou indexé (comme pour mysql_fetch_row), ou les deux et FALSE s'il n'y a plus de ligne à lire. Le pointeur interne de données est automatiquement déplacé à la ligne suivante aprés chaque lecture (ce qui autorise des boucles comme while pour lire l'ensemble des lignes)
P1 : identifiant de mysql_query().
P2 : identifiant de mysql_connect(). Ce paramètre est facultatif.
mysql_fetch_assoc(P1,P2)
comme mysql_fetch_array() mysql_fetch_assoc(P1,P2) lit une ligne de résultat MySQL dans un tableau, mais ce dernier est uniquement associatif. Retoune FALSE s'il n'y a plus de ligne à lire. Le pointeur interne de données est automatiquement déplacé à la ligne suivante aprés chaque lecture.
mysql_fetch_object(P1,P2)
Retourne une ligne de résultat MySQL sous la forme d'un objet ou FALSE s'il n'y a plus de ligne à lire. Le pointeur interne de données est automatiquement déplacé à la ligne suivante aprés chaque lecture
mysql_fetch_object() est identique à mysql_fetch_array(), à la différence qu'elle retourne un objet à la place d'un tableau. On peut ainsi accéder aux valeurs des champs par leur nom, mais plus par leur offset (les nombres n'étant pas des noms MySQL).
Codes php pour les différentes combinaisons de mysql_fetch_*
Fonctions et résultats
Exemples code php
mysql_fetch_row(P1,P2)
Durand
0601020304
Zabrinsky
0604040404
Zabrinsky
0604040505
dupont
0603030303
Durand
0601020304
mysql_fetch_array(P1,P2)
Durand
jean
Zabrinsky
Paul
Zabrinsky
Luc
dupont
lucien
Durand
jean
mysql_fetch_object(P1,P2)
jean
0601020304
Paul
0604040404
Luc
0604040505
lucien
0603030303
jean
0601020304
mysql_free_result() : Libérer la mémoire et les ressources
mysql_free_result() :
libère toute la mémoire et les ressources utilisées par la ressource de résultat result.
retourne TRUE en cas de succès ou FALSE si une erreur survient.
n'est à appeler que si vous avez peur d'utiliser trop de mémoire durant l'exécution de votre script. Toute la mémoire associée à l'identifiant de résultat sera automatiquement libérée.
n’est PAS à utiliser avec des requêtes de type UPDATE, INSERT INTO ou DELETE.
Exemples complets SQL + mysql_fetch_*
Table annuaire de départ
SELECT DISTINCT nom_Colonne(s) FROM nom_Table
On veut lister les noms de l'annuaire sans doublons.
Durand
Zabrinsky
dupont
La requête SQL ramène uniquement les informations contenues dans la colonne nom qui ne font pas doublons entre elles.
L'extraction des informations avec mysql_fetch ne peut porter que sur la colonne nom. $donnees->mobile ne donne aucune information.
On veut lister plusieurs colonne de l'annuaire sans doublons.
Durand
jean
0601020304
Zabrinsky
Paul
0604040404
Zabrinsky
Luc
0604040505
dupont
lucien
0603030303
Dans ce cas la clause DISTINCT s'applique sur les 3 colonnes, c'est pour cela que l'on trouve 2 noms Zabrinsky. Ce ne sont pas des doublons car les prénoms et les numéros de téléphone diffèrent.
UPDATE : Mettre à jour des données
Syntaxe
UPDATE table_name SET column1=value, column2=value,... WHERE some_column=some_value
DELETE : Effacer des données
Syntaxes
DELETE FROM table_name WHERE some_column=some_value
DELETE FROM table_name (Note: Deletes the entire table!!)
DELETE * FROM table_name (Note: Deletes the entire table!!)
ALTER Table : Editer une table
Une fois que la table est créée on peut la modifier en utilisant ALTER TABLE.
Modifier le nom d'une table
Supprimer une colonne particulière
ALTER TABLE testalter_tbl DROP i
Ajouter une colonne
1er colonne
ALTER TABLE testalter_tbl ADD i INT FIRST;
Aprés la colonne c
ALTER TABLE testalter_tbl ADD i INT AFTER c;
Changer le type de la colonne c
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
Changer le nom et le type d'une colonne
ALTER TABLE testalter_tbl CHANGE i j BIGINT
Attribut NULL et par default
Lors de la modification ou du changement de type d'une colonne, on peut aussi spécifier si la colonne doit ou ne doit pas contenir de valeurs nulles (NULL), et quel doit être la valeur par défaut. Si vous ne faites pas celà MySQL assignera automatiquement les valeurs à NULL.
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
Changer la valeur par défaut d'une colonne
Initier la valeur par défaut
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
Supprimer la valeur par défaut
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
Gérer les erreurs
Comment recevoir un retour de MySQL lorsque PHP rencontre un problème ?
Réponse : Lorsque l'on travaille avec PHP et MySQL et que survient une erreur, il est interessant de disposer d'informations détaillées sur le problème qui est survenu. Pour cela on peut utiliser mysql_error ( ) à partir de la page PHP. La syntaxe est la suivante : mysql_error ( [link_identifier] )
Exemples
mysql_connect("la page", "login", "password") or die(mysql_error());
Cela retournera une erreur lors d'un problème survenu lors de la connexion à la base de données.
$value = mysql_query($your_query) or die("Une erreur MySQL est survenue. mysql_query : " . $your_query . " Erreur: (" . mysql_errno() . ") " . mysql_error());
Lors d'une erreur, cela retournera un message personnalisé (Une erreur MySQL error est survenue. ) suivi par un numéro de ligne, et l'erreur courante.