Php pdo

De The Linux Craftsman
Révision datée du 6 décembre 2018 à 16:53 par Jc.forton (discussion | contributions) (→‎Création des fonctions base de données)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Installation

Les paquetages

Pour développer en PHP et utiliser MySQL, il ne faut pas oublier d'installer les paquetages suivants :

# yum -y install php php-mysql mysql mysql-server httpd

Paramétrez votre base MySQL ainsi que votre serveur HTTPD.

Base de données exemple

Nous allons utiliser la base de données suivante:

--
-- Base de données: `exemple`
--
CREATE DATABASE IF NOT EXISTS `exemple` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `exemple`;
-- --------------------------------------------------------
--
-- Structure de la table `personnes`
--
CREATE TABLE IF NOT EXISTS `personnes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(100) NOT NULL,
  `prenom` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Développement

Structure du site

Nous allons créer un site web qui va utiliser notre base de données. Pour faire les chose bien, il faut respecter une certaine structure à l'intérieur de /var/www/html:

  • php (dossier qui contient les fichiers php)
  • img (dossier qui contient les images)
  • index.php

Un peu de SQL

Pour chercher des données nous allons avoir besoin des requêtes suivantes:

  • SELECT : select * from personnes
  • INSERT : INSERT INTO personnes (id, nom, prenom, email) VALUES (NULL, :nom, :prenom, :email)
  • UPDATE : UPDATE personnes SET nom=:nom, prenom=:prenom, email=:email WHERE id=:id
  • DELETE : DELETE FROM personnes WHERE id=:id

Nous remplacerons les variables :id, :nom, :prenom et :email par les valeurs voulues plus tard.

Accès base avec PDO

Pour accéder à une base de données MySQL, on peut soit utiliser MySQLi soit utiliser PDO. Préférez PDO qui permet plus de souplesse. Voici le code qui permet de se connecter à une base MySQL:

<?php
try{
   $db = new PDO('mysql:host=localhost;dbname=exemple', 'root', 'password');
}catch(Exception $e){
   echo "Échec : " . $e->getMessage();
}
?>

La variable $db contient la connexion base de données et si l'instanciation réussie, vous êtes connecté !

Nous allons centraliser tout ce qui est en relation avec la base de données dans le fichier php/db.php. Copiez les lignes précédentes dans ce fichier et faite une inclusion dans le fichier index.php:

<html>
   <head>
      <title>Exemple d'utilisation de PDO</title>
   </head>
   <body>
      <?php
          include("php/db.php");
      ?>
   </body>
</html>

Si vous ne voyez pas de message d'erreur, la connexion s'est correctement effectuée !

Création des fonctions base de données

Pour s’affranchir du CRUD nous allons agrémenter le fichier db.php des fonction suivantes:

function getUsers(){
   global $db;
   $select = $db->prepare('SELECT id, nom, prenom, email FROM personnes');
   $select->execute();
   return $select->fetchAll();
}
function getUserById($id){
   global $db;
   $select = $db->prepare('SELECT id, nom, prenom, email FROM personnes WHERE id=:id');
   $select->execute(array('id' => $id));
   $result = $select->fetchAll();
   return $result[0];
}
function addUser($nom, $prenom, $email){
   global $db;
   try{
      $insert=$db->prepare('INSERT INTO personnes (nom, prenom, email) VALUES(:nom, :prenom, :email)');
      $insert->execute(array('nom' => $nom,'prenom' => $prenom,'email' => $email));
      return true;
   }catch(Exception $e){
      echo $sql . "</br>" . $e->getMessage();
   }
   return false;
}
function modifyUserById($nom, $prenom, $email, $id){
   global $db;
   try{
      $update=$db->prepare('UPDATE personnes SET nom=:nom, prenom=:prenom, email=:email WHERE id=:id');
      $update->execute(array('nom' => $nom,'prenom' => $prenom,'email' => $email, 'id'=>$id));
      return true;
   }catch(Exception $e){
      echo $sql . "</br>" . $e->getMessage();
   }
   return false;
}
function delUserById($id){
   global $db;
   try{
      $sql = 'DELETE FROM personnes WHERE id='.$id.'';
      $db->exec($sql);
      return true;
   }catch(Exception $e){
      echo $sql . "</br>" . $e->getMessage();
   }
   return false;
}

On peut remarquer que les fonctions de modifications UPDATE et INSERT nécessite une préparation ($db->prepare()) alors que DELETE et SELECT peuvent êtres exécutées directement ($db->exec()).

Création d'un formulaire

Pour créer des personnes nous allons utiliser un formulaire de création. Nous allons le mettre dans le fichier php/form.php:

<?php
   $id=""; $nom=""; $prenom=""; $email="";
   if(isset($_POST) && !empty($_POST)){
      $id=$_POST['id'];
      $nom=$_POST['nom'];
      $prenom=$_POST['prenom'];
      $email=$_POST['email'];
   }
?>
<form method="post" <?php if(!empty($id)){echo "action=modify.php";}else{echo "action=php/create.php";} ?> >
   <table>
      <tr>
         <td align="right">
            Nom : 
         </td>
         <td>
            <input type="text" name="nom" <?php if(!empty($nom)){echo "value=".$nom;} ?> /> 
         </td>
      </tr>
      <tr>
         <td align="right">
            Prénom : 
         </td>
         <td>
            <input type="text" name="prenom" <?php if(!empty($prenom)){echo "value=".$prenom;} ?> />
         </td>
      </tr>
      <tr>
         <td align="right">
            Email : 
         </td>
         <td>
            <input type="text" name="email" <?php if(!empty($email)){echo "value=".$email;} ?> />
         </td>
      </tr>
      <tr>
         <td colspan="2" align="center">
	    <?php if(!empty($id)){echo "<input type=hidden name=id value=".$id." />";} ?>
            <input type="submit" />
         </td>
      </tr>
   </table>
</form>

Vous l'aurez remarqué, ce formulaire est intelligent dans le sens ou il détecte la présence d'informations envoyées par un formulaire POST. Cela permet de réutiliser le même formulaire pour la saisie et la modification de données.

Ajout d'un utilisateur

Ajoutez la ligne suivante dans index.php pour faire apparaître le formulaire:

<?php 
   include("php/form.php"); 
?>

Vous devriez avoir le résultat suivant:

Form sql empty.png

Nous allons maintenant, créer le fichier php/create.php qui va contenir le code relatif à l'ajout d'un utilisateur:

<?php
include_once("db.php");
$nom=""; $prenom=""; $email="";
if(isset($_POST) && !empty($_POST)){
   $nom=$_POST['nom'];
   $prenom=$_POST['prenom'];
   $email=$_POST['email'];
   addUser($nom, $prenom, $email);
}
echo '<meta http-equiv="refresh" content="0;URL=../index.php" />';
?>

Une fois le formulaire rempli et validé, vous devriez voir celui-ci se vider, signe que le passage par create.php et le retour sur index.php s'est effectué !

Pour info, le retour sur index.php se fait grâce à la ligne <meta http-equiv="refresh" content="0;URL=../index.php" />;

Récupération des utilisateurs

Nous allons maintenant afficher les utilisateurs présents en base de données.

Pour cela nous allons créer un fichier php/affiche.php qui va afficher nos utilisateurs sous forme de tableau avec des icônes pour les modifier et les supprimer:

<?php
function afficheUser($users){
   $tab = "<table border=1><tr><th>Nom</th><th>Prénom</th><th>Email</th><th>Actions</th></tr>";
   foreach($users as $user){
      $tab .= "<tr><td>".$user['nom']."</td><td>".$user['prenom']."</td><td>".$user['email']."</td>";
      $tab .= "<td><form method='POST' action='php/delete.php'>";
      $tab .= "<input type='image' src='img/delete_user.png' width='25'>";
      $tab .= "<input type=hidden name='id' value='".$user['id']."'>";
      $tab .= "</form>";
      $tab .= "<form method='POST' action='php/form.php'>";
      $tab .= "<input type='image' src='img/modify_user.png' width='25'>";
      $tab .= "<input type=hidden name='id' value='".$user['id']."'>";
      $tab .= "<input type=hidden name='nom' value='".$user['nom']."'>";
      $tab .= "<input type=hidden name='prenom' value='".$user['prenom']."'>";
      $tab .= "<input type=hidden name='email' value='".$user['email']."'>";
      $tab .= "</form>";
      $tab .= "</td>";
   }
   $tab .= "</tr></table>";
   return $tab;
}

function main(){
   include_once("db.php");
   $users = getUsers();
   echo afficheUser($users);
}

main();
?>

Placez les icônes suivantes dans le répertoire img:

Delete user.png
Modify user.png

Nous allons maintenant appeler notre fichier dans index.php pour voir s'afficher les utilisateurs en ajoutant la ligne suivante:

include("php/affiche.php");

Vous devriez voir le tableau suivant:

User tab pdo.png

Modification des utilisateurs

Lorsque vous cliquez sur le bouton Modify user.png vous êtes redirigé vers la page form.php qui détecte les variables présentes dans le tableau $_POST et remplie les champs de la manière suivante:

Form sql full.png

Il ne nous reste plus qu'à créer la page php/modify.php pour que la validation du formulaire soit prise en compte en base:

<?php
include_once("db.php");
$id=""; $nom=""; $prenom=""; $email="";
if(isset($_POST) && !empty($_POST)){
   $id=$_POST['id'];
   $nom=$_POST['nom'];
   $prenom=$_POST['prenom'];
   $email=$_POST['email'];
   modifyUserById($nom, $prenom, $email, $id);
}
echo '<meta http-equiv="refresh" content="0;URL=../index.php" />';
?>

Suppression des utilisateurs

Pour pouvoir supprimer des utilisateurs, il faut créer la page php/delete.php qui récupère l'identifiant de l'utilisateur à supprimer:

<?php
include_once("db.php");
$id="";
if(isset($_POST) && !empty($_POST)){
   $id=$_POST['id'];
   delUserById($id);
}
echo '<meta http-equiv="refresh" content="0;URL=../index.php" />';
?>