Vous êtes sur la page 1sur 39

Construire une base de donnes simple avec PHP et MySQL

by GF on 25 SEPTEMBER 2005

Cet article constitue un tutoriel simple et rapide montrant comment construire une base de donnes en utilisant les technologies PHP et MySQL. Cette base de donnes sera accessible depuis internet laide dun navigateur.

Nous allons aborder les points suivants:


Quallons-nous faire ? Comment le faire ? Etape 1: Crer la base de donnes. Etape 2: Ajouter une entre dans la base de donnes. Etape 3: Afficher les entres de la base de donnes. Etape 4: Rechercher des entres dans la base de donnes. Etape 5: Modifier et supprimer une entre dans la base de donnes. Bonus: Scuriser laccs { la base de donnes.

Quallons-nous faire ?
Nous allons crer une base de donnes, et un logiciel permettant dexploiter cette base de donnes. Une base de donnes stocke des informations remplissant certains critres. Elle permet de trier les informations quelle contient selon ces critres. Imaginez-vous un tableau Excel: des colonnes et des lignes. Une base de donnes fonctionne exactement sur le mme principe.

En effet, si nous voulons stocker les informations nom, prnom et ge pour diffrentes personnes, il nous faudra crer 3 colonnes, une pour chaque information; et X lignes, une par personne.

Cette illustration reprsente la structure de la base de donnes que nous allons crer:

Colonne 1 Colonne 2 Colonne 3 Nom Prnom ge Ligne 1 Martin Pierre 42 Ligne 2 Dupont Pierre 38 Lignes n
Vous laurez compris, le nombre de colonnes est fixe, tandis que le nombre de lignes est indtermin: un nouvel enregistrement dans la base de donnes reprsente une ligne supplmentaire.

Pour comprendre les mcanismes de fonctionnement des bases de donnes, vous pouvez vous exercer crer des feuilles de calcul sous Excel (ou un autre tableur) et manipuler les donnes quelles contiennent. Excel se comporte en effet comme une base de donnes en stockant et manipulant les informations { la manire dune base de donnes.

Dans le tableau ci-dessus, jai omis une colonne. Il sagit de la colonne identifiant (nous lappellerons id). A chaque ligne de cette colonne id est attribu un chiffre ou un nombre. Le premier enregistrement de la base de donnes aura ainsi lidentifiant 1, le second aura lidentifiant 2, et ainsi de suite. Lid permet par la suite de manipuler les lignes trs facilement.

Une dernire prcision importante: chaque colonne naccepte quun type prcis de donnes. Dans notre cas, la colonne id ne devra stocker que des nombres entiers, les colonnes nom et prnom des chanes de texte (que nous appellerons dornavant string), et la colonne ge un nombre entier (que nous appellerons int de langlais integer). Il est absolument ncessaire de bien dterminer ds le dbut de la conception dune base de donnes le type de donnes stockes dans chaque colonne. En effet, si lon veut trier les enregistrements suivant le critre ge, et quun enregistrement contient, pour cette colonne, un string au lieu dun entier, le tri ne pourra pas avoir lieu correctement. Dupont est-il infrieur ou suprieur 52 ? Impossible dire, on ne peut comparer que des donnes du mme type.

Comment le faire ?
Il existe de nombreuses manires de construire une base de donnes. En effet, chaque base de donnes repose sur un serveur, et il existe une multitude de serveurs diffrents. Parmi les plus clbres: Oracle, Sybase, Access, FileMaker, PostgreSQL et MySQL. Les deux premiers sont des serveurs professionnels qui cotent plusieurs centaines de milliers deuro et qui sont destins { stocker des millions denregistrements. Access et FileMaker sont des serveurs propritaires qui ne fonctionnent que par le biais dun logiciel que vous devez installer sur votre systme. Enfin, les deux derniers sont gratuits et permettent une consultation par internet grce { lintgration du langage de requtes (SQL, le langage permettant de donner ses instructions au serveur) la technologie web PHP.

Nous allons donc voir dans un premier temps comment fonctionnent les changes entre serveur et client, pour voir ensuite ce que sont MySQL, SQL et PHP et, enfin, comprendre comment tous ces lments simbriquent les uns dans les autres.

Internet: dialogue entre un client et un serveur

Vous tapez une adresse dans la barre dadresse de votre navigateur, et vous appuyez sur Entre. La page se charge { lcran. Cela parat simple, mais il sagit en ralit du rsultat dun dialogue entre client (votre navigateur) et serveur (lordinateur qui contient linformation que vous demandez).

Lorsque vous appuyez sur Entre, votre navigateur contacte le serveur qui gre ladresse que vous avez tape. Le serveur vous envoie linformation demande, et le navigateur laffiche. Imaginez un fichier Word: vous double-cliquez dessus, il souvre dans Word, et vous pouvez ainsi le lire. Dans notre cas, le client dit au serveur je veux voir tel document, ce qui correspond au double-clic. Le serveur envoie alors ce document au navigateur qui linterprte et laffiche { lcran. Il linterprte car, au mme titre que votre fichier Word, cest un fichier qui est envoy du serveur au navigateur. Ce fichier est crit dans un langage de programmation spcial que reconnat le navigateur. Ce langage est le HTML. Le navigateur reoit par exemple linformation suivante: <i>Bonjour</i>. Il sait que tout texte compris entre la balise <i> et la balise </i> devra tre affich en italique. Il affichera donc: Bonjour !. Il est particulirement important pour la suite de comprendre ce mcanisme: le serveur met un document rempli de texte (le code source dfinissant la mise en page et la prsentation, et le contenu lui mme), il ne traite pas ce texte. Cest le navigateur qui traite ce texte, et linterprte pour afficher le rsultat attendu.

MySQL, SQL, PHP ?


Le principe du PHP, un autre langage de programmation, est tout fait diffrent. En effet, dans ce cas cest le serveur qui excute le code source et qui renvoit le rsultat au navigateur. Le serveur ne se contente pas denvoyer les donnes, il les analyse et leur applique un traitement avant de les envoyer. On dit que le PHP sxcute ct serveur alors que le HTML est trait ct client.

Vous remarquerez que je nemploie pas le verbe sexcuter pour parler du HTML. Il sagit l{ dune autre diffrence -majeure- entre le HTML et le PHP: le HTML nest pas excutable, il est purement statique. En dautres termes, alors que le HTML se borne { dcrire une situation de faits (tel mot est en italique, telle phrase est en gras, telle image doit tre affiche, etc.), le PHP peut avoir des comportements qui produisent des effets sous certaines conditions. Par exemple: si le nom estDupont, alors il devra tre affich en rouge. Le PHP est le langage que nous allons utiliser pour le traitement du contenu de la base de donnes.

MySQL est le nom du serveur de base de donnes. Cest un logiciel install sur le serveur qui interprte et excute les requtes qui lui sont soumises grce au langage SQL. Par exemple, le code suivant permet de retenir, dans la base de donnes appele mabase, tous les prnoms des personnes qui

ont plus de 40 ans, en rejetant les prnoms des personnes qui ne remplissent pas ce critre: SELECT

prenoms FROM mabase WHERE age > 40.

Conjonction de ces lments


Si vous avez compris les explications ci-dessus, vous devriez comprendre les deux phrases suivantes: Le contenu et la structure de la base de donnes seront stocks sur le serveur MySQL auquel accderont des fonction PHP utilisant le langage SQL. La formation des requtes SQL se fera grce des oprations logiques ralises en PHP, et laffichage des rsultats de ces requtes se fera grce un code HTML gnr par dautres fonctions PHP.

Etape 1: Crer la base de donnes


Connexion au serveur de base de donnes
Je suppose que votre base de donnes existe dj, mais ne contient aucune donne. Lorsque vous activez MySQL chez un hbergeur Web, une base de donnes associe votre compte est automatiquement cre. Cependant, elle ne contient aucune table. Une table est le conteneur dun ensemble de colonnes et lignes. Nous allons nous connecter { la base de donnes, et crer la table utile cet exercice. Crez donc un fichier appel connexion.php:

1. <?php 2. $host = "localhost"; /* L'adresse du serveur */ 3. $login = ""; /* Votre nom d'utilisateur */ 4. $password = ""; /* Votre mot de passe */ 5. $base = ""; /* Le nom de la base */ 6. 7. function connexion() 8. { 9. global $host, $login, $password, $base; 10. $db = mysql_connect($host, $login, $password); 11. mysql_select_db($base,$db); 12. } 13. ?>
La ligne 1 contient le tag ou balise en franais qui permet de dterminer le type de script utilis: il sagit de PHP. La ligne 13 informe le serveur que le script est termin.

Les lignes 2 { 5 dfinissent des variables. Par exemple, votre login ou nom dutilisateur est pierre_martin_128765b. Vous assignez cette valeur { la variable $login pour qu{ chaque fois que vous fassiez rfrence { $login le serveur comprenne pierre_martin_128765b. De mme pour les autres valeurs.

La ligne 7 marque la cration dune fonction. Une fonction regroupe une srie dinstructions qui seront excutes ds que cette dernire est apple. Ainsi, au lieu dcrire les lignes 9, 10 et 11, vous crirez dornavant connexion();. Les lignes 8 et 12 prsentent des accolades qui dlimitent la porte de la fonction: elle englobe toutes les lignes entre ces accolades.

Cration de la table
Crez ensuite un autre fichier appel installation.php:

1. <?php 2. include("connexion.php"); 3. 4. connexion(); 5. 6. $sql= "CREATE TABLE IF NOT EXISTS `mabase` ("; 7. $sql .= "`id` int(11) NOT NULL auto_increment,"; 8. $sql .= "`nom` text NOT NULL,"; 9. $sql .= "`prenom` text NOT NULL,"; 10. $sql .= "`age` int NOT NULL,"; 11. $sql .= "PRIMARY KEY (`id`),"; 12. $sql .= "UNIQUE KEY `id_2` (`id`),"; 13. $sql .= "KEY `id` (`id`)"; 14. $sql .= ") ENGINE=MyISAM;"; 15. 16. mysql_query($sql) or die(mysql_error()); 17. ?>
A la ligne 2, par linstruction include(connexion.php);, nous incluons le contenu de ce fichier dans le fichier courant. Nous pourrons ainsi accder son contenu, notamment en appelant la fonction connexion() la ligne 4. Les lignes 6 14 contiennent les instructions de formation de la requte SQL. La requte est dcoupe et insre dans la variable $sql. Notez que le symbole exmploy est .= qui signifieajoutez ce qui suit la fin de la variable, aprs ce quelle contient dj. A la ligne 6, nous crons la table, si elle nexiste pas dj{, et nous lui donnons le nom mabase. A la ligne 7, nous insrons dans la table la colonne id de type int (entier), qui ne peut pas tre une valeur nulle et qui sincrmente automatiquement { chaque nouvel ajout dans la base de donnes. Cet lment, id, sera la cl qui identifie chaque enregistrement (lignes 11 13). A la ligne 8 nous insrons la colonne nom de type texte et qui ne peut tre nulle. La ligne 14 dtermine le type de table, thme qui dpasse lobjet de cet article.

La ligne 16 soumet la requte forme la base de donnes, et affiche une ventuelle erreur { lcran.

Etape 2: Ajouter une entre dans la base de donnes


Utilisation des variables et formation de la requte SQL
Quand on ajoute une entre dans la base de donnes, une nouvelle ligne est cre. A chaque colonne de cette nouvelle ligne est assigne une valeur.

Nous allons donc utiliser une requte SQL pour attribuer une valeur chaque colonne de la nouvelle ligne: INSERT INTO mabase(id,nom,prenom,age)

VALUES(,Martin,'Pierre,42). En franais, cela donnerait: Insrez dans la table


appele mabase, respectivement pour les colonnes id, nom, prnom et age, les valeurs (vide), Martin, Pierre et 42. Nous avons vu que le langage PHP utilisait des variables. On peut donc remplacer les valeurs que lon veut insrer par la nom des variables qui les contiennent.

Dans un premier temps, on assigne les valeurs aux variables:

1. $nom = 'Martin'; 2. $prenom = 'Pierre'; 3. $age = '42'


On pourra ainsi, dans un second temps, insrer ces variables au lieu des valeurs associes dans la requte SQL: INSERT INTO mabase(id,nom,prenom,age)

VALUES(,$nom,'$prenom,'$age).

Cration du formulaire
Vous savez maintenant former la requte SQL dajout dun enregisterment dans la base de donnes en utilisant des variables. Il nous faut prsent crer un formulaire pour rcuprer les donnes ajouter.

Un formulaire est un ensemble dobjets que manipule lutilisateur -le visiteur de la page-. Il y a ainsi des champs de texte, des cases cocher, des menus droulants, des boutons, etc. Notre formulaire sera simple: 3 champs et 1 bouton.

Voici le code du formulaire:

1. <form name="formulaire" method="post" action="ajouter.php"> 2. <table width="200" border="1">

3. <tr> 4. <td>Nom:</td> 5. <td><input name="nom" type="text" id="nom"></td> 6. </tr> 7. <tr> 8. <td>Prnom:</td> 9. <td><input name="prenom" type="text" id="prenom"></td> 10. </tr> 11. <tr> 12. <td>Age:</td> 13. <td><input name="age" type="text" id="age" size="3" maxlength="3"></td> 14. </tr> 15. <tr> 16. <td colspan="2"><div align="center"> 17. <input type="submit" name="Submit" value="Envoyer"> 18. </div></td> 19. </tr> 20. </table> 21. </form>
Et voil le rsultat:

Nom: Prnom: Age:


Envoyer

Ce code mrite quelques explications. A la ligne 1 on cre le formulaire, et on lui donne un nom (ici: formulaire). Puis, on indique la mthode de transmission des donnes. Il en existe deux: POST et GET. Pour les formulaires, on utilise en rgle gnrale POST. Ces deux mthodes sortent de lobjet de cet article. Enfin, on indique vers quel fichier le contenu du formulaire sera envoy: ajouter.php.

La balise <table> sert crer un tableau. Ici, il a les attributs suivants: largeur de 200 pixels, paisseur de la bordure de 1 pixel. Les balises <tr> et <td> servent, respectivement, crer une ligne et une colonne. Les champs de texte sont crs grce la balise <input>. Ainsi, la ligne 5 on cre un objet de type input, qui est un champ de texte (type=text), et dont le nom et lidentifiant sont nom. A la ligne 13, il sagit du champ pour la valeur ge: la taille maximale du texte entr sera de 3 caractres, la taille du champ sera de 3 caractres.

Pour finir, la ligne 17, on cre un bouton qui servira valider le formulaire, et envoyer les valeurs des champs vers le fichier spcifi la ligne 1 et avec la mthode spcifie cette mme ligne.

Rcupration des valeurs du formulaire


Nous avons cr le formulaire qui permet { lutilisateur de saisir ses donnes, nous allons maintenant crer la page ajouter.php qui nous permettra dajouter les donnes soumises dans la base de donnes. Crez donc le fichier ajouter.php et ajoutez le code qui suit, de manire se connecter la base de donnes:

1. <?php 2. include("connexion.php"); 3. 4. connexion();


Une fois connect la base de donnes, il nous faut rcuprer les valeurs du formulaire. On utilise pour cela un tableau ou matrice qui peut contenir plusieurs valeurs diffrentes. Il sagit du tableau$_POST. Dans notre formulaire, nous avons donn ces noms aux champs: nom, prenom, age. Pour rcuprer les valeurs saisiez dans ces champs, il suffira dcrire, respectivement: $_POST['nom'],$_POST['prenom'] et $_POST['age']. Ce systme nous permet de former la requte SQL trs simplement: INSERT INTO

mabase(id,nom,prenom,age) VALUES(,.$_POST['nom'].,.$_POST['prenom'].,.$_POST['age'] .).


Ce qui donne, au final le code suivant ( la suite du dbut du fichier dcrit plus haut):

1. $sql = "INSERT INTO mabase(id,nom,prenom,age) "; 2. $sql .= "VALUES('','".$_POST['nom']."','".$_POST['prenom']."','".$_POST ['age']."')"; 3. 4. mysql_query($sql) or die(mysql_error()); 5. ?>

Contrle des valeurs saisies


Le code prsente ci-avant est parfaitement fonctionnel. Il prsente cependant un gros dfaut: les valeurs saisies par lutilisateur ne sont pas contrles. Ainsi, un utilisateur pourrait omettre de donner son nom, ce qui aurait pour consquence linsertion dun valeur vide dans la base de donnes.

Un programmeur PHP doit toujours se poser la question suivante: comment se comportera mon code sil est appel anormalement ou en dehors de son contexte ?. Dans notre cas, si on tape ladresse du fichier ajouter.php dans un navigateur, si on appelle le fichier sans passer par le formulaire, on aura droit { un beau bug, et pour cause puisque le tableau $_POST nexiste que lorsquil y a un formulaire utilisant la mthode POST en amont !

Il nous faut donc contrler deux choses: que POST existe bien, et que tous les champs ont t renseigns. Ces deux choses se ralisent en une seule opration, { laide dune expression conditionnelle.

Les expressions conditionnelles permettent de dterminer quel comportement aura le programme, en fonction dlments et de conditions dtermins. La logique est la suivante: si A alors B sinon C. En PHP, cela donne:

1. if ($POST['nom'] != '' AND $POST['prenom'] != '' AND $POST['age'] != '') 2. { // c'est bon, on peut copier/coller ici le code vu ci-dessus 3. } 4. else 5. { 6. echo 'Erreur ! Vous devez remplir tous les champs !'; 7. }
if signifie si, else signifie sinon. La syntaxe est la suivante : if(la condition remplir) {le code excuter si la condition est remplie} else { le code excuter si la condition nest pas remplie }. Dans notre cas la condition est simple. On prend le contenu de notre tableau et on vrifie quaucune des entres nest vide. Par exemple, pour le nom: dun ct on a $POST['nom'] qui reprsente ce que lutilisateur a saisi, dun autre ct qui reprsente un contenu inexistant (une chane de texte vide), et enfin, au milieu != qui est un oprateur de comparaison signifiant diffrent de. On rpte cela pour les champs prnom et ge, en mettant loprateur boolen AND qui signifie et. La condition peut ainsi se lire: SI la valeur du champ NOM du formulaire NEST PAS une CHANE VIDE, ET SI la valeur du champ PRENOM du formulaire NEST PAS une CHANE VIDE, ET SI la valeur du champ AGE du formulaire NEST PAS une CHANE VIDE; alors excuter le code qui suit Linstruction echo permet dafficher quelque chose { lcran. Dans notre cas, un message derreur indiquant que tous les champs nont pas t renseigns. Le code final du fichier ajouter.php est le suivant:

1. <?php 2. include("connexion.php"); 3. 4. if ($POST['nom'] != '' AND $POST['prenom'] != '' AND $POST['age'] != '') 5. { 6. connexion(); 7. 8. $sql = "INSERT INTO mabase(id,nom,prenom,age) "; 9. $sql .= "VALUES('','$_POST['nom']','$_POST['prenom']','$_POST['age']')" ;

10. 11. mysql_query($sql) or die(mysql_error()); 12. } 13. else 14. { 15. echo 'Erreur ! Vous devez remplir tous les champs !'; 16. } 17. ?>

Etape 3: Afficher les entres de la base de donnes


Principe: afficher des donnes tabulaires
Les donnes tabulaires saffichent sous forme de tableaux plusieurs dimensions, exactement comme elles sont stockes sur le serveur de base de donnes. Il est dont logique de les afficher dans des tableaux HTML.

Comme expos plus haut, les tableaux HTML se construisent { lintrieur de la balise <table>, les balises <tr> dlimitant les lignes et les balises <td> les colonnes.

Voici un exemple:

1. <table> 2. <tr> 3. <td>Colonne 1 / Ligne 1</td> 4. <td>Colonne 2 / Ligne 1</td> 5. </tr> 6. <tr> 7. <td>Colonne 1 / Ligne 2</td> 8. <td>Colonne 2 / Ligne 2</td> 9. </tr> 10. <tr> 11. <td>Colonne 1 / Ligne 3</td> 12. <td>Colonne 2 / Ligne 3</td> 13. </tr> 14. </table>
Ce qui donne:

Colonne 1 / Ligne 1 Colonne 2 / Ligne 1 Colonne 1 / Ligne 2 Colonne 2 / Ligne 2 Colonne 1 / Ligne 3 Colonne 2 / Ligne 3

Mise en pratique: affichage en liste


Nous allons crer un fichier liste.php destin afficher la liste de tous les enregistrements de la base de donnes. Le dbut ne change pas:

1. <php? 2. 3. include("connexion.php"); 4. 5. connexion();


Il nous faut ensuite crire la requte SQL. Dans ce cas, elle est simple et elle dit Afficher TOUS les enregistrements de la table mabase: SELECT * FROM mabase.

1. $sql = SELECT * FROM mabase;


Nous envoyons ensuite la requte au serveur, le rsultat de cette requte tant stock dans la variable $req.

1. $req = mysql_query($sql) or die(mysql_error());


La variable $req stocke plusieurs lments. Nous allons les extraire et les afficher un par un. Cela est possible grce { linstruction while() qui permet dexcuter un certain code tant quune condition nest pas remplie. Dans notre cas, la logique est la suivante: Etant donn quune ligne du tableau HTML reprsente un enregistrement de la base de donne, crez une ligne et remplissez chacune de ses colonnes tant quil reste des enregistrements dans la base de donnes. Les boucles while sont trs intressantes: il nest pas ncessaire de savoir combien denregistrements il y a dans la base de donnes, puisque le mme code sera excut tant quil en reste. Voici donc le code:

1. echo '<table>'; 2. while($data = mysql_fetch_assoc($req)) 3. { 4. echo '<tr>'; 5. echo '<td>$data["id"]</td>'; 6. echo '<td>$data["nom"]</td>'; 7. echo '<td>$data["prenom"]</td>'; 8. echo '<td>$data["age"]</td>'; 9. echo '</tr>'; 10. } 11. echo '</table>';
Rappelez-vous, la commande echo permet dafficher un lment { lcran. Nous affichons ici des balises HTML et du contenu.

Affichage en liste: Tri par colonnes


Nous venons dafficher les donnes de la base en liste, sous la forme dun tableau: une colonne par proprit, une ligne par enregistrement. Lintrt dun tel affichage -donnes tabulaires- est de

pouvoir effectuer des tris rapidement. Par exemple, classer les enregistrements en ordre croissant ou dcroissant, par nom, prnom ou ge. Pour effectuer un tel tri, il faudra passer une requte SQL de plus. Celle-ci est trs simple: SELECT *

FROM mabase ORDER BY xxx yyy o xxx reprsente le champ { prendre en considration,
et yyy la mthode de tri. Par exemple, nous avons un champ id qui associe { chaque enregistrement de la base de donnes un numro. Le premier enregistrement est 1, le second est 2, etc. Par dfaut, lorsquon passe la requte pour afficher les donnes tabulaires, MySQL renvoie dabord le premier enregistrement, puis le second, et ainsi de suite jusquau dernier. Le tableau se prsentera donc de la faon suivante: le premier enregistrement -le plus vieux- en haut, le dernier -le plus rcent- en bas. On appelle cela ordre ascendant ou croissant. Mais on peut vouloir linverse (et cest frquent dans ce cas): le dernier enregistrement, le plus rcent, en haut, et le premier, le plus vieux, en bas. Dans ce cas, il faut trier les donnes par ordre descendant ou dcroissant. Linstruction SQL sera: SELECT * FROM mabase ORDER BY id DESC. On crit DESC pour ordre dcroissant, et ASC pour ordre croissant. Ne vous y trompez pas, ceci na rien { voir avec la commande SQL WHERE. Nous avons vu au dbut de cet article que la requte SELECT prenoms FROM mabase WHERE age > 40 affichait le prnom des gens qui ont plus de 40 ans. Cela implique que ceux qui ont moins de 40 ans seront ignors. Si vous avez deux enregistrements dans votre base de donnes, lun correspondant { une personne de 50 ans, et lautre { une personne de 30 ans, alors seul le premier enregistrement sera affich. Le second ne sera pas affich, il sera ignor. A linverse, la commande ORDER BY prend en compte tous les enregistrements: il ne sagit pas de rechercher les enregistrements remplissant certains critres, en excluant ceux qui ne remplissent pas ces critres, mais de trier tous les enregistrements selon certains critres. Vous pouvez intgrer tout cela votre programme de manire trs simple. Tout en haut de la page sur laquelle est affich votre tableau -vos donnes tabulaires-, crez deux liens:

1. <a href="liste.php?orderby=asc">Trier par ordre croissant</a> 2. <a href="liste.php?orderby=desc">Trier par ordre dcroissant</a>
Ensuite, dans votre fichier liste.php, adaptez votre vode. La requte SQL sera forme de manire diffrente, selon que lutilisateur a cliqu sur le lien Trier par ordre croissant ou sur le lien Trier par ordre dcroissant.

1. 2. 3. 4.

if($_GET["orderby"] == "asc") // si on veut un ordre croissant { $sql = "SELECT * FROM mabase ORDER BY id ASC"; } elseif($_GET["orderby"] == "desc") // si on veut un ordre dcroissant

5. 6. 7. 8. 9.

{ $sql = "SELECT * FROM mabase ORDER BY id DESC"; } else // si rien n'a t prcis { $sql = "SELECT * FROM mabase"; }

Le principe est le mme pour les autres champs. Si par exemple vous voulez trier les personnes par ge croissant, les plus jeunes en haut et les plus vieux en bas, il vous suffira de passer la requte suivante: SELECT * FROM mabase ORDER BY age ASC.

Astuce: affichage par fiche


Nous venons dafficher tous les enregistrements de la base de donnes. Peut-tre que pour chaque enregistrement vous avez une trentaine de colonnes, et que ce nest pas pratique pour vous de tout afficher en bloc. Dans ce cas l{ notre champ id va servir ! La solution est dafficher la liste complte (comme dans lexemple ci-dessus), en omettant par exemple les colonnes prenom et age. A la place, un lien de ce type: echo <td><a

href=fiche.php?q=.$data["id"].>Voir la fiche</a></td>;
Ce code produira un lien renvoyant vers la page fiche.php?q=XX, XX tant le contenu de la colonne id pour celle ligne. On rcupre ensuite, dans le fichier fiche.php, la valeur de XX grce la variable $_GET['q']. Nous avons utilis la mthode POST pour le formulaire, et nous utilisons maintenant la mthode GET ! La valeur de XX ainsi rcupre, il ne nous reste plus qu{ former la requte SQL: $sql = SELECT *

FROM mabase WHERE id=.$_GET["q"].;.


Au final, cela donne:

1. 2. 3. 4. 5. 6. 7. 8. 9.

$id = $_GET['id']; $sql = "SELECT * FROM mabase WHERE id='$id'"; $req = mysql_query($sql) or die(mysql_error()); $data = mysql_fetch_assoc($req); echo echo echo echo ' ' ' ' Id: '.$data['id']; Nom: '.$data['nom']; Prnom: '.$data['prenom']; ge: '.$data['age'];

Je vous laisse crire le reste du code, notamment la mthode de connexion la base de donn qui ne change pas ; et la mthode de vrification de lexistence et de la non-nullit de la variable $_GET, puisque la procdure avec ifelse est la mme pour la variable $_GET et pour la variable $_POST. Une astuce en passant : pour scuriser lacquisition des donnes, il est conseill de contrler le type de ces donnes. Ici, id est cens tre un nombre, cest--dire de type numrique. On peut donc encadrer le code dans un bloc if(is_numeric($_GET['id'])).

Etape 4: Recherche dans la base de donnes


Pour rechercher dans la base de donnes, il faut utiliser un peu toutes les notions que nous venons de voir. Comme il est inutile que je me rpte, je ne fournirai pas de code complet.

La premire tape est de crer un formulaire. La seconde tape est de crer un fichier PHP qui rcupre les donnes de ce formulaire. La troisime tape est la formation de la requte SQL partir des donnes rcupres.

La requte de recherche se construit exactement comme expliqu dans lexemple ci-dessus. En effet, nous avons recherch tous les enregistrements dont lid est XX. Lid tant une valeur unique, il ny a forcment quun seul rsultat ! La recherche exacte se construit ainsi: SELECT * FROM mabase WHERE nom_colonne = Y. Le caractre * implique que lon veut toutes les colonnes dans les rsultats. Si lon ne veut que certaines colonnes, il suffira dcrire leurs noms spars de virgules. Y correspond { ce que lon veut rechercher. La recherche approximative se construit de cette manire: SELECT * FROM mabase WHERE

nom_colonne LIKE %S. On recherche ainsi toutes les entres qui finissent par S. Le
symbole% est un marqueur gnrique. Par exemple, si jcris Constit%, me seront renvoys aussi bien Constitution que Constitutionnel ou Constitutionnellement. La quatrime tape est laffichage des rsultats. Vous pouvez reprendre le code daffichage en liste et remplacer la requte SQL de ce code par la nouvelle requte SQL de recherche que vous venez de gnrer.

Etape 5: Modifier et supprimer une entre de la base de donnes


Encore une fois, les mcanismes sont les mmes. Il vous faut rcuprer lid de lenregistrement { modifier ou supprimer comme expliqu ci-avant, et construire la requte SQL correspondante. Pour mettre jour, le mot cl SQL est UPDATE: UPDATE mabase SET nom=$nom,

prenom=$prenom, date=$date WHERE id=$id.


Pour supprimer une entre, le mot cl SQL est DELETE: DELETE FROM mabase WHERE

id=$id.

Bonus: Scuriser laccs { la base de donnes


Il existe de nombreuses mthodes pour scuriser laccs aux donnes, et notamment: les htaccess, le cryptage et les sessions PHP. Je vais dvelopper ici les sessions PHP. Le principe est le suivant: ladministrateur de la base de donnes dfinit qui peut y accder en dfinissant des couples login / mot de passe; et toute personne dsirant utiliser la base de donnes devra saisir un des couples dfinis par ladministrateur.

Les sessions PHP sont trs pratiques. Elles reposent sur un principe simple: le tableau $SESSION[] est cr et stock sur le serveur. Il peut contenir nimporte quel type de donnes. De plus, il est statique. Cela signifie quil est accessible dans nimporte laquelle de vos pages (classes) PHP sans avoir { tre redclar. Il nest pas non plus rinitialis dune page { une autre. Pour le rinitialiser, deux mthodes: soit en crivant $SESSION[] = array();, soit simplement en quittant votre navigateur ! Pour commencer, on cre les couples. Le premier login est Martin, et il est associ au mot de passeabc. De mme pour les autres couples.

1. $admin_array = array('Martin' => 'abc', 'Dupont' => 'def', 'Robert' => 'ghi');
On ouvre ensuite la session en crivant session_start(); au dbut de nos fichiers PHP. On cre un formulaire, avec un champ de texte pour le login, un champ de texte pour le mot de passe, et un bouton pour envoyer les rsultats avec la mthode POST. Puis, on rcupre les valeurs soumises par le biais du formulaire dans une fonction qui les analyse et les compare aux valeurs de$admin_array. Cette fonction pourrait tre construite ainsi:

1. foreach($admin_array as $logg => $passwd) 2. { if($_POST['login'] == $logg AND $_POST['password'] == $passwd) 3. { $_SESSION['identifie'] = 1; 4. return; 5. } 6. }
Il nous faut maintenant crer une autre fonction qui vrifie si lutilisateur est enregistr, cest--dire si $_SESSION['identifie'] est gal { 1. Si cest le cas, la fonction renverra la valeur true, et elle renverra false dans tous les autres cas. A chaque fois que vous voudrez savoir si lutilisateur est identifi, vous pourrez appeler la fonction suivante et vrifier la valeur quelle retourne.

1. function checkauth() 2. { if($_SESSION['identifie'] == 1) return true; 3. else return false; 4. }

Dernire tape: on utilise la fonction checkauth() avant dafficher un quelconque contenu, et avant dexcuter une quelconque opration. Pour cela, on englobe les codes vus dans cet article dans une instruction ifelse. Si la fonction renvoie true, on peut afficher les donnes, sinon non. A noter que if(checkauth()) est quivalent if(checkauth() == true).

1. 2. 3. 4. 5. 6. 7. 8.

if(checkauth()) { // n'importe quelle opration sur la base de donne } else { // le code qui correspond au formulaire d'identification }

A Ledenon, le 25/09/2005 Mis jour Montpellier le 21/12/2005 Mis jour Paris le 11/04/2009
Tagged as: bases de donnes, Internet, programmation, serveur, Web

{ 50 comments read them below or add one }


GF October 19, 2005 at 0:16
Je suis dispo pour vos ractions et/ou questions, tout le support ncessaire sur le code source de ce tuto et sur sa mise en oeuvre. Ajoutez vos commentaires !

REPLY

Laurent July 22, 2007 at 17:07


Salut et dabord un grand merci pour tout ce boulot!!! En revanche je bloque sur le passage concernant les boucles. Pour une boucle comme celle ci pas de problme, mais pour une sur plusieurs ligne? Je mexplique: mettons que je veuilles afficher les avatars des derniers membres inscrit sur 3 colonnes et 3 lignes. Chaque ligne comprend donc trois avatars. Mais si je me base sur lexemple donn dans le tutorial, lavatar portera par exemple le nom id_avatar et sera mis dans la premire celulle de la premire ligne. Du coup il ne peut pas tre rpliquer aprs non??? Cest moi qui nest pas compris ou cest une limite? (en gros je veux dire quavec lexemple du tuto le tableau vas soit sur les cot soit vers le bas, mais pas les deux). Merci
REPLY

Laurent July 22, 2007 at 17:55

Oups, jai oubli de donn la solution trs trs couteau suisse que jai trouv pour rgler a: Mettre lavatar dynamique dans la premire celulle puis jouer avec les limites. Donc le premier contient seulement order by desc, le deuxime avatar a en plus limit 1,1, le deuxime limit 2,2 Voila, je sais a fait bq de requtes mais cest bien pour rgler a que je pose ma question prcdente! Encore merci et vive Valhalla!!!
REPLY

GF July 22, 2007 at 20:42


Si je comprends bien, tu veux afficher des avatars stocks dans une base de donnes, avec une boucle. Et il faut 3 avatars par ligne.

Il y a une solution rapide pour faire cela. Il suffit dimbriquer 2 boucles, lune dans lautre. La premire boucle gre les lignes, la seconde gre les colonnes.

Ainsi, on aura: - 1er passage de la 1re boucle = 1re ligne 1er passage de la 2me boucle = 1re colonne de la 1re ligne 2me passage de la 2me boucle = 2me colonne de la 1re ligne 3me passage de la 2me boucle = 3me colonne de la 1re ligne - 2me passage de la 1re boucle = 2me ligne 1er passage de la 2me boucle = 1re colonne de la 2me ligne 2me passage de la 2me boucle = 2me colonne de la 2me ligne 3me passage de la 2me boucle = 3me colonne de la 2me ligne - etc.
REPLY

Guillaume August 20, 2007 at 16:43


Comment peut-on faire pour extraire tous les noms diffrents ?

Dans le meme style que votre exemple, je mets DUPOND Martin, DUPOND Yves et MACHIN Yves.

Comment peut-on faire pour que MySQL nous retourne que Martin et Yves. Sinon, on peut peut-tre faire a via PHP Merci de votre aide davance

REPLY

GF August 24, 2007 at 8:50


Il y a deux manires de faire cela. On peut en effet utiliser une requte SQL ou traiter les donner avec PHP. Je vais donner un exemple des deux mthodes, mais je conseille fortement dutiliser la mthode SQL, sauf si un traitement avec PHP est indispensable.

Avec php:

$sql = SELECT * FROM MaTable;; $data = mysql_fetch_assoc(mysql_query($sql)); foreach($data as $valeur) if($valeur == DUPOND) echo Mon nom est $valeur et mon prnom .$data['prenom']; Avec ce code, on extrait tous les enregistrements de la table, et on ne retient que ceux qui satisfont { la condition quon a choisi de poser.

Mais il vaut mieux nextraire que les donnes qui correspondent { ce que lon veut rechercher. Et cest possible de le faire avec SQL:

SELECT prenom FROM MaTable WHERE nom=DUPOND;

En franais, cela donne : slectionner la colonne prnom dans la table MaTable pour toutes les lignes o nom est Dupond .

REPLY

Mesterniz November 2, 2007 at 23:16


Bonjour ,je voulais savoir comment faire pour verifier dans une base de donne si un nom existe dja .Je mexplique, par exemple quelqun senregistre dans un forum avec un pseudo XXX et ce pseudo existe dja dans la base de donne , comment on va verifier si ce pseudo existe dja , et ainsi lui demander de changer de pseudo.Merci davance.

REPLY

GF November 3, 2007 at 18:36

Il faut tout simplement excuter le code dajout du nouveau pseudo dans la base de donnes lintrieur dun bloc ifelse qui se chargera de vrifier si ce pseudo na pas dj{ t enregistr.

// rcuprer le pseudo choisi par lutilisateur $pseudo = $_POST['pseudo']; // construire une requte SQL pour savoir si ce pseudo existe dj $sql = SELECT * FROM matable WHERE pseudo=$pseudo;; $req = mysql_query($sql); // compter le nombre de rsultats renvoys par la prcdente requte // si ce nombre est gal 0, cest que le pseudo nest pas dj utilis $match = mysql_num_rows($req); // si le pseudo existe dj{ if($match > 0) { echo Pseudo dj{ pris; } // si le pseudo est libre, insrer lenregistrement dans la base de donnes else { $sql = INSERT INTO. } Il existe aussi une autre mthode, plus lgante, mais un peu plus difficile manier. Il sagit ici de compter le nombre de rsultats, non pas avec PHP, mais directement avec MySQL. Pour cela, on utilisera la fonction COUNT.

$sql = SELECT COUNT(*) FROM matable WHERE pseudo=$pseudo;;

REPLY

michel December 1, 2007 at 18:45


bonjour,je debute completement et japprend tout seul. Mon probleme est que lorsque je clique sur envoyer ,jai mon fichier ajouter.php qui saffiche..??? aucune donne nest entre dans ma base . Jai un peu de mal { saisir le principe de include,car { mon avis cest la que a coince Jai plus lhabitude de programmer avec windev ,le php et le html cest nouveau pour moi.

Quel est lerreur que jai commise??? merci


REPLY

Simon December 2, 2007 at 19:24


Bonjour, Rien a voir avec le tuto, mais il me semble que le site comporte un bug au niveau du menu a gauche sous IE7: Le menu ne cesse de sagrandir et finni par cacher tout le contenu du site ! A part a bon boulot, continuez ainsi
REPLY

GF December 2, 2007 at 19:27


Cest un problme au niveau du serveur web (probablement Apache), qui considre que les fichiers avec lextension PHP sont des fichiers textes, et qui les affiche au lieu de les excuter. Le problme se rgle en configurant le fichier httpd.conf

REPLY

GF December 3, 2007 at 4:21


Merci de lavoir signal En fait, cest plutt un bug de IE7 le menu respecte les standards, il saffiche correctement avec Safari (Webkit) et Firefox (Gecko). Bref je rtablirai le menu classique dans la prochaine version de linterface.

REPLY

LEFEVRE December 19, 2007 at 11:29


Bonjour, Je trouve que la nature de larticle laisse { supposer quil sadresse { des dbutants, mais encore faut-il dj{ matriser pour installer un serveur web sur localhost et que celui-ci veuille bien interprter correctement les commandes pour ma part cela donne : Parse error: syntax error, unexpected T_INCLUDE in /var/www/apache2-default/ajouter.php on line 2
REPLY

GF December 19, 2007 at 15:11

Je crois dceler comme un ton de reproche dans le message prcdent. Aurais-je d expliquer dans cet article comment installer un serveur Web ? Je ne le crois pas, prcisment car cela fait dj{ lobjet dun autre article, long, dtaill et maintes fois comment, qui est publi ici mme.

Quant au message derreur cit, il confirme mon propos. Il sagit dun message derreur gnr par le logiciel de compilation et dinterprtation du code source PHP. Cest donc que, dune part le serveur Web fonctionne correctement et, dautre part, que lerreur se situe dans le code source PHP. Il sagit dune simple erreur de syntaxe, comme lindique le message.

REPLY

benali March 11, 2008 at 9:59


Bonjour, Jai un petit problme que je narrive pas { trouver de solution sur le net. Je suis en traine de crer un site web avec PHP et Mysql. Le problme:Jai une table qui contient un champ fichier. Mes questions: 1) Est ce je peux stocker des fichiers file.php dans cette table? 2) ya til une methode qui me permet dextraire un fichier.php de ma base de donnes et louvrir directement en page Web? Bien vous.

REPLY

GF March 12, 2008 at 16:27


Oui, il est possible de stocker des fichiers dans des tables MySQL. Pour les fichiers texte plain, la colonne doit tre du type TEXT ; pour les fichiers binaires, elle doit tre du type BLOB.

La table pourra contenir les champs suivants : - id : primary key, auto_increment (INT) - nom : le nom du fichier (VARCHAR) - type : le type du fichier (ncessaire pour le tlcharger) (VARCHAR) - taille : la taille du fichier (idem) (VARCHAR) - fichier : le contenu du fichier (BLOB) On cre ensuite un formulaire HTML avec un champ dimportation de fichiers :

<input type=hidden name=MAX_FILE_SIZE value=un nombre doctets> <input name=monfichier type=file>

sans oublier de prciser en en-tte du formulaire quil est destin { traiter des donns binaires :enctype=multipart/form-data Il suffit ensuite de rcuprer les donnes du fichiers avec PHP :

$Fnom = $_FILES['monfichier']['name']; $FTMPnom = $_FILES['monfichier']['tmp_name']; $Ftaille = $_FILES['monfichier']['size']; $Ftype = $_FILES['monfichier']['type']; ainsi que son contenu :

$Fcontenu = file_get_contents($FTMPnom); On noublie surtout pas de protger linsertion

$Fcontenu = addslashes($Fcontenu); $Fnom = addslashes($Fnom); Et on insre !

INSERT INTO matable (id,nom,type,taille,fichier) VALUES (,$Fnom,'$Ftype,'$Ftaille,'$Fcontenu) -

Pour rcuprer le fichier, on commence par faire un SELECT classique, puis on peut soit le tlcharger en lappelant dans des headers PHP (fichier binaire), soit lafficher { lcran (fichier texte).

En revanche, si le fichier doit tre excut comme du code PHP sur le serveur, il faudra procder en 3 tapes : - rcuprer le fichier depuis MySQL - crer un fichier sur le serveur - inclure ce fichier 1) Pour le rcuprer depuis MySQL

On xcute la requte SELECT :

$sql = SELECT * FROM matable where id = ; $data = mysql_fetch_assoc( mysql_query( $sql ) ); On enlve les slash du nom MAIS PAS DU CONTENU !!!

$monfichier = stripslashes($data['nom']); $contenu = $data['fichier']; 2) Pour crer le fichier sur le systme de fichiers :

$root = rpertoire du serveur $fichier = fopen($root/$monfichier,w); fwrite($fichier,$contenu); 3) Pour linclure, tout simplement

include_once($root/$monfichier); -

NB 1 : ne pas oublier de supprimer le fichier aprs coup, avec unlink($root/$monfichier) NB 2 : a me semble vraiment lourd de stocker un fichier PHP sur le serveur MySQL pour lexcuter ensuite. Quoi que tu veuilles faire, il doit y avoir une meilleure solution. En plus, cette mthode constitue potentiellement une ENOOOOOORME faille de scurit. Si tu utilises a pour toi il ny a pas de problme, mais nautorise JAMAIS tes visiteurs { excuter du code PHP sur ton serveur. Il suffit quun petit malin utilise la fonction unlink() { la racine de ton serveur, par exemple, pour en effacer le contenu

REPLY

Tomy March 28, 2008 at 8:38


Bonjour! Apres suppression dans la base.Est-il possible de regulariser les ids automatiquement pourquil prennent de lordre normale:1,2,3 etc.mais non pas 1,2,3,5,6,7,8,9, puisquon supprimme le 4.Merci
REPLY

GF March 29, 2008 at 12:00

Les cls primaires (id) dpendent de la table et non de chaque ligne.

Si vous avez les enregistrements 1,2,3,4,5 et que vous supprimez la ligne n4, la prochaine ligne que vous insrerez sera la ligne n6. Le n4 ne sera plus jamais utilis, sauf si vous spcifiez le contraire dans la requte SQL.

Les cls primaires ne sont en effet pas verrouilles en criture. Vous pouvez donc excuter un UPDATE ma_ligne_6 SET id=4. Mais cela ne rsoudrait pas le problme pour autant, puisqu{ la prochaine insertion, lid serait 7, MySQL considrant que lenregistrement 6 a exist

En revanche, si vous supprimez la table elle-mme et que vous la recrez ensuite, les id seront normaliss : les vides seront combls.

Si vous voulez normaliser les id de la table T1, vous pouvez procder ainsi : - crer une table vierge T2 (avec une cl primaire vierge, donc) - copier les donnes de la table normaliser T1 vers cette table vierge T2 - supprimer la table normaliser T1 puis la recrer (elle sera alors vierge) - copier les donnes dans lautre sens, de la table T2 vers la table T1. - supprimer la table T2. En gnral, il nest pas utile de faire cela. Si vous en prouvez le besoin, cest probablement que votre programme est mal structur. Dans tous les cas, cette mthode nest pas utilisable si dautres tables sont lies par des cls trangres la table dont vous voulez normaliser les id.
REPLY

borhen September 4, 2008 at 16:52


je veux afficiher des images a partire de la base des donnes mais de faon de division cd dans chaque pages je veux affichier 5 images avec un lien vers une autre page tout en php
REPLY

cyboulette October 18, 2008 at 22:53


Bonjour, Juste un petit coucou de passage pour dire MERCI. Excellent travail.
REPLY

stevex November 19, 2008 at 15:44


Bonjour,

je viens de lire ce trs bon tuto que je vais mempresser dutiliser pour mon propre site. Un grand merci pour tout le temps pass { lcrire et pour mettre ainsi { la dsipo de tous tes connaisances! Steve.

REPLY

mohamed December 21, 2008 at 10:04


Bonjour voila est ce que vous pouvez maider comment on peut importer des donnes cimatiques dans la base sachant que cest un fichier format ascii sans sparateur par des commandes sql. salutations mohamed
REPLY

fred April 3, 2009 at 11:59


Bonjour cette mthode est elle toujours dactualit car en modifiant juste les paramtres de bases je nai que des messages derreurs. Cordialement Fred
REPLY

GF April 5, 2009 at 13:17


Oui, cest toujours dactualit.

REPLY

fred April 5, 2009 at 16:24


Bonjour merci tout dabord pour votre tuto qui est excellent.

Mais en fait je reste bloqu sur la premiere tape sur la cration du fichier connexion Ds le dpart jessaye de rentrer les codes suivant

$host = db115.1and1.fr; /* Ladresse du serveur */ jutilise PHPedit qui mindique une erreur. et sur internet jai lerreur suivante: Parse error: syntax error, unexpected T_DNUMBER in /homepages/17/d118857659/htdocs/php/connexion.php on line 2 Cordialement

fred

REPLY

GF April 5, 2009 at 19:06


Essayez en remplaant les guillemets obliques ( xxx ) par des guillemets droits ( xxx ). Encore mieux, remplacez les par des apostrophes ( xxx ).

REPLY

fred April 5, 2009 at 19:46


Merci beaucoup pour votre fficacit et votre tuto

REPLY

fred April 6, 2009 at 12:08


REbonjour

Jai pu hier crer le fichier connexion.php, grce { vos conseils. Maintenant jai cree le fichier installation.php jai eu cette erreur l{

Fatal error: Call to undefined function: import() in /homepages/17/d118857659/htdocs/php/installation.php on line 2

import(connexion.php);

dsol pour toutes ces demandes

REPLY

GF April 6, 2009 at 13:37


Remplacez import par include ou require.

REPLY

fred April 7, 2009 at 8:28


Bonjour pouvez vous mindiquer si votre code en fait est plus adapt sur un ancien format de php. Car les fichiers suivants fonctionnent: Connexion.php installation.php Formulaire.Php Mais en remplacant les par (droit) et en remplacant import par include Maintenant jai un message derreur sur le fichier ajouter.php Voici le code aprs remplacement des guillemets

Et voici mon message derreur

Parse error: syntax error, unexpected , expecting T_STRING or T_VARIABLE or T_NUM_STRING in /homepages/17/d118857659/htdocs/php/ajouter.php on line 4

Cordialement

Fred

REPLY

GF April 7, 2009 at 10:50


Lutilisation dimport tait une erreur dans larticle, qui a t corrige.

Tous les autres problmes que vous rencontrez viennent du fait que vous faites des copier/coller du code au lieu de le taper { la main. Cela ne peut pas fonctionner. Si vous tenez vraiment faire du copier/coller, faites un collage spcial en plain text.

En loccurrence, le message derreur indique qu{ la ligne 4 du fichier ajouter.php, vous avez un guillemet issu du copier/coller, qui nest pas un guillemet droit.

REPLY

GF April 7, 2009 at 10:57


La rponse n34 ci-dessus rglera votre problme. Mais pour la suite, faites en sorte davoir le mme encodage dans la base de donnes, dans le header html, pour les fichiers PHP.

Un diteur digne de ce nom devrait vous permettre de choisir lencodage de vos fichiers (fichier>enregistrer sous). Utilisez UTF-8 ou ISO-8859-1 (ISO-Latin-1) selon lencodage de notre base de donnes (en gnral ISO-Latin-1 chez les hbergeurs franais). Indiquez <meta httpequiv=Content-Type content=text/html; charset=iso-8859-1/> dans votre header html.

REPLY

MOHshow April 9, 2009 at 22:01


Probleme dans le fichier Ajouter.php:

Parse error: syntax error, unexpected T_STRING in /home/m/medialike/html/test/radio/ajouter.php on line 8

REPLY

GF April 9, 2009 at 22:45


Je ne sais pas ce quil y a { votre ligne 8. Si vous avez recopi { la main le code, notez queVALUES(,, scrit guillemets VALUES parenthse apostrophe apostrophe virgule apostrophe guillemet.
REPLY

MOHshow April 10, 2009 at 10:55


Voici le code dans le fichier ajouter.php

include(connexion.php);

if ($POST['nom'] != AND $POST['urlflux'] != ) { connexion(); $sql = INSERT INTO radio(id,nom,urlflux) ; <=== cest cette ligne qui pose problme. $sql .= VALUES(,$_POST['nom'],$_POST['urlflux']); mysql_query($sql) or die(mysql_error()); } else { echo Erreur ! Vous devez remplir tous les champs !; }
REPLY

GF April 11, 2009 at 22:29


Cest le mme problme que fred (ci-dessus, commentaires n28 et 29). Vous utilisez des guillemets courbes ( abcd ) au lieu des guillemets droits ( "abcd" ). Cela est d au copiercoller.

Il y a aussi une autre erreur (que lon ne retrouve pas dans le texte de larticle) : les variables php peuvent tre directement insres dans un chane (exemple : $nom = world; echo hello $nom;), mais pas les tableaux. Il faut donc fermer la chane avant dinsrer $_POST['...'] et la rouvrir aprs (exemple : echo hello .$_POST['nom']. !;) Remplacez vos deux lignes par celles-ci (vous pouvez copier-coller) :

$sql = "INSERT INTO radio(id,nom,urlflux) "; $sql .= "VALUES('','".$_POST['nom']."','".$_POST['urlflux']."')";


REPLY

GF April 11, 2009 at 22:38


Les guillemets ont t modifis dans larticle, pour que le copier/coller du code ne cause plus ce problme.

REPLY

ML April 21, 2009 at 14:48

Quel logiciel ?

Bonjour,

Je cherche construire une base de donne qui devrait contenir plusieurs centaines de milliers de donnes (expressions). Celles-ci sont classes en 8 catgories diffrentes.

A terme, lide est de pouvoir introduire une donne et que celle-ci soit classe automatiquement dans une catgorie. Cd, la mme donne est dj classe dans la base de donne. Le logiciel trouve la donne dans la base de donne et associe la donne la catgorie.

Ex. Faire du basket est associ { Sport dans la base de donne. Jentre Faire du basket dans une liste, puis lexpression reoit automatiquement comme attribution Sport.

Quel logiciel puis-je utiliser pour faire cela ?

Borland Paradox; Filemaker; IBM DB2; Ingres; Interbase; Microsoft SQL server; Microsoft Access; Microsoft FoxPro; Oracle; Sybase; MySQL; PostgreSQL; mSQL; SQL Server 11 ?

Merci!

REPLY

GF April 22, 2009 at 14:45


Bonjour,

tous les logiciels que vous citez permettez de faire ce que vous cherchez faire. Cependant, il ne permettront pas tous de le faire comme vous voulez le faire. Il vous faut une base de donnes relationnelle, avec 2 tables. La premire table pourrait avoir le schma suivant : id, activit. La seconde table serait ainsi : id, id_externe, nom_de_l_activit.

Ces deux bases stockeraient les donnes et votre logiciel se contenterait dassocier lid_externe de chaque enregistrement de la seconde table, { un lid dun enregistrement de la premire table.

Pour reprendre lexemple que vous donnez :

TABLE 1 id activit 1 Sport 2 Lecture TABLE 2 id id_externe nom_de_l_activit 1 1 Basket 2 1 Football 3 2 Romans policiers 4 2 Littrature scientifique etc Pour lassociation automatique des donnes, cest assez simple. Schmatiquement : - SI table2.nom_de_l_activit NEXISTE PAS CRER table2.nom_de_lactivit ASSOCIER table2.id_externe table1.id - SINON ASSOCIER table2.id_externe table1.id Le comment est plus problmatique. Cest ce qui dterminera le logiciel { utiliser.

Des logiciels comme FileMaker ou Access combinent un moteur de base de donnes avec linterface graphique qui permet de crer le logiciel dexploitation des donnes. Cest la bonne solution pour une base de donnes personnelle, de contenance moyenne, cre par quelquun qui ne connat pas la programmation.

Des logiciels comme Oracle ou Sybase sont clairement destins un usage professionnel. Ils ncessitent une trs solide matrise de leur fonctionnement, et une grande spcialisation de la personne qui construit le logiciel dexploitation des donnes. Ils offrent en outre une trs grande puissance, et des moyens de dploiement qui conviennent parfaitement aux grandes entreprises (pour crer une base de donnes internes sur leur rseau intranet, par exemple).

Dautres logiciels comme MySQL ou PostgreSQL sont plutt destins { tre combins aux technologies Web. Si vous voulez que votre base de donnes soit exploitable en ligne moindre cot (ces logiciels sont gratuits pour un usage non commercial), cest la solution { choisir. Mais vous devrez alors crer le logiciel dexploitation des donnes { la main. Ce nest

pas forcment plus compliqu que matriser Oracle ou Sybase, mais cela ncessite tout de mme un investissement personnel important.

Par ailleurs, si votre base de donnes est rellement destine contenir plusieurs centaines de milliers denregistrements, les logiciels tout en un tels que FileMaker ou Access sont { mon avis exclure.

Le reste dpend du budget : entre Orale et MySQL, il y a vraiment un grosse diffrence du ct du prix -et cest un euphmisme-. Voyez aussi les diffrentes licences dutilisation qui existent, pour le logiciel serveur : le prix peut varier en fonction du nombre de clients autoriss.

En somme, il ny a pas de rponse tranche. Il faut dabord dterminer comment vous voulez procder, quel doit tre votre rsultat final, et quelles sont les contraintes. Ensuite, il sera assez facile de choisir le bon logiciel en procdant par limination.

REPLY

xxx-MissGirlYani-xxx || ;-) May 25, 2009 at 17:47


bonjour, cest du trs bon travail, continuez !! jai un petit problme qui est facile pour vous, cest pour mon projet qui sappelle MANTIS, gestion des bogues.. dans la page dajout des beugs, jai deux forms de type Select le premire a deux options correctif et volutif et dans le deuxime Select il y aura un ensemble de options qui dpend du premier choix, soi correctif (le dexime Select contiendra des options relatif avec ce choix) ou volutif (la meme chose..) jespre que jai bien clairci les problme.. Merci davance

si vous voulez me rpondre sur mon mail a sera trs gentil de votre part.. Merci

REPLY

GF July 11, 2009 at 18:55


Ce nest pas trs clair, non, dans la mesure o vous ne dites pas ce que vous cherchez { faire :/

Sil sagit de modifier le second select en fonction de loption active du premier, cela peut se faire facilement en javascript :

var premier_select = document.getElementById(premier_select).options[document.getElementById('premier_sel ect').selectedIndex].value if(premier_select == mon choix) document.getElementById(second_select).selectedIndex = 2


REPLY

Abdoul July 13, 2011 at 19:41


bonjour, cest du trs bon travail, continuez !! jai un problme qui est facile pour vous, cest pour mon projet: je doit crer une base de donnes qui sera rempli grce { un formulaire par lutilisateur sil est dj{ inscrit sur mon site, sinon il remplira un formulaire dinscription et remplira la base de donne grce a session. jespre que jai bien clairci les problme.. Merci davance si vous voulez me rpondre sur mon mail a sera trs gentil de votre part.. Merci

REPLY

GF July 13, 2011 at 20:42


Non, ce nest pas trs clair

Dans le premier cas (utilisateur inscrit), un formulaire tout simple comme celui prsent dans larticle est suffisant.

Dans le deuxime cas, lutilisateur nest pas inscrit et les donnes sont stockes dans la session, cest--dire, en PHP, dans le tableau $_SESSION["key"] = value.

Cela dit, je ne comprends pas trs bien comment tout cela est cens fonctionner En effet, si lutilisateur non-inscrit est cens sinscrire avant de remplir la bdd, on retombe sur le cas n1 et il nest pas ncessaire dutiliser la session. A moins que la session intervienne aussi pour les utilisateurs enregistrs et, dans ce cas, attention aux considrations de scurit (les attaques par usurpation du SSID sont assez courantes : cela signifie quil vaut mieux viter de stocker des variables dans la session si ce nest pas ncessaire).

Enfin, bref :

// Rcuprer le nom d'utilisateur

$user = $_POST['user']; // ne pas oublier de scuriser contre les injections // Existe-t-il dj ? $sql = "SELECT * FROM users_table WHERE user = \"$user\""; ...mysql_query...etc... v. dans l'article $count = mysql_num_rows($query); if($count > 0) // l'utilisateur existe { // Procder avec les donnes du formulaire $data1 = $_POST["data1"]; $data2 = $_POST["data2"]; // etc. } else // l'utilisateur n'existe pas { // Crer l'utilisateur $sql = "INSERT INTO users (id,user) VALUES ('',\"$user\")"; mysql_query($sql); // or die... etc. cf. l'article // Poursuivre avec les donnes de la session $data1 = $_SESSION["data1"]; $data1 = $_SESSION["data2"]; // etc. } // Protection des donnes : stripslashes et compagnie $data1 = ma_fonction_de_protection($data1); // etc. // Insrer les donnes $sql = "INSERT INTO ma_table (id,user,data1,data2) VALUES ('',\"$user\", \"$data1\", \"$data2\")"; mysql_query($sql); // or die... etc. cf. l'article
REPLY

Dan September 9, 2011 at 10:41


Bonjour

Je dbute pour la construction sur les base de donnes avec MySQL et PHP.

Pour apprendre, je trouve votre tutoriel excellent.

Mais je bloque sur la cration de la base de donnes. Jai cr le fichier connexion.php ainsi que installation.php en copiant les lments sur votre tutoriel.

A louverture du fichier installation.php, jai le message suivant:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1

Merci davance de votre aide

Cordialement

REPLY

GF September 9, 2011 at 10:56


Il semble quil y ait un problme dapostrophe/guillemet. Cela arrive parfois quand on fait des copier/coller.

Essayez avec ceci et, si a ne marche toujours pas, recopiez manuellement (le code lui-mme fonctionne, je viens de le tester) :

$sql= "CREATE TABLE IF NOT EXISTS `mabase` (`id` int(11) NOT NULL auto_increment,`nom` text NOT NULL,`prenom` text NOT NULL,`age` int NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `id_2` (`id`),KEY `id` (`id`)) ENGINE=MyISAM;";
REPLY

Dan September 9, 2011 at 11:50


Re

Merci de laide pour le fichier installation.php.

Mais maintenant, je bloque sur le formulaire. Lorsque je clique sur le bouton envoyer jai le message suivant:

Parse error: syntax error, unexpected `, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/wb52520/1/ajouter.php on line 9

Merci davance de votre aide

Cordialement

REPLY

GF September 9, 2011 at 12:07


Cest le mme problme, comme lindique le message derreur : mauvais guillemets (unexpected ` parce quil attend et non `). Cela est d au copier/coller et { un ou plusieurs des intervenants : votre systme dexploitation, votre navigateur, votre diteur de texte difficile dire.

Le code prsent dans cet article utilise des guillemets et apostrophes droits, et non les guillemets ou apostrophes de la typographie franaise.

Vous pouvez recopier le texte { la main, votre diteur devrait insrer les bons guillemets. Vous pouvez aussi continuer de copier/coller, tout en utilisant la fonction rechercher/remplacer de votre diteur de texte, pour rechercher les guillemets copis/colls et en les remplacer par des guillemets droits insrs depuis le clavier.

PS: quest-ce quil y a, dans votre code, { la ligne 9 ?

REPLY

Naval December 21, 2011 at 10:04


salut,comment faire que la base nenregistre pas en double?cest { dire que lorsquon submit, les donnes sont enregistres 2 fois. merci
REPLY

dekiss June 19, 2012 at 11:28


bonjour je travail sur la conception dun site de publication darticles scientifiques sous spip et jai un problme que je narrive pas { rsoudre jai cre un formulaire en html qui envoie un mail { une personne que ladministrateur du site choisit pour ameliorer un article propos par un rdacteur et le code php qui traite ce formulaire est le suivant

/* Rcupration des valeurs des champs du formulaire */ if (get_magic_quotes_gpc()) { $civilite = stripslashes($_POST['civilite']);

$nom = stripslashes($_POST['nom']); $expediteur = stripslashes($_POST['email']); $ref1 = stripslashes($_POST['ref']); $message = stripslashes($_POST['message']); $options = stripslashes($_POST['options']); } else { $civilite = $_POST['civilite']; $nom = $_POST['nom']; $expediteur = $_POST['email']; $sujet = $_POST['sujet']; $ref1 = $_POST['ref']; $message = $_POST['message']; $options = $_POST['options']; } /* Destinataire (votre adresse e-mail) */ $to = $expediteur; /* Construction du message */ $msg = $message."\r\n"; $msg .= $options."\r\n"; $msg .= 'Dear '.$civilite.' '.$nom."\r\n\r\n"; $msg .= 'You are invited to review the above-mentioned manuscript that has been submitted for publication in IJFV International Journal On Finite Volumes . '."\r\n"; $msg .= 'Please DO NOT click REPLY to respond to this invitation.'."\r\n"; $msg .= 'To view the pdf, please click on:'."\r\n"; $msg .= 'http://localhost/IJFV/spip/IMG/pdf/'.$ref1."\r\n"; $msg .= 'If you are willing to review this manuscript, you may click on the link below to accept to review this article:'."\r\n"; $msg .= 'http://localhost/IJFV/spip/squelettes/mail.php'."\r\n"; /* En-ttes de l'e-mail */ $headers = "From: \"nom de celui qui envoie\"".$passage_lige; $header .= "Reply-to: \"nom de celui qui envoie\"".$passage_lige; /* Envoi de l'e-mail */ mail($to, $sujet, $msg, $headers); ?>

ds que le destinataire reoit le mail la ligne suivante $msg .= http://localhost/IJFV/spip/squelettes/mail.php.\r\n; lui affiche un lien sur lequel il doit cliquer pour accepter dameliorer larticle et le fait de cliquer sur ce lien active lenvoie dun mail { ladministrateur pour lui dire quil a accept pour activer cet envoie jai cre un autre ficher php que jai appel mail.php qui envoie le mail de confirmation suivant:

From='l'expediteur'; $mail->AddAddress('adress de des');

$mail->AddReplyTo(' qui repondre'); $mail->Subject='Confirmation of reviewer'; $mail->Body='Helo dear Fayssal i accept to review this article'; if(!$mail->Send()){ //Teste le return code de la fonction echo $mail->ErrorInfo; //Affiche le message d'erreur (ATTENTION:voir section 7) } else{ echo 'cliquer sur le lien suivant: afin de vous inscrire et reviewer cet article'; } $mail->SmtpClose(); unset($mail);

ma question est comment faire pour que ce message de confirmation contienne de faon automatique les coordones que je rentre dans le formulaire en dautres termes comment crer un lien entre mail.php et le ficher de traitement de mon formulaire.

REPLY

GF June 19, 2012 at 11:46


Ce nest pas trs compliqu

1) Ajouter mail.php, dans le lien vers la deuxime page, les donnes utiles.

Dans le premier bloc de code, modifier cette ligne :


$msg .= http://localhost/IJFV/spip/IMG/pdf/.$ref1.\r\n;

en :
$msg .= http://localhost/IJFV/spip/IMG/pdf/.$ref1.&civilite=".$civilite."& nom=".$nom"\r\n;

Remarques : - jai fait $civilite et $nom, il faut faire pareil pour le reste - il faudra convertir le contenu de ces variables en chanes acceptables dans des URL : v. la mthode urlencode() - tu peux tre tent de nettoyer lURL affiche dans le mail, avec une astuce du genre <a
href="http://localhost/monfichier.php?civilite=...&nom=...">http://lo

calhost/monfichier.php </a>, mais attention dans ce cas : le mail risque dtre dtect

comme une tentative de phishing. 2) Rcuprer les variables dans le deuxime fichier, comme tu las fait dans le premier, avec :

$civilite = $_GET["civilite"]; // et ainsi de suite

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
<?php $bdd = new PDO('mysql:host=serveur;dbname=nom_bdd', 'identifiant_bdd', 'mot_de_passe_bdd'); ?> Il faut adapter les lments en gras. serveur: si vous travaillez en local, il faut le mettre sur "localhost". nom_bdd: nom de la base de donne. identifiant_bdd: nom d'utilisateur pour la connexion. mot_de_passe_bdd: mot de passe correspondant. L'identifiant est souvent par dfaut sur "root" et le mot de passe vide.

Vous aimerez peut-être aussi