Exercices
Questions à choix multiple

Leçon N° 09 : Mysql première partie : introduction

Présentation de Mysql
Introduction aux bases de données
Relations
Création d'une base de données
Types de données pour les tables mysql
Comment fonctionne le couple PHP/MySQL
Fonctions PHP pour acceder à une base mysql
Premiers exemples de programme PHP avec Mysql
Notes de page

Présentation de Mysql

MySQL est le moteur de base de donnée libre de droits le plus connu , largement reconnu pour sa rapidité et sa fiabilité. Il peut être téléchargé sur www.mysql.com Vous verrez sur ce site les succès journaliers remportés par cette base de données auprès des grands noms de l'industrie mondiale (elle est disponible pour des plateformes d'UNIX et de Windows). A ce jour environ 4 millions d'installations MySQL au monde et les sources sont téléchargées 30.000 fois par jour ...

Introduction aux bases de données

Chaque base de données se compose d'une ou plusieurs "tables" - ces tables, qui structurent des données dans des lignes et des colonnes, servent à organiser les données.
Exemple de table:
Membre_idPrénomNomTelEmail
1MarcMartin12454545martin@jacques.com
2LéaMartin252225lea@iletaitunefois.com
3ZoéDurand454545zoé@toto.com
4ClaireDupond56565656claire@rustine.com

Relations

MySQL est "un système de gestion de base de données relationnelle", ou RDBMS. Une base de données relationnelle se compose de tables multiples, qui contiennent les informations en corrélation. Le SQL (Software Query Language) permet de combiner les données de ces tables de différentes façons, de façon à gérer les rapports entre ces données. Considérez l'exemple suivant, qui ajoute deux tables supplémentaires - la seconde contient une liste de films disponibles pour la location, alors que la troisième lie les films avec les membres par l'intermédiaire de leurs clefs primaires.

Memebre_idPrenomNomTelelephoneEmail
1MarcMartin12454545martin@jacques.com
2LéaMartin252225lea@iletaitunefois.com
3ZoéDurand454545zoé@toto.com
4ClaireDupond56565656claire@rustine.com

Video_idTitreProducteur
1My Fair LadyAudrey Hepburn
2NapoléonChristian Clavier
3Leçons de séductionJeff Bridges
4Holy SmokeJane Campion
5L'enfant des lumièresDaniel Vignes
6On connait la chansonAlain Resnais

Membre_idVideo_idDate_location
2610/09/2003
4215/09/2003
1118/09/2003
1220/09/2003
1322/09/2003

Si l'on regarde la troisième table, on voit qu'elle lie chaque membre ayant emprunté des films avec les films qu'il a loué.
Ainsi nous voyons que Léa Martin (le membre # 2) a loué "On connait la chanson" (vidéo # 6), tandis que Marc Martin(le membre # 1) a loué "My Fair Lady" (vidéo # 1), "Napoléon" (vidéo #2) et "Leçons de séduction " (vidéo # 3).
En d'autres termes, la troisième table a créé un lien entre certains enregistrements de la première table de des enregistrements de la seconde table : C'est le concept fondamental d'un système de base de données relationnelle. Il est évident que dans un tel système le nombre de tables n'est pas limité, par exemple dans la réalité, comme un producteur réalise en général plusieurs films, dans la première table, au lieu de mettre le nom du producteur, on aurait certainement mieux fait de prévoir un pointeur vers la table des producteurs
Le principal avantage d'un tel système est d'eviter la duplication des données. Ceci évite une perte de place mais surtout des risques d'erreurs. Si l'on ressaisissait le nom d'un membre à chaque emprunt :

Création d'une base de données

Nous supposerons mysql et phpmyadmin installés comme indiqué dans le manuel joint au CD
Note : Si vous projetez de transferrer votre site sur Internet par l'intermédiaire d'un prestataire, il est fortement conseillé, pour les noms de base de données et surtout de table (en général le nom de base de données est imposé par le prestataire) de ne pas utiliser d'espace, ni d'accent, ni de caractère spécial autre que le souligné
Les noms de tables sont en fait des noms de fichiers, donc il faut absolument respecter la "casse" lors de la création et la désignation des tables, afin d'assurer la portabilité sur linux.Il faut aussi ne pas mettre de caractères accentués dans le nom des tables
Lors de la création d'une table, trois fichiers sont créés dans le dossier mysql/data/nom_de_la_base/ :

Types de données pour les tables mysql

La commande mySQL pour céer une table est la suivante :
mysql> CREATE TABLE members (member_id INT(11) NOT NULL AUTO_INCREMENT,
nom VARCHAR(50) NOT NULL, prenom VARCHAR(50) NOT NULL, telephone VARCHAR(15),
email VARCHAR(50) NOT NULL, PRIMARY KEY (member_id));
Query OK, 0 rows affected (0.05 sec)

On voit que chaque nom de champ est suivi de son "type" qui identifie quel type de données pourra contenir le champ.
MySQL supporte un large nombre de types de colonne, qui peuvent être rassemblés en trois groupes : les nombres, les dates et les chaînes de caractères.
Cette section présente les types disponibles et leurs tailles de stockage, puis présente en détail chaque type. L'introduction est volontairement brève. Une section plus précise est dédiée à chaque type, qui présente tous les formats valides. Les types de colonnes de MySQL sont listés ci-dessous. Les codes suivants sont utilisés dans les descriptions : M Indique la taille maximale d'affichage. Le maximum légal d'affichage est de 255. D S'applique aux nombres à virgule flottante, et indique le nombre de décimales, qui suivent la virgule. Le nombre maximum est de 30, mais ne doit pas être plus grand que M-2. Les crochets (`[' et `]') indiquent les spécifications optionnelles. Notez que si vous spécifiez ZEROFILL pour une colonne, MySQL ajoutera automatiquement l'attribut UNSIGNED à la colonne.
TINYINT[(M)] [UNSIGNED] [ZEROFILL] Un très petit entier. S'il est signé, il peut prendre les valeurs de -128 à 127. S'il est non signé, il peut prendre les valeurs de 0 à 255.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] Un petit entier. S'il est signé, il peut prendre les valeurs de -32768 à 32767. S'il est non signé, il peut prendre les valeurs de 0 à 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] Un entier de taille moyenne. S'il est signé, il peut prendre les valeurs de -8388608 à 8388607. S'il est non signé, il peut prendre les valeurs de 0 à 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL] Un entier. S'il est signé, il peut prendre les valeurs de -2147483648 à 2147483647. S'il est non signé, il peut prendre les valeurs de 0 à 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL] C'est un synonyme de INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL] Un grand entier. S'il est signé, il peut prendre les valeurs de -9223372036854775808 à 21474839223372036854775807647. S'il est non signé, il peut prendre les valeurs de 0 à 18446744073709551615. Notez que toute l'arithmétique est faite avec les valeurs de type de BIGINT signés ou DOUBLE, alors il ne faut pas utiliser les valeurs BIGINT non signés plus grande que 9223372036854775807 (63 bits), hormis avec les fonctions de bits. Notez que `-', `+', et `*' utiliseront l'arithmétique des BIGINT lorsque les deux arguments sont des INTEGER! Cela signifie que si vous multiplier deux grands entiers ensembles (ou bien des résultats de fonctions qui retournent des grands entiers), vous risquez d'avoir des résultats plus grands que 9223372036854775807.
FLOAT(précision) [ZEROFILL] Un nombre à virgule flottante. Ils doivent être signés. précision<=24 pour un nombre à virgule flottante de précision simple, entre 25 et 53 pour une précision double. Ces types correspondent aux types FLOAT et DOUBLE décrits ci-dessus. FLOAT(X) a le même intervalle de validité que FLOAT et DOUBLE, mais la taille d'affichage et le nombre de décimale sont indéfinies. En MySQL Version 3.23, c'est un véritable nombre à virgule flottante. Dans les anciennes versions de MySQL, FLOAT(précision) avait toujours deux décimales. Notez que l'utilisation du type FLOAT peut vous créer des problèmes inattendus car tous les calculs internes de MySQL sont fait en double précision. Cette syntaxe est fournie pour assurer la compatibilité ODBC.
FLOAT[(M,D)] [ZEROFILL] Un petit nombre à virgule flottante (précision simple). Il doit être signé. L'intervalle de validité va de -3.402823466E+38 à -1.175494351E-38, 0, et de 1.175494351E-38 à 3.402823466E+38. M représente la taille d'affichage et D est le nombre de décimales. FLOAT sans argument, ou avec un argument <= 24 représente un nombre à virgule flottante de précision simple.
DOUBLE[(M,D)] [ZEROFILL] Un nombre à virgule flottante (précision double). Il doit être signé. L'intervalle de validité va de -1.7976931348623157E+308 à -2.2250738585072014E-308, 0, et de 2.2250738585072014E-308 à 1.7976931348623157E+308. M représente la taille d'affichage et D est le nombre de décimales. FLOAT sans argument, ou avec un argument compris entre 25 et 53 (inclus) représente un nombre à virgule flottante de précision double.
DOUBLE précision[(M,D)] [ZEROFILL] REAL[(M,D)] [ZEROFILL] Ce sont des synonymees de DOUBLE.
DECIMAL[(M[,D])] [ZEROFILL] Un nombre à virgule flottante. Il doit être signé. Ce type se comporte comme une colonne de type CHAR : la valeur est stockée comme une chaîne, chaque caractère représentant un chiffre de la valeur. La virgule et le signe `-' des nombres négatifs ne sont pas comptés dans l'option M (mais de l'espace de stockage est réservé pour eux). Si D vaut 0, les valeurs n'auront pas de valeur décimale. L'intervalle de validité des valeurs DECIMAL est le même que DOUBLE, mais il peut être limité par les valeurs choisies pour M et D. Si D est omis, il vaut par défaut 0. Si M est omis, il vaut par défaut 10. Notez qu'en MySQL Version 3.22, l'argument M devait inclure les tailles nécessaires pour stocker les virgules et signes négatif.
NUMERIC(M,D) [ZEROFILL] C'est un synonyme de DECIMAL.
DATE Une date. L'intervalle de validité va de '1000-01-01' à '9999-12-31'. MySQL affiche les valeurs DATE au format 'AAAA-MM-JJ' (année-mois-jour), mais vous pouvez assigner des valeurs aux colonnes DATE en utilisant différents formats numériques ou en chaînes de caractères.
DATETIME Une combinaison de date et d'heure. L'intervalle de validité va de '1000-01-01 00:00:00' à '9999-12-31 23:59:59'. MySQL affiche les valeurs DATETIME au format 'AAAA-MM-JJ HH:MM:SS' (année-mois-jour heure:minutes:seconde), mais vous pouvez assigner des valeurs aux colonnes DATE en utilisant différents formats numériques ou en chaînes de caractères.
TIMESTAMP[(M)] Un timestamp. L'intervalle de validité va de '1970-01-01 00:00:00' à quelque part durant l'année 2037. MySQL affiche les valeurs de type TIMESTAMP au format AAAAMMJJHHMMSS, AAMMJJHHMMSS, AAAAMMJJ, ou AAMMJJ, suivant que le paramètre M vaut 14 (ou omis), 12, 8, ou 6, mais vous pouvez assigner des valeurs aux colonnes TIMESTAMP sous forme de nombre ou de chaînes. Une colonne de type TIMESTAMP est pratique pour enregistrer une date, lors d'une commande INSERT ou UPDATE, car elle est automatiquement mis à la date et l'heure du moment de la commande, si vous ne fournissez pas de valeur vous-même. Vous pouvez aussi lui donner la date et l'heure courante en lui assignant la valeur NULL. 7.3.3 Dates et heures. Un TIMESTAMP est toujours stocké sur 4 octets. L'argument M n'affecte que le mode d'affichage des TIMESTAMP. Notez bien que les colonnes de type TIMESTAMP(X) où X vaut 8 ou 14 sont considérées comme des nombres tandis que les autres colonnes TIMESTAMP(X) sont considérées comme des chaînes. Ceci est fait pour s'assurer que l'on peut exporter et importer les tables avec ces types.
TIMEUne heure. L'intervalle de validité va de '-838:59:59' à '838:59:59'. MySQL affiche les colonnes de type displays TIME au format 'HH:MM:SS', mais vous pouvez assigner une valeur de type TIME en lui passant des chaînes ou des entiers.
YEAR[(2|4)] Une année au format 2 ou 4 chiffres (par défaut, c'est 4 chiffres). L'intervalle de validité va de 1901 à 2155, pour le format à 4 chiffres, et de 1970 à 2069 pour le format à deux chiffres. MySQL affiche les valeurs de type YEAR au format AAAA, mais vous pouvez leur assigner des chaînes ou des nombres (le type YEAR est nouveau depuis la version 3.22 de MySQL).
[NATIONAL] CHAR(M) [BINARY] Une chaîne de caractères de taille fixe, et toujours complétée à droite par des espaces, lors du stockage. Le paramètre M peut valoir de 1 à 255 caractères. Les espaces terminaux sont supprimés lorsque la chaîne est lue dans la base. Les valeurs de type CHAR sont triées et comparées sans tenir compte de la casse et en utilisant le jeu de caractères par défaut. Toutes fois, vous pouvez utiliser l'opérateur BINARY pour effectuer des recherches sensibles à la casse.
NATIONAL CHAR (forme courte : NCHAR) est la dénomination ANSI SQL pour les colonnes de type CHAR qui doivent utiliser le jeu de caractères par défaut. C'est la configuration par défaut de MySQL. CHAR est une forme courte pour CHARACTER. MySQL autorise la création de colonne de type CHAR(0). Cela ne sert réellement que si vous devez être compatibles avec une vieille application, dont le bon fonctionnement repose sur l'existence de la colonne, mais qui n'utilise pas vraiment ses valeurs. C'est aussi pratique lorsque vous devez stocker un booléen (ou une valeur à deux états) dans une colonne : une colonne de type CHAR(0), qui n'a pas 'attribut NOT NULL, n'occupera qu'un seul octet, et peut prendre deux valeurs : NULL et "".
[NATIONAL] VARCHAR(M) [BINARY] Une chaîne de caractères de longueur variable. NOTE: les espaces terminaux sont supprimés lors du stockage des valeurs ( ce qui diffère des spécifications ANSI SQL). L'intervalle de taille de M va de 1 à 255 caractères. Les valeurs de type VARCHAR sont triées et comparées sans tenir compte de la casse et en utilisant le jeu de caractères par défaut. Toutes fois, vous pouvez utiliser l'opérateur BINARY pour effectuer des recherches sensibles à la casse.
TINYBLOB TINYTEXT Un TINYBLOB ou TINYTEXT est une colonne de taille maximale 255 (2^8 - 1) caractères.
BLOB TEXTUn BLOB ou TEXT est une colonne de taille maximale 65535 (2^16 - 1) caractères.
MEDIUMBLOB MEDIUMTEXT Un MEDIUMBLOB ou MEDIUMTEXT est une colonne de taille maximale 16777215 (2^24 - 1) caractères.
LONGBLOB LONGTEXT Un LONGBLOB ou LONGTEXT est une colonne de taille maximale 4294967295 (2^32 - 1) caractères.
ENUM('value1','value2',...) Une énumération. Une chaîne de caractères qui n'a qu'une seule valeur, issue d'une liste : 'valeur1', 'valeur2', ..., ou encore la valeur NULL ou la valeur d'erreur spéciale "". Une énumération ENUM peut prendre un maximum de 65535 valeurs distinctes.
SET('value1','value2',...) Un ensemble. Une chaîne de caractères qui a zéro, un ou plusieurs valeurs issues d'une liste : 'valeur1', 'valeur2', .... Un ensemble SET peut avoir un maximum de 64 éléments.

Les index et les clés

Le couple PHP/MySQL

Le paragraphe suivant donne la liste des différentes fonctions PHP qui, associées à des instructions MySQL, permettent de manipuler des "objets" MySQL : données, ou éléments de structure tels que bases, tables, champs...
De l'imbrication des deux langages, résulte une relative complexité qui fait que la manipulation de ces objets n'est pas toujours très intuitive.
Anatomie d'une commande PHP/MySQL :
Valeur_de_retour = mysql_query("Commande MySQL");

On récupère une valeur booléenne dans la valeur de retour :
Exemple pour créer une table:
<?
$result = MYSQL_QUERY("CREATE TABLE membres (membre_id INT NOT NULL AUTO_INCREMENT,
        membre_prenom TINYBLOB,
        membre_nom TINYBLOB,
        primary KEY (membre_id) , INDEX (membre_id))") ;
?>
On peut mettre autant de retour à la ligne que l'on veut dans la commande MySQL, il est même conseillé de le faire, car en cas d'erreur, le N° de ligne renvoyé est calculé par rappoort à la requête MySQL, donc si vous avez toute la requête sur une seule ligne, et si vous avez une erreur, le message indiquera toujours une erreur à la ligne 1.
Le texte de la requête est toujours entre guillemets, ou sinon vous pouvez le mettre dans une variable.

Exemple pour lire une table : se fait en deux fois, extraction , puis affichage :
<?
$result = MYSQL_QUERY("SELECT membre_nom, membre_prenom FROM membres "); //extraction
while ($row=MYSQL_FETCH_ARRAY($result))
{
    echo "Nom $row[membre_nom] Tel. $row[membre_tel]";
}
?>
MYSQL_FETCH_ARRAY est l'instruction qui permet d'extraire les données du tableau $result : un mécanisme automatique permet, chaque fois que cette instruction est éxecutée, d'incrémenter un pointeur interne positionné sur la ligne que l'on est en train de lire, autrement dit, chaque fois que cette instruction est éxecutée, vous obtenez une nouvelle ligne tant que la fin du tableau $row n'est pas atteinte.
Comme ci-dessus, si $result est à "Vrai" (il contient des données) après l'exécution de la requête, c'est que celle-ci s'est déroulée sans erreur, si $result est à 0 (faux) c'est qu'une erreur s'est produite lors de l'éxecution de la requête.
On peut aussi utiliser la fonctiondie() pour renvoyer un message d'erreur éventuel ou appeler une autre fonction:
<?
    $result_6 = MYSQL_QUERY("SELECT * FROM membres ") or die("Erreur lors de la requête N° 6");//..
?>
Un premier exemple simple sur les départements
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_d1_create_table_departements.php
Lire de la table des départements
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_d3_liste_departements.php
Utilisation de la table des départements N°1
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_d2_departements.php
Utilisation de la table des départements N°2
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_d4_departements.php
Création de la table des membres
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_a1_create_table_members.php
Création de la table des vodéos
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_a2_create_table_videos.php
Création de la table des emprunts
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_a3_create_table_loans.php

Fonctions PHP pour acceder à une base mysql

mysql_affected_rows Retourne le nombre de lignes affectées lors de la dernière requête SQL.
mysql_change_user Change le nom de session de l'utilisateur actif.
mysql_close Ferme la connexion MySQL.
mysql_connect Ouvre une connexion à un serveur MySQL.
mysql_create_db Crée une base de données MySQL.
mysql_data_seek Déplace le pointeur interne de résultat.
mysql_db_name Lit les noms des bases de données
mysql_db_query Envoie une requête MySQL à un serveur MySQL.
mysql_drop_db Efface une base de données MySQL.
mysql_errno Retourne le numéro de message d'erreur de la dernière opération MySQL.
mysql_error Retourne le texte associé avec l'erreur générée lors de la dernière requête.
mysql_escape_string Protège une chaîne pour la passer à mysql_query.
mysql_fetch_array Retourne une ligne de résultat sous la forme d'un tableau associatif.
mysql_fetch_assoc Lit une ligne de résultats dans un tableau associatif
mysql_fetch_field Retourne les données enregistrées dans une colonne sous forme d'objet.
mysql_fetch_lengths Retourne la taille de chaque colonne d'une ligne de résultat.
mysql_fetch_object Retourne les lignes résultats sous la forme d'un objet.
mysql_fetch_row Retourne une ligne de résultat sous la forme d'un tableau.
mysql_field_flags Retourne le sémaphore associé à la colonne spécifiée dans le résultat courant.
mysql_field_name Retourne le nom d'une colonne
mysql_field_len Retourne la longueur du champs spécifié.
mysql_field_seek Déplace le pointeur de résultat
mysql_field_table Retourne le nom de la table où se trouve une colonne
mysql_field_type Retourne le type de la colonne spécifiée dans le résultat courant.
mysql_free_result Efface le résultat de la mémoire.
mysql_insert_id Retourne l'identifiant généré par la dernière requête INSERT.
mysql_list_dbs Liste les bases de données disponibles sur le serveur MySQL.
mysql_list_fields Liste les champs du résultat MySQL.
mysql_list_tables Liste les tables d'une base de données.
mysql_num_fields Retourne le nombre de champs d'un résultat.
mysql_num_rows Retourne le nombre de lignes d'un résultat.
mysql_pconnect Ouvre une connexion persistante à un serveur MySQL.
mysql_unbuffered_query Exécute une requête SQL sans mobiliser les résultats
mysql_query Envoie une requête SQL à un serveur MySQL.
mysql_result Retourne un champs d'un résultat.
mysql_SELECT_db Sélectionne une base de données MySQL.
mysql_tablename Lit le nom de la table qui contient le champs spécifié.
mysql_get_client_info Lit les informations sur le client MySQL
mysql_get_host_info Lit les informations sur l'hôte MySQL
mysql_get_proto_info Lit les informations sur le protocole MySQL
mysql_get_server_info Lit les informations sur le serveur MySQL

Exemples

Saisie dans la table des membres
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_b1_load_table_members.php
Saisie dans la table des vidéos
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_b2_load_table_videos.php
Saisie dans la table des emprunts
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_b3_load_table_loans.php
Lecture de la table des membres
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_c1_read_table_members.php
Lecture de la table des vidéos
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_c2_read_table_videos.php
Lecture de la table des emprunts
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_c3_read_table_loans.php

Exemples de transfert texte--> Mysql et vice-versa pour publication sur le web

Si vous avez des données dans des tables MySQL, ou MS Accès ou issues d'autres bases de données sur votre PC et que vous voulez les transférer sur une base MySQL sur un site internet, vous n'avez pas la possibilité de copier directement la table d'une base dans l'autre; il faut alors passer par un fichier texte Transfer texte-->Mysql
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_data_load.php
Transfer Mysql -->Texte
Nom du fichier : ../commons/show_exercises.php?exercise=lesson_09_data_unload.php

Tous droits réservés. 2005-2008