Une phrase au hasard en PHP
Un article de Mangue.org, l'encyclopéde libre.
Afficher une phrase au hasard, ça a l'air bête comme ça, mais ça dynamise pas mal un site et ça peut être assez drôle. Bien sûr, au lieu d'afficher une citation débile ou une blague des Grosse Têtes, on peut toujours ressortir ses poussiéreux cours de latin histoire de se la jouer avec des citations en VO de Platon ou Horace, mais à ce niveau là, c'est vous que ça regarde... Donc comme on l'a écrit deux lignes plus haut, ça a l'air tout bête. Et en plus ça l'est. (si si, garanti!)
Et qu'on n'aille pas nous faire dire ce qu'on n'a pas dit, on se contentera ici d'afficher une phrase prise au hasard dans une base MySQL. Ce qui signifie aucune gestion d'utilisateurs, de date ou d'un quelconque plan pour conquérir le monde...
| Sommaire |
La base de données
C'est très simple, tout ce dont on a besoin, c'est une table avec un champ. Alors vous allez dire, "c'est à se demander quelle utilité il y a à utiliser une base de données pour faire ça..." Et vous aurez raison. On pourrait gérer ça à partir d'un fichier texte, mais bon on est là pour apprendre à utiliser le PHP et MySQL, non ?
Donc admettons que nous ayons à notre disposition une table nommée "citation" contenant un champ nommé "phrase".
Le code
- Connection à la base de données
- Récupération de toutes les phrases
- Calcul d'un nombre aléatoire
- Affichage
La connection à la base de données se fait par le biais de la fonction mysql_connect, qui prend en premier paramètre le nom du serveur (ici "localhost" pour utiliser le serveur mysql sur la machine sur laquelle nous sommes), en second le nom d'utilisateur, et en dernier son mot de passe. Cela donne par exemple, si vous utilisez EasyPhp :
mysql_connect("localhost", "root", "");
Evidemment, pour bien faire il faudrait sécuriser un peu le fichier contenant le mot de passe, mais cela dépasse les ambitions de ce cours, et on se contentera donc d'utiliser la fonction telle quelle pour l'instant.
Une fois connectés au serveur MySQL, la récupération des phrases se fait de manière très simple:
// on prépare la requête SQL... $query = "SELECT * FROM citation"; //... et on l'exécute. Notez que si une erreur survient, // l'exécution du script s'arrête et l'erreur MySQL est affichée. $result = mysql_query($query) or die(mysql_error());
On choisit un nombre au hasard :
// initialisation du générateur de nombres aléatoires // on initialise ici avec un nombre complètement arbitraire, à savoir // le nombre de microsecondes écoulées depuis la dernière seconde entière srand((double)microtime()*10000); // la fonction rand(min, max) retourne un nombre aléatoire // compris entre les deux valeurs passées en paramètre // on veut un chiffre entre 0 et le nombre de phrases dans la base, // on récupère donc le nombre de phrases $num = mysql_num_rows($result); // puis on appelle rand() // avec $num-1 comme valeur maximale, du fait que dans le // résultat retourné par MySQL, l'indexation commence à l'indice 0 $nb = rand(0, $num-1);
On va extraire la phrase voulue du résultat de la requête SQL, puis l'afficher:
// mysql_data_seek($resultat, $deplacement); // permet de se "déplacer" dans un résultat de requête. // En effet, lorsqu'il exécute une requête, MySQL renvoie une variable // contenant toutes les lignes de résultat. // Ici nous allons donc nous positionner sur la ligne portant le numéro // aléatoire calculé précédemment : mysql_data_seek($result, $nb); // A présent, il faut extraire la ligne de résultat que nous venons de choisir. // La fonction mysql_fetch assoc, comme toutes les fonctions mysql_fetch_*, // sert à extraire les données de la ligne de résultat courante sous une certaine forme // Dans le cas de mysql_fetch_assoc, il s'agit d'un tableau associatif : on retrouvera donc // la valeur de notre champs de base de données "phrase" dans $ligne['phrase'] $ligne = mysql_fetch_assoc($result); // affichage de la phrase print($ligne['phrase']);
Insertion d'une phrase dans la base
Cet article ne serait pas complet sans l'explication du script pour insérer une phrase dans la base. Ce qui n'est d'ailleurs pas beaucoup plus sorcier que le reste.
On va commencer par créer un formulaire html qui va ressembler à ça:
Et dont le code n'est pas bien méchant...
<html>
<head>
<title>.:: le f0rmul41r3 qui r0x0r ::.</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#000000">
<font color="#FFFFFF" face="Verdana, Arial, Helvetica, sans-serif" size="2">
<b>Saisissez votre phrase:</b>
</font>
<form method="post" action="add_phrase.php">
<input type="text" name="Fphrase" size="30">
<input type="submit" name="Submit" value="Et hop!">
</form>
</body>
</html>
Dans le fichier add_phrase.php, on devra se connecter à la base MySQL, puis insérer les données à l'aide du code suivant:
// On commence par récupérer la valeur saisie. Pour cela, nous allons utiliser // le tableau $_POST. Ce tableau fait partie des variables globales automatiques // de Php. Autrement dit, ces variables sont toujours accessibles. // Le tableau $_POST contiendra ce qui est passé au serveur via la méthode HTTP // POST (souvenez-vous, dans notre formulaire, la balise "form" avait un attribut // "method", que nous avons mis à... post). // Chaque poste du tableau est assessible par le nom du champ dans le formulaire, // nous retrouverons donc ce que nous avons saisi dans $_POST['Fphrase'], // puisque notre champ de saisie portait le nom "Fphrase". $Fphrase = $_POST['Fphrase']; // Maintenant que nous avons la valeur saisie, nous voulons l'écrire dans // la base de données : $query = "INSERT INTO citation VALUES('$Fphrase')"; mysql_query($query) or die(mysql_error());
Tout cela fonctionne très bien, mais que se passe-t-il si la phrase saisie contient une apostrophe ?
Admettons que nous saisissions la phrase "Mangue, c'est trodlabal.".
Dans ce cas, lorsque nous écrirons :
$query = "INSERT INTO citation VALUES('$Fphrase')";
La variable $query va contenir :
INSERT INTO citation VALUES('Mangue c'est trodlabal.')
Cette requête provoquera une erreur: les chaines de caractères étant délimitées par des apostrophes, MySQL considèrera que la phrase s'arrête après "Mangue c", et les caractères suivants provoqueront une erreur.
D'autre part, ce problème est à la base de la fameuse technique de "SQL Injection", qui permet de faire exécuter des requêtes SQL sur un site qui ne prendrait pas le problème des apostrophes en compte.
Pour régler ce problème, nous pouvons ajouter un anti-slash devant les apostrophes, de façon à ce que MySQL comprenne que nous voulons insérer une apostrophe, et non indiquer la fin d'une chaine de caractères. En général, cette opération est dévolue à la fonction addslashes, mais il existe en réalité une fonction qui réalise cette opération spécialement pour MySQL (en prend donc en compte les cas particuliers pour ce SGBDR). Il s'agit de la fonction mysql_escape_string. Cependant, un autre problème vient se glisser ici : aux premières heures de Php, il a semblé bon de rendre l'opération d'ajout d'anti-slashes automatique pour les données voyageant par les méthodes POST, GET (les données que l'on passe dans l'url d'une page), et les cookies. C'est l'option "magic_quotes_gpc", qui appelle addslashes sur toutes ces données.
Malheureusement, chacun n'a pas les mêmes besoins, et au final cette solution crée plus de problèmes qu'elle n'en résoud. En effet, que se passe-t-il si vos données comportent déjà des anti-slash et que vous appelez mysql_escape_string dessus ? La réponse est simple, chaque anti-slash sera lui-même précédé d'un autre anti-slash, et la phrase, lorsque vous voudrez l'afficher, ressemblera à ça :
Mangue, c\'est trodlabal.
Il existe des fonctions pour enlever les anti-slashes en trop (la fonction stripslashes, notamment), mais nous préférons prendre le mal à la racine et empêcher l'insertion en base de données des anti-slashes en trop. Pour cela, nous allons vérifier si l'option "magic_quotes_gpc" est activée sur le serveur, puis enlever les anti-slashes qu'elle a ajoutée si besoin est (grâce à stripslashes). Ensuite, nous appellerons mysql_escape_string afin de mettre la chaine de caractères au bon format pour MySQL.
Cela donnera donc :
$Fphrase = $_POST['Fphrase']; // si l'option magic_quotes_gpc est activée if( get_magic_quotes_gpc() == true ) { // on enlève les "\" en trop $Fphrase = stripslashes($Fphrase); } // on formate la chaine pour MySQL $Fphrase = mysql_escape_string($Fphrase); // Maintenant que nous avons la valeur saisie au bon format, // nous pouvons l'écrire dans la base de données : $query = "INSERT INTO citation VALUES('$Fphrase')"; mysql_query($query) or die(mysql_error());
Enfin, faisons quelques tests pour éviter d'insérer une chaine vide. On pourra tester la présence ou non d'une saisie dans le formulaire par le code suivant:
// isset vérifie que la variable passée en paramètre existe // et empty regarde si il y a quelque chose dedans if(isset($Fphrase) && !empty($Fphrase)) { ....
Ce qui donne au final:
$Fphrase = $_POST['Fphrase']; if(isset($Fphrase) && !empty($Fphrase)) { if( get_magic_quotes_gpc() == true ) { // on enlève les "\" en trop $Fphrase = stripslashes($Fphrase); } $Fphrase = mysql_escape_string($Fphrase); $query = "INSERT INTO citation VALUES('$Fphrase')"; mysql_query($query) or die(mysql_error()); } else print("Ha ben non là on ne va pas insérer car tu n'as rien saisi...");
Conclusion
Voilà, c'était pas bien méchant, hein? Evidemment, ça n'est là qu'un exemple bien basique, mais rien ne vous empêche de complexifier la chose, pour par exemple prendre en compte la date, le nom de la personne qui a saisi la phrase, etc.
En attendant, si les explications vous semblent obscures ou que quelque chose vous a échappé, n'hésitez pas à nous écrire ou à poser vos questions sur le forum!
Annexe
Le code à télécharger, dès que j'aurais trouvé comment uploader un fichier :)


