1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P27 pptx

5 124 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 147,71 KB

Nội dung

108 Chapitre 2. Techniques de base <h1>Faites votre commande au restaurant </h1> <?php require_once ("Connect.php"); require_once ("Connexion.php"); require_once ("ExecRequete.php"); require_once ("Normalisation .php"); require_once ("FormCommande.php"); // Connexion à la base $connexion = Connexion (NOM, PASSE, BASE, SERVEUR) ; // Normalisation des entrées HTTP Normalisation() ; // Si le type de choix n’ est pas défini : on commence // par proposer les entrées if (! isSet ($_POST[ ’type_choix ’ ]) ) { echo "Bonjour . Nous vous avons attribué la session " . session_id () . "<br/>" ; FormCommande ( " Entrée " , " SessionPHP . php " , $connexion ) ; } else { // Enregistrons le choix qui vient d’être fait // Il faudrait tester que id_choix est défini $ req u e t e = "SELECT l i b e l l e FROM Car te " . "WHERE id_choix=’$_POST[ id_choix ] ’ " ; $resultat = ExecRequete ($requete , $connexion); $choix = ObjetSuivant ( $resultat ) ; $_SESSION [$_POST[ ’ type_choix ’ ] ] = $choix −>libelle ; // Affichage des choix déjà effectués if ( isS e t ($_SESSION[ ’ Entrée ’ ] ) ) echo " Votre entrée : " . $_SESSION [ ’ Entrée ’ ] . "<br /> " ; if ( isS e t ($_SESSION[ ’ Plat ’ ] ) ) echo " Votre pl at : " . $_SESSION[ ’ Plat ’ ] . "<br /> " ; if ( isS e t ($_SESSION[ ’ Dess er t ’ ]) ) echo " Votre d e s s e r t : " . $_SESSION[ ’ Desser t ’ ] . "<br / > " ; // Affichage de la suite if ($_POST[ ’type_choix ’ ] == ’Entrée ’) FormCommande ( " Plat " , " SessionPHP . php " , $connexion ) ; else if ($_POST[ ’type_choix ’ ] == ’ Plat ’) FormCommande ( " Dess er t " , " SessionPHP . php " , $connexion ) ; else { echo "<p>Nous avons noté votre commande. Merci !<p/>" ; session_destroy () ; } } 2.6 SQL dynamique et affichage multi-pages 109 ?> </body> </html> Les deux différences principales sont, d’une part, le recours à la fonction session_start() qui remplace la manipulation explicite des cookies (voir le script ExSession.php, page 103), et d’autre part l’utilisation du tableau $_SESSION àlaplace de la table Commande. Ce tableau peut être vu comme une variable PHP persistante entre deux échanges client/serveur. Cette persistance est obtenue en stockant les valeurs du tableau dans un fichier temporaire, situé par exemple sous Unix dans le répertoire /tmp (et configurable avec le paramètre session_save_path dans le fichier php.ini). Ce mécanisme, valable pour la mise en place d’un système de gestion des ses- sions très simple, trouve rapidement ses limites. Si de très nombreuses informations doivent être associées à une session, il est préférable de les placer dans la base de données, en les référençant par l’identifiant de session (donné par la fonction session_id()). Une base de données permet de mieux structurer les informations. Elle persiste sur une très longue durée, contrairement à un fichier temporaire. D’autre part, elle est plus sûre puisque seuls les utilisateurs autorisés peuvent y accéder. Les principes de gestion de session présentés ici seront repris de manière plus étendue dans le chapitre 7 pour développer des utilitaires robustes et associer la ges- tion de sessions à l’authentification des utilisateurs dans une base MySQL. Les fonc- tionnalités de PHP présentées précédemment nous suffiront puisque nous utilisons MySQL, mais vous pouvez consulter les autres fonctions PHP dans la documentation si vous pensez avoir à utiliser le mécanisme natif PHP. Il est possible en particulier d’éviter l’utilisation des cookies en demandant à PHP la réécriture de chaque URL dans une page pour y inclure l’identifiant de session. Comme expliqué au début de cette section, cette méthode reste cependant globalement insatisfaisante et peu sûre. 2.6 SQL DYNAMIQUE ET AFFICHAGE MULTI-PAGES Dans la plupart des cas les requêtes SQL exécutées dans les scripts PHP sont fixées par le programmeur et ce dernier connaît le type du résultat (nombre d’attributs et noms des attributs). Il peut arriver que les ordres SQL soient « dynamiques », c’est-à-dire déterminés à l’exécution. C’est le cas par exemple quand on permet à l’utilisateur d’effectuer directement des requêtes SQL sur la base et d’afficher le résultat sous forme de table. On peut alors faire appel à des fonctions MySQL qui donnent des informations sur le type du résultat. Voici une illustration de cette fonctionnalité avec, en guise de garniture, l’af- fichage « multi-pages » du résultat. Au lieu de donner en bloc, dans une seule page HTML, toutes les lignes du résultat de la requête, on affiche seulement un sous-groupe de taille fixée (ici, 10), et on donne la possibilité de passer d’un groupe à l’autre avec des ancres. 110 Chapitre 2. Techniques de base 2.6.1 Affichage d’une requête dynamique Commençons par écrire une fonction qui prend en argument le résultat d’une requête (tel qu’il est rendu par la fonction mysql_query()), la position de la première ligne à afficher, et le nombre de lignes à afficher. Exemple 2.31 exemples/AfficheResultat.php : Affichage partiel du résultat d’une requête SQL <?php // Affichage partiel du résultat d’une requête require ("UtilBD . php") ; function AfficheResultat ($resultat , $position , $nbrLignes) { // Affichage d’un tableau HTML, avec autant de colonnes // que d’attributs . On affiche $nbrLignes lignes , // à partir de la ligne indiquée par $position , echo "<table border=’4’>"; $compteurLignes = 1; $nbAttr = mysql_num_fields ($resultat); $noLigne=0; while ($tabAttr = mysql_fetch_row ($resultat)) { // Avant la première ligne , on affich e l ’en−tête de la table if ($compteurLignes == 1) { echo "<tr >" ; // Affichage des noms d’ attributs for ($i=0; $i < $nbAttr ; $i++) echo "<th>" . mysql_field_name ($resultat , $i) . "</th>\n"; } // Affichage de chaque ligne dans la fourchette [ première , dernière ] if ($compteurLignes >= $position and $compteurLignes <= $position + $nbrLignes −1) { $classe = "A" . (( $noLigne++) % 2) ; echo "<tr class=’$classe’>"; for ($i=0; $i < $nbAttr ; $i++) { if ( empty($tabAttr [ $i ])) $tabAttr [ $i ] = "Champ vide" ; echo "<td>$tabAttr [ $i]</td>"; } echo "</tr>\n"; } // Inutile de continuer si tout est affiché if ($compteurLignes++ >= $position + $nbrLignes − 1) break ; } 2.6 SQL dynamique et affichage multi-pages 111 echo "</table>\n"; } ?> La fonction AfficheResultat() utilise quelques nouvelles fonctionnalités de l’interface MySQL/PHP. Elles permettent d’obtenir la description du résultat, en plus du résultat lui-même. 1. mysql_num_fields() donne le nombre d’attributs dans le résultat ; 2. mysql_field_name() donne le nom de l’un des attributs ; 3. mysql_fetch_row() renvoie la ligne sous forme d’un tableau indicé, plus facile à manipuler que les tableaux associatifs ou les objets quand on doit exploiter le résultat de requêtes quelconques pour lesquelles on ne connaît pas, apriori, le type du résultat et donc le nom des attributs. L’affichage comprend deux boucles. La première, classique, permet de parcourir toutes les lignes du résultat. Notez qu’ici on ne prend en compte que les lignes à présenter, à savoir celles dont la position est comprise entre $position et $position+$nbrLignes-1. La seconde boucle parcourt, pour une ligne donnée, tous les attributs. echo "<tr class=’A’" . (($noLigne++) % 2) . ">"; for ($i=0; $i < $nbAttr ; $i++) { if ( empty($tabAttr [ $i ])) $tabAttr [ $i ] = "Champ vide" ; echo "<td>$tabAttr [ $i]</td>"; } echo "</tr>\n"; On alterne la couleur de fond pour rendre la table plus lisible. Notre feuille de style, films.css , définit deux couleurs de fond pour les classes A0 et A1. tr.A0 {background-color:white} tr.A1 {background-color:yellow} On utilise alternativement les classes A0 et A1 pour la balise <tr>. On concatène pour cela le caractère ’A’ avec le résultat de l’expression $l++ % 2.Lavariable$l++ est un entier qui, auto-incrémenté par l’opérateur ’++’, vaut successivement 0, 1, 2, 3, etc. En prenant cette valeur modulo 2 (l’opérateur ’%’), on obtient l’alternance souhaitée de 0 et de 1. 2.6.2 Affichage multi-pages Voyons maintenant comment réaliser l’affichage multi-pages, une technique très utile pour afficher de longues listes et utilisée, par exemple, par les moteurs de recherche. 112 Chapitre 2. Techniques de base Exemple 2.32 exemples/ExecSQL.php : Affichage multi-pages du résultat d’une requête <?xml version="1.0" encoding=" iso −8959−1"?> <!DOCTYPE html PUBLIC " −/ /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN " "http ://www.w3. org /TR/xhtml1/DTD/xhtml1−strict .dtd"> <html xmlns="http ://www.w3. org/1999/xhtml" xml: lang="fr "> <head> <title >Interrogation avec SQL</title > < link rel=’stylesheet ’ href="films . css" type="text/ css" /> </head> <body> <h1>Interrogation avec SQL</h1> <form method=’ post ’ action=’ExecSQL.php ’> <textarea name=’requete ’ cols=’50 ’ rows=’3 ’><?php if ( i s S e t ($_REQUEST [ ’ r e q u e t e ’ ] ) ) echo $_REQUEST [ ’ r e q u e t e ’ ] ; else echo "SELECT ∗ FROM F i l m S i m p l e " ; ?> </textarea> <br /> <input name=’ submit ’ type=’ submit ’ value=’ Exécuter ’ /> </form> <?php require_once ("UtilBD.php"); require_once ("Normalisation .php"); require_once ("AfficheResultat.php"); define ( "TAILLE_GROUPE" , 10) ; // Connexion à la base $connexion = Connexion (NOM, PASSE, BASE, SERVEUR) ; // Normalisation des entrées HTTP Normalisation() ; // La requête existe ? Il faut la traiter . if ( i s S e t ($_REQUEST [ ’ r e q u e t e ’ ] ) ) { $resultat = ExecRequete ($_REQUEST[ ’ requete ’ ] , $connexion); // On code la requête pour la placer dans une URL $requeteCodee = urlEncode($_REQUEST[ ’requete ’ ]) ; // On vient de soumettre la requête dans le formulaire ? Dans // ce cas la // première ligne doit être affichée . Sinon on récupère la position courante if ( i s S e t ($_POST [ ’ submit ’ ] ) ) { $position = 1; . l’utilisation des cookies en demandant à PHP la réécriture de chaque URL dans une page pour y inclure l’identifiant de session. Comme expliqué au début de cette section, cette méthode reste cependant. { $resultat = ExecRequete ($_REQUEST[ ’ requete ’ ] , $connexion); // On code la requête pour la placer dans une URL $requeteCodee = urlEncode($_REQUEST[ ’requete ’ ]) ; // On vient de soumettre la requête. y accéder. Les principes de gestion de session présentés ici seront repris de manière plus étendue dans le chapitre 7 pour développer des utilitaires robustes et associer la ges- tion de sessions

Ngày đăng: 06/07/2014, 00:20