Connexion MYSQL

Document Sample
Connexion MYSQL Powered By Docstoc
					Connexion MySQL

La connexion MySQL via PHP se fait en 2 étapes. La première étape est la connexion au serveur
MySQL avec un identifiant et son mot de passe, et la seconde est le choix d'une base de données
de travail. Un exemple de connexion est montré par le script connexion.php ci-dessous :


<?php



           // On définit les 4 variables nécessaires à la connexion MySQL :



           $hostname = "mysql.php-astux.info";



           $user     = "user_mysql";



           $password = "password_mysql";



           $nom_base_donnees = "newslettux";




           // Connexion au serveur MySQL



           $conn = mysql_connect($hostname, $user, $password) or die(mysql_error());




           // Choix de la base sur laquelle travailler



           mysql_select_db($nom_base_donnees, $conn);



?>



En faisant un include('connexion.php'); dans vos pages PHP, vous aurez ainsi la connexion à
MySQL.

ATTENTION ! il est déconseillé, comme le font les "programmeurs du dimanche", de mettre ces
identifiants dans chaque fichier qui en a besoin, ceci pour 2 raisons :

        D'abord parce qu'un programmeur travaille correctement ;-)

        Ensuite parce que vous pouvez être amené à changer de serveur (changement
         d'hébergement, par exemple) et vous n'aurez qu'un seul fichier à retoucher, au lieu de
         reprendre toutes vos pages une à une;
        Enfin parce qu'il vaut mieux, question sécurité, placer ce connexion.php seul dans un
         dossier, protégé par un htaccess : si on vous pirate votre site et que ce dossier est bien
         protégé, les pirates n'auront pas accès à votre base de données...

Oui, ça fait 3 raisons, en fait ? Oui, et raison de plus !

La connexion MySQL peut être permanente ou non, et elle se termine par mysql_close(); :


<?php



           // ceci est le fichier connexion.php



           // On définit les 4 variables nécessaires à la connexion MySQL :



           $hostname = "mysql.php-astux.info";



           $user      = "user_mysql";



           $password = "password_mysql";



           $nom_base_donnees = "newslettux";




           // Connexion permanente au serveur MySQL : mysql_Pconnect



           $conn = mysql_pconnect($hostname, $user, $password) or die(mysql_error());




           // Choix de la base sur laquelle travailler



           mysql_select_db($nom_base_donnees, $conn);



?>



<?php



           // ceci est le fichier lambda.php



           // on ouvre la connexion MySQL



           include('connexion.php');
           // on fait les opérations nécessaires



           $req = "SELECT * FROM table WHERE condition";



           $dataset = mysql_query($req);




           // maintenant que la requête a été effectuée, on peut refermer la connexion



           mysql_close();



?>



La connexion permanente (pconnect) n'est pas acceptée par tous les hébergeurs. Elle sert à éviter
d'ouvrir une nouvelle connexion à chaque appel de ce fichier. Attention, si l'instruction
mysql_close() est trouvée, vous ne pourrez plus effectuer de requête après, à moins de réouvrir
une connexion.



Lecture de données

Pour enregistrer, lire, modifier ou supprimer des données, il faut au préalable établir une connexion
MySQL comme indiqué plus haut via un fichier ressemblant à connexion.php.



                                   Dataset, datarow
Derrière ces 2 termes anglais se cachent des concepts. Le "dataset" se traduit en français par "jeu
de données", c'est la réponse directe de MySQL à une requête. Le dataset contient 0, 1, 2 ... n
enregistrements. Chaque enregistrement est un "datarow", datarow étant la ligne de données. En
fait, lorsqu'on interroge MySQL, il retourne un bloc de réponses (dataset) que l'on va éplucher avec
php (datarow par datarow)

Pour mes exemples ci-après, je suppose cette table MySQL nommée 'pieces' décrite ci-après. Elle
contient 5 colonnes, respectivement l'identifiant, la référence du produit, la désignation, le
fabricant et la quantité en stock :


id_piece      reference     designation      fabricant      stock



--------      ---------     -----------      ---------      -----



10            PN-001        pneu             K-Outchou      25



12            VS-008        vis              Vis Corp.      1500
15             EJV-405       enjoliveur        Voiture Inc.   7



250            PLQ-031       plaque type 31    Placo et Cie   2



251            PH-100        phare 100W        Lumen          1




                     Les requêtes des exemples suivants
Reportez-vous aux articles SQL pour plus d'informations, on imagine ici 2 requêtes. Ces deux
requêtes vont me permettre d'illustrer 2 exemples très courants de la lecture de données MySQL.

         [Requête 1] => $req_piece_infos = "SELECT reference, designation, fabricant FROM pieces
          WHERE id_piece='15';";

         [Requête 2] => $req_stock_commande = "SELECT reference FROM pieces WHERE stock <
          10;";



                                           Requête 1
Elle extrait de la base des infos sur une pièce. Le dataset contient 1 seule ligne :


id_piece       reference     designation       fabricant      stock



--------       ---------     -----------       ---------      -----



15             EJV-405       enjoliveur        Voiture Inc.   7



Pour exploiter via PHP cette ligne, on utilise la commande mysql_fetch_array($dataset) : cette
commande crée un tableau associatif où chaque clé correspond à chaque colonne de la table, et
chaque valeur à chaque valeur lue du dataset :


<?php



            // on ouvre la connexion MySQL



            include('connexion.php');




            // on fait les opérations nécessaires



          $req_piece_infos = "SELECT reference, designation, fabricant FROM pieces WHERE
id_piece='15';";



          $dataset_piece_infos = mysql_query($req_piece_infos) or die($req_piece_infos."<br
/>\n".mysql_error());
          $piece = mysql_fetch_array($dataset_piece_infos);



          print_r($piece);



?>



ce print_r va afficher dans le code source :


Array(



          [id_piece] => 15



          [reference] => EJV-405



          [designation] => enjoliveur



          [fabricant] => Voiture Inc.



          [stock] => 7



)



Attention : les clés du tableau sont sensibles à la casse, si la colonne MySQL s'appelle Fabricant ou
fabricant, ce n'est pas la même chose !

Il ne reste plus qu'à afficher en PHP les infos voulues (exemple de code html dans une page
nommée pieces.php) :


<ul>



          <li>Pièce : <?php echo $piece['designation']; ?></li>



          <li>Fabricant : <?php echo $piece['fabricant']; ?></li>



          <li>Quantité en stock : <?php echo $piece['stock']; ?></li>



</ul>



Seul souci : si le dataset a plus d'une ligne (ici il n'y a que la pièce d'ID 15 qui est retournée par
MySQL), que se passe-t-il ?
                                            Requête 2
Lorsqu'elle sera exécutée, MySQL va retourner 3 lignes de la table. Il faudra donc éplucher les
lignes du dataset : si on applique un fetch_array directement, le tableau $piece ne contiendra que
la dernière ligne du dataset ! (En réalité, PHP va éplucher le dataset, mais va, à chaque nouvelle
ligne (datarow) lue, écraser la précédente, ce qui fait que seule la dernière ligne survit ...)

La solution : boucler la lecture. Lire "tant que la fin n'est pas atteinte". voici en code la solution :


<?php



          // on ouvre la connexion MySQL



          include('connexion.php');




          // on fait les opérations nécessaires



          $req_stock_commande = "SELECT reference, stock FROM pieces WHERE stock < 10;";



          $dataset_stock_commande = mysql_query($req_stock_commande) or
die($req_stock_commande."<br />\n".mysql_error());




          // Maintenant on va lire le dataset ligne par ligne (datarow par datarow)



          echo '<p>Pièces à commander :</p>';



          echo '<ul>';




          while($commande = mysql_fetch_array($dataset_stock_commande))



          {



                   echo '    <li>Référence : '.$commande['reference'].' (reste en stock :
'.$commande['stock'].')</li>';



          };



          echo '</ul>';
?>



Ceci va afficher :


<p>Pièces à commander :</p>



<ul>



           <li>Référence : EJV-405 (reste en stock : 7)</li>



           <li>Référence : PLQ-031 (reste en stock : 2)</li>



           <li>Référence : PH-100 (reste en stock : 1)</li>



</ul>



Vous savez lire des informations d'une base MySQL ! Pour toutes les opérations de tris, reportez-
vous aux articles SQL : les tris ne sont que des requêtes SQL qui renvoient un dataset que vous
savez désormais lire !



Manipulation de données

Manipuler des données, c'est les lire (nous venons de le voir), les mettre à jour, en insérer ou en
supprimer. La manipulation est toujours la même :

        Vérifier qu'une connexion MySQL est ouverte, en ouvrir une si besoin ;

        Préparer la requête ;

        Exécuter la requête.

Attention : évitez de faire du travail de barbare en mettant la requête directement dans
mysql_query, préparez-la en variable d'abord. Les avantages de cette méthode sont le débuggage,
si besoin (vous aurez remarqué le mysql_error que j'ai mis à chaque fois, qui retourne l'erreur de
MySQL si il y a besoin) et la réutilisation de la requête s'il y en a besoin plus loin (pour y ajouter un
LIMIT par exemple).

Lorsqu'une erreur de MySQL survient, pensez toujours à réafficher la requête exécutée et à afficher
le message d'erreur retourné : la solution est là. C'est ce que j'ai fait dans les exemples précédents
avec la clause "or die" du mysql_query.



Séparation des couches

Cet article est assez simplissime et n'a pour but que d'illustrer les commandes de base de lecture
de données. Il y a d'autres aspects à prendre en compte, il est possible, par exemple, d'optimiser
la connexion MySQL, ou de mieux séparer les couches de travail (MySQL => PHP => HTML). Ici,
j'ai mélangé des <ul>, <li> avec des <?php echo '...'; ?> et ce n'est pas une bonne chose ... ! En
réalité, il vaut mieux séparer les différents domaines dans un souci d'optimisation du code, d'une
part, et de mise à jour future, d'autre part... Par exemple :
   1. Tout d'abord, on se place coté PHP pour préparer les requêtes, les exécuter et récupérer
      les données brutes ;
   2. Ensuite, on affiche les données en HTML une fois toutes les opérations PHP effectuées ;
   3. Enfin, une couche de CSS vient donner un autre aspect à la mise en page de l'HTML.

Voici un embryon d'application à mon exemple des pièces à commander (bien des optimisations
sont encore possibles) :


<?php



         // On prépare la requête



         $req_pieces_a_commander = "SELECT



                                                id_piece,



                                                reference,



                                                designation,



                                                fabriquant,



                                                stock



                                        FROM



                                                pieces



                                        WHERE



                                                stock < 10;";




         // on exécute la requête SQL



         include('connexion.php');



          $pieces_a_commander = mysql_query($req_pieces_a_commander) or
die($req_pieces_a_commander."<br />\n".mysql_error());



         mysql_close();
         $array_pieces = array();




         // lecture du dataset et stockage en tableau PHP



         while($piece = mysql_fetch_array($pieces_a_commander))



         {



                   $array_pieces[$piece['id_piece']]['reference'] = $piece['reference'];



                   $array_pieces[$piece['id_piece']]['designation'] = $piece['designation'];



                   $array_pieces[$piece['id_piece']]['fabriquant'] = $piece['fabriquant'];



                   $array_pieces[$piece['id_piece']]['stock'] = $piece['stock'];



         };




         // maintenant que les opérations PHP sont finies, on affiche le résultat



          echo '<table cellpadding="0" cellspacing="0" border="1" summary="Liste des pièces à
commander">';



         echo '<thead>';



         echo '    <tr>';



         echo '              <th>ID Pièce</th>';



         echo '              <th>Réf.</th>';



         echo '              <th>Désignation</th>';



         echo '              <th>Fabricant</th>';



         echo '              <th>Stock</th>';



         echo '    </tr>';
          echo '</thead>';



          echo '<tbody>';




          foreach($array_pieces as $id_piece => $p)



          {



                    echo '    <tr>';



                    echo '              <td>'.$id_piece.'</td>';



                    echo '              <td>'.$p['reference'].'</td>';



                    echo '              <td>'.$piece['designation'].'</td>';



                    echo '              <td>'.$piece['fabriquant'].'</td>';



                    echo '              <td>'.$piece['stock'].'</td>';



                    echo '    </tr>';



          };




          echo '</tbody>';



          echo '</table>';



?>



Il reste à supposer que cette page bénéficie de styles CSS que je n'ai pas illustrés ici. Mais on ne
passe pas son temps à ouvrir php avec <?php et à le fermer avec ?> : on l'ouvre une fois, on fait
tous les calculs nécessaires puis on le ferme. On peut imaginer bien des conséquences par la suite
: une fonction (ou une méthode) pour afficher les pièces, des tris sur les pièces, etc.

Dernière remarque : mysql_error(). Dans tous les exemples de cette page, j'ai laissé les "die
mysql_error()" : le but est, en cas d'erreur MySQL, de réafficher la requête accompagnée de
l'erreur retournée par le moteur MySQL. Bien entendu, par précaution, il faudra masquer pour les
visiteurs cette erreur (ça ne sert à rien de leur dévoiler la structure de la base !) et savoir la
récupérer, par un mail à l'administrateur par exemple.
<?php

$var = '';

// Ceci est vrai, alors le texte est affiché
if (isset($var)) {
    echo 'Cette variable existe, donc je peux l\'afficher.';
}

// Dans les exemples suivants, nous utilisons var_dump() pour afficher
// le retour de la fonction isset().

$a = 'test';
$b = 'anothertest';

var_dump(isset($a));      // TRUE
var_dump(isset($a, $b)); // TRUE

unset ($a);

var_dump(isset($a));     // FALSE
var_dump(isset($a, $b)); // FALSE

$foo = NULL;
var_dump(isset($foo));   // FALSE

?>

				
DOCUMENT INFO
Shared By:
Stats:
views:16
posted:6/23/2012
language:
pages:11