IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

PHP : Le tutoriel pour grands débutants pressés

Image non disponible

PHP : Le tutoriel pour grands débutants pressés

Date de publication : 17 janvier 2009


VII. PHP ETAPE 7
VII-1. Les bases de données : suite et fin
VII-1-a. Pour travailler proprement (Généralités)
VII-1-b. Le code pour récupérer toutes les filles
VII-2. Un exemple (plus complexe) de relation dynamique entre php et sql
VII-3. TP7
VII-4. Correction du TP7


VII. PHP ETAPE 7


VII-1. Les bases de données : suite et fin

Nous savons maintenant remplir une base.
Reste à savoir l'exploiter et y récupérer les données souhaitées dans le cadre PHP.

Pour la suite de ce paragraphe, reprenez votre base MaBase, et votre table utilisateurs déjà riche d'au moins 5 enregistrements, voire plus si vous avez entré des données via votre formulaire...
En passant, avant de continuer, vérifiez dans votre base qu'il n'y a aucun doublon sur votre table, et supprimer les manuellement avant de continuer...

Pour supprimer un enregistrement, cliquez d'abord sur rechercher dans la table, qui vous affiche toutes les données de votre table.
Puis cliquez sur l'enregistrement à annuler, puis sur la croix rouge pour l'action "delete".

On a déjà mentionné la syntaxe sql d'une simple requête :

SELECT * WHERE pseudo="Zézette"

pour récupérer toutes la ligne d'infos concernant notre amie Zézette par exemple.

Sauf que ce sont plusieurs infos (l'ID, le pseudo, le sexe, l'âge, et la date d'inscription de notre amie), et qu'en PHP, on va devoir stocker ça dans un... tableau bien sûr.

Chaque enregistrement récupéré sur ma base devra donc être stocké dans un tableau pour PHP.

Du coup, pour récupérer un enregistrement dans ce tableau, on va utiliser la fonction PHP destinée à mysql : mysql_fetch_array($TrucRecupereSurSql), pour être sûr de ne rien rater :

Ainsi l'on récupère un tableau associatif qui a pour indice... le nom de chaque champ.

C'est pas plus pratique comme ça ?


VII-1-a. Pour travailler proprement (Généralités)

Voici cette fois l'ordre logique pour un code PHP propre qui lance une requête sql
  1. On se connecte à la base (en utilisant notre fonction de connexion toute prête).
  2. On prépare la commande sql en la stockant dans une variable PHP du type $sql (pour langage sql).
  3. On la lance, en récupérant le résultat dans une variable que nous appellerons $req (pour requete sql et qui pourra être un tableau si le résultat dépasse un élément).
  4. Si c'est un tableau : On scanne $req avec une boucle while (car on ne sait pas toujours le nombre de champs, ni d'enregistrements) et grâce à la fonction mysql_fetch_array($req), chaque élément de ce tableau se convoquera ainsi : $data['champ'].
  5. Maintenant qu'on a tout récupéré dans des variables "solides" PHP, on libère la mémoire sql mobilisée par cette requête.
  6. On ferme la connexion sql.
Maintenant le code devrait vous paraître moins barbare...


VII-1-b. Le code pour récupérer toutes les filles

Je souhaite construire une page infos.php qui affiche toutes les infos sur toutes les filles dans ma base MaBase, table utilisateurs.

Un code de récupération de données sql : Où sont les femmes ?

                        <?php
                            include("fonctions.php");
                        ?>
                        
                        <html>
                            <head>
                                <title>TOUTES LES INFOS SUR LES INSCRITS DU SITE</title>
                            </head>
                            <body>
                                <?php
                                //On se connecte
                                connectMaBase();
                                
                                // On prépare la requête 
                                 $sql = 'SELECT * FROM utilisateurs WHERE sexe="F"';  
                                 
                                // On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas (or die)  
                                $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
                                
                                //on organise $req en tableau associatif  $data['champ']
                                //en scannant chaque enregistrement récupéré
                                //on en profite pour gérer l'affichage
                                
                                //titre de la page avant la boucle
                                echo'<h2>TOUTES LES FILLES INSCRITES :</h2>';
                                
                                //boucle
                                while ($data = mysql_fetch_array($req)) { 
                                    // on affiche les résultats 
                                    echo 'Pseudo : <strong>'.$data['Pseudo'].'</strong><br />'; 
                                    echo 'Son âge : '.$data['Age'].'<br />';  
                                    echo 'Sa date d\'inscription : '.$data['DateInscription'].'<br /><br/>';
                                }  
                                //On libère la mémoire mobilisée pour cette requête dans sql
                                //$data de PHP lui est toujours accessible !
                                mysql_free_result ($req);  
                                
                                //On ferme sql
                                mysql_close ();  
                                ?>
                            </body>
                        </html>
                        

C'est beau hein ? Et bon, ça marche.
Testez, bidouillez, triturez...
Cherchez les hommes, cherchez les gens âgés de plus de tel âge etc...

Bref, familiarisez vous avec le code avant d'attaquer le paragraphe suivant, qui pousse un peu plus loin...


VII-2. Un exemple (plus complexe) de relation dynamique entre php et sql

Creusons ce chapitre pour aborder une idée supplémentaire :

Vous souhaitez laisser à l'utilisateur (imaginons que vous programmez une partie administration ou back office d'un site) le choix de son critère de recherche.
Il entre dans un formulaire les critères choisis, et votre code fait le reste.

Cela signifie que l'on veut obtenir une variable $sql du type :

$sql = 'SELECT * FROM utilisateurs WHERE '.$champ.'="'.$critere.'"';

Ne restent plus qu'à proposer un formulaire où l'administrateur entrera son choix de champ et de critère...
Il faut donc lui construire la liste de champs sous forme de liste déroulante en "tapant" dans la base une première fois : il n'est pas censé connaître la base par coeur...

Quelle requête pouvons nous faire pour récupérer tous les champs d'une table ?

$sql = 'Show fields from utilisateurs';


Bon ben, ya plus qu'à !

Partie admin du site : exemple de codage de back-office

                <?php
                include("fonctions.php");
                ?>
                <html>
                    <head>
                        <title>ADMINISTRATION DU SITE</title>
                    </head>
                    <body>
                        <h2>Choisissez le champ qui vous intéresse et entrez manuellement un critère</h2>
                        <h4>Une absence de critères vous montre toutes les données du champ</h4>
                        <!--
                            Commentaires html
                            On construit une liste déroulante ( un select et plusieurs options)
                            Chaque option sera remplie par une donnée sql récupérée par notre requête php
                        -->
                        <form method="post" action="admin.php">
                            <select name="champ">
                            	<?php
                            	//On se connecte
                            	connectMaBase();
                            	//On prépare la requête sql qui récupère les champs
                            	$sql = 'Show fields from utilisateurs';
                            	/* On lance la requête (mysql_query) 
                                et on impose un message d'erreur si la requête ne passe pas (or die) */ 
                            	$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            	//On scanne le résultat et on construit chaque option avec
                            	while($data = mysql_fetch_array($req)){
                            		// on affiche chaque champ
                            		echo '<option name="'.$data['Field'].'">'.$data['Field'].'</option>';
                            	}
                            	//On libère mysql de cette première requête
                            	mysql_free_result ($req); 
                            	//On ferme le select
                            	?>
                            </select>
                            Entrez votre critère de sélection sur ce champ : <input type="text" name="critere"/>
                            <input type="submit" name="Valider" value="OK"/>
                        </form>
                        <!--
                        On ferme le formulaire
                        -->
                        <?php
                        //On traite le formulaire
                        if(isset($_POST['Valider'])){
                        	$champ=$_POST['champ'];
                        	$critere=$_POST['critere'];
                        	
                        	// On prépare la requête 
                        	//requête différente selon qu'on veut tout le champ
                        	//ou un champ avec une condition
                        	if(($critere=='')||($critere==NULL)){
                        		$sql='SELECT '.$champ.' FROM utilisateurs';
                        	}
                        	else{
                        		$sql = 'SELECT * FROM utilisateurs WHERE '.$champ.'="'.$critere.'"'; 
                        	}
                        	/* On lance la requête (mysql_query) 
                            et on impose un message d'erreur si la requête ne passe pas (or die)*/ 
                        	$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
                        
                        	//Affichage du résultat
                        	echo'<h2>Résultat</h2>';
                        
                        	//On scanne chaque résultat et affiche
                        	while($data = mysql_fetch_array($req)){
                            	/* on affiche les résultats 
                            	C'est pas très propre mais la fonction print_r vous permet de tout voir sur votre objet tableau :
                                Quand vous êtes complètement perdu sur ce que votre tableau est censé comporter :
                                Tapez cette commande print_r($tableau), 
                                vous retrouverez facilement la structure du tableau (index et valeurs)*/
                                
                            	print_r($data);
                            	echo'<br/>';
                        	}
                        	//On libère la mémoire mobilisée pour cette seconde requête dans sql
                        	mysql_free_result ($req);  
                        
                        	//On ferme sql
                        	mysql_close ();  
                        }
                        ?>
                </body>
                </html>
                

VII-3. TP7

Repartez de la correction du TP6 qui gérait la table abonnements.

Si ce n'est déjà fait, récupérez les fichiers abonnement.php, fonctions.php et veillez à construire la table abonnes dans phpMyAdmin.

Insérez (via le formulaire) au moins 10 enregistrements en variant largement les données du type age, civilité et Code Postal.
Si vous manquez totalement d'imagination, voici un exemple :


Un exemple d'abonnés à nos abonnements
Un exemple d'abonnés à nos abonnements


Maintenant, construisez la partie administration dans un fichier infoabo.php qui se présente ainsi :


                Bonjour à l'administrateur du site.
                
                Vous souhaitez voir : (proposez une liste déroulante avec les 6 options ci dessous) et un bouton OK.
                
                Toutes les dames et demoiselles abonnées (commentaire : sous la forme Mme DUPONT Sandrine)
                
                Tous les messieurs abonnés
                
                Tous les abonnés qui ont moins de 30 ans
                
                Tous les abonnés qui ont 30 ans ou plus
                
                Tous les abonnés par magazine (commentaire : on veut titre du mag : tous les abos etc... 4 fois)
                
                Tous les codes postaux des abonnés (juste les codes postaux)
                

Quand l'administrateur clique OK, l'info sélectionnée apparaît propre en dessous du formulaire de départ, ce qui lui permet de recommencer à loisir ces recherches.

Ajoutez enfin un bouton quitter, qui vous ramène à la page abonnement.php.

Et une fois n'est pas coutume, vous pouvez copier-coller tout ce que vous voulez !
(heu, sauf la correction qui suit bien sûr)...


VII-4. Correction du TP7

Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.
infoabo.php

                <?php
                /*Si user a cliqué sur retour à la page d'accueil, redirection
                ATTENTION : un header location se met toujours en toute première instruction (et avant le html)*/
                
                if(isset($_POST['quitter'])){
                	header("location: abonnement.php");
                }
                //Intégrer le fichier des fonctions
                include("fonctions.php");
                
                /*Gérer le problème de l'affichage dans le select de l'option sélectionnée
                sinon on reste bloqué au cas women à chaque rafraîchissement de la page
                même si le reste du code s'exécute parfaitement*/
                
                //Si user a cliqué ok après avoir choisi une info
                //initialise $info en fonction
                
                if(isset($_POST['info'])){
                	$info=$_POST['info'];
                }
                
                //valeur par défaut à l'arrivée
                
                else{
                	$info="women";
                }
                
                /*voir suite dans les ajouts PHP dans le select
                affiche l'option selected le cas échéant*/
                ?>
                
                <html>
                    <head>
                        <title>Information sur les abonnés</title>
                    </head>
                    <body>
                        <h1>Bonjour à l'administrateur du site</h1>
                        <h2>Vous souhaitez voir :</h2>
                        <form name="info" method="post" action="infoabo.php">
                        	<select name="info">
                        		<option value="women" <?php if($info =='women') { echo 'selected'; } ?>>Toutes les dames et demoiselles abonnées</option>
                        		<option value="men" <?php if($info =='men') { echo 'selected'; } ?>>Tous les messieurs abonnés</option>
                        		<option value="jeunes" <?php if($info =='jeunes') { echo 'selected'; } ?>>Tous les abonné(e)s de moins de 30 ans</option>
                        		<option value="vieux" <?php if($info =='vieux') { echo 'selected'; } ?>>Tous les abonné(e)s de 30 ans ou plus</option>
                        		<option value="mag" <?php if($info =='mag') { echo 'selected'; } ?>>Tous les abonné(e)s par magazine</option>
                        		<option value="CP" <?php if($info =='CP') { echo 'selected'; } ?>>Tous les codes postaux des abonné(e)s</option>
                        	</select>
                        	<input type="submit" name="valider" value="OK"/><br/>
                        	<input type="submit" name="quitter" value="Retour à la page d'accueil"/>
                        </form>
                        
                        <?php
                            /*attention à la gestion des libérations de mémoire
                            c'est à la fin de chaque requête différente
                            Plusieurs peuvent donc se succéder
                            tandis que la connexion à la base et la déconnexion 
                            ne se font qu'une seule fois quand la base entre ou sort du jeu*/
                            
                            //Commun à n'importe quelle option
                            
                            if (isset ($_POST['info'])){
                            
                            	//connexion initiale de la db
                            	connectMaBase();
                            
                            	//Gérer chaque choix :
                            	if($info=='women'){
                            		$sql='SELECT * from abonnes WHERE Civ="Mme" || Civ="Mlle"'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		while ($data = mysql_fetch_array($req)) { 
                            			echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            		}
                            		mysql_free_result ($req); 
                            		
                            	}
                            	elseif($info=='men'){
                            		$info="men";
                            		$sql='SELECT * from abonnes WHERE Civ="M."'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		while ($data = mysql_fetch_array($req)) { 
                            			echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            		}
                            		mysql_free_result ($req); 
                            	}
                            	elseif($info=='jeunes'){
                            
                            		$sql='SELECT * from abonnes WHERE Age<30'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		while ($data = mysql_fetch_array($req)) { 
                            			echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            		}
                            		mysql_free_result ($req); 
                            	}
                            	elseif($info=='vieux'){
                            
                            		$sql='SELECT * from abonnes WHERE Age>=30'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		while ($data = mysql_fetch_array($req)) { 
                            			echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            		}
                            		mysql_free_result ($req); 
                            	}
                            
                            	/*cas particulier du mag : il s'y imbrique des conditions successives qui s'ajoutent 
                                (succession de simples if)
                            	pour afficher tous les magazines*/
                            	elseif($info=='mag'){
                            
                            		$sql='SELECT * from abonnes WHERE abo="oeil"'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            
                            		/*Point besoin d'afficher si personne n'est abonné à ce mag
                            		donc encadrer l'affichage dans condition*/
                            		
                                    //si requete non nulle
                            		if ($req!=NULL){
                            			echo'<h3>Liste des abonné(e)s à "J\'ai l\'oeil vif".</h3>';
                            			while ($data = mysql_fetch_array($req)) { 
                            				echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            			}
                            		}
                            		mysql_free_result ($req); 
                            
                            		$sql='SELECT * from abonnes WHERE abo="pied"'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		if ($req!=NULL){
                            			echo'<h3>Liste des abonné(e)s à "J\'ai le pied marin".</h3>';
                            			while ($data = mysql_fetch_array($req)) { 
                            				echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            			}
                            		}
                            		mysql_free_result ($req); 
                            
                            		$sql='SELECT * from abonnes WHERE abo="main"'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		if ($req!=NULL){
                            			echo'<h3>Liste des abonné(e)s à "J\'ai la main verte".</h3>';
                            			while ($data = mysql_fetch_array($req)) { 
                            				echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            			}
                            		}
                            		mysql_free_result ($req); 
                            
                            		$sql='SELECT * from abonnes WHERE abo="rate"'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		if ($req!=NULL){
                            			echo'<h3>Liste des abonné(e)s à "J\'ai la rate qui se dilate".</h3>';
                            			while ($data = mysql_fetch_array($req)) { 
                            				echo $data['Civ'].' <strong>'.$data['Nom'].'</strong> '.$data['Prenom'].'<br/>';
                            			}
                            		}
                            		mysql_free_result ($req); 
                            	}
                            
                            	/*cas particulier du CP
                            	On veut juste la liste de toutes les valeurs que peut prendre ce champ
                            	donc pas de where restrictif*/
                            	
                            	elseif($info=='CP'){
                            
                            		$sql='SELECT CP from abonnes'; 
                            		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            		echo'<h3>Tous les codes postaux de nos abonnés</h3>';
                            		while ($data = mysql_fetch_array($req)) { 
                            			echo $data['CP'].'<br/>';
                            		}
                            		mysql_free_result ($req); 
                            	}
                            	else{
                            		echo'Vous n\'avez rien sélectionné ?';
                            	}
                            	 //clôture finale de la db
                            	mysql_close ();  
                            }
                        ?>
                    
                    </body>
                </html>
                
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 VAUTHIER Sylvie. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.