Fiche PHP : PHP et MYSQL(requêtes SQL)

Objet de la fiche

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.

État de la fiche Terminée validée


Plan de la fiche :

Avant propos

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

FonctionsFonctionsFonctionsFonctionsFonctions
mysql_affected_rows
mysql_client_encoding
mysql_close
mysql_connect
mysql_create_db
mysql_data_seek
mysql_db_name
mysql_db_query
mysql_drop_db
mysql_errno
mysql_error
mysql_escape_string
mysql_fetch_array
mysql_fetch_assoc
mysql_fetch_field
mysql_fetch_lengths
mysql_fetch_object
mysql_fetch_row
mysql_field_flags
mysql_field_len
mysql_field_name
mysql_field_seek
mysql_field_table
mysql_field_type
mysql_free_result
mysql_get_client_info
mysql_get_host_ info
mysql_get_proto_ info
mysql_get_server_info
mysql_info
mysql_insert_id
mysql_list_dbs
mysql_list_fields
mysql_list_processes
mysql_list_tables
mysql_num_fields
mysql_num_rows
mysql_pconnect
mysql_ping
mysql_query
mysql_real_escape_string
mysql_result
mysql_select_db
mysql_set_charset
mysql_stat
mysql_tablename
mysql_thread_id
mysql_unbuffered_query

mysql_connect() : Connexion à la base

Pré-requis

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 OU COMMENT")

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

ClausesCommentaires
*pour toutes les colonnes.
FROMindique la ou les tables à partir desquelles on va obtenir les enregistrements.
ORDER BYtrier des résultats. Vous avez 2 possibilités supplémentaires : par ordre croissant: ASC ou par ordre décroissant: DESC.
LIMITlimiter le nombre de résultats d'une requête
WHERErécupérer uniquement les données qui répondent à certains des critères.
DISTINCTRécupération uniquement d'informations distinctes (les doublons sont ignorés).
BETWEENOperateur 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|ORET 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érateursDescriptionExemple
=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
wildcardActions
%substitut pour zero ou plus de charactères.
_ (tiret bas)substitut pour un caractère uniquement.
abcdefcomparaison à une chaine spécifique.
^abcdefcomparaison pour
!abcdefIdentique 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.
Durandjean0601020304
ZabrinskyPaul0604040404
ZabrinskyLuc0604040505
dupontlucien0603030303
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.

 Application au projet de site web


Respectons la propriété intellectuelle