Différences entre versions de « Php pdo »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
 
(20 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
= Installation =
 
= Installation =
== Les librairies ==
+
== Les paquetages ==
Pour développer en PHP et utiliser ''MySQL'', il ne faut pas oublier d'installer les librairies suivantes :
+
Pour développer en PHP et utiliser ''MySQL'', il ne faut pas oublier d'installer les paquetages suivants :
  
<pre>
+
<source lang="bash" style="border:1px solid black;font-size:120%">
 
# yum -y install php php-mysql mysql mysql-server httpd
 
# yum -y install php php-mysql mysql mysql-server httpd
</pre>
+
</source>
  
 
Paramétrez votre base [[Sql_install | MySQL ]] ainsi que votre serveur [[HTTPD | HTTPD]].
 
Paramétrez votre base [[Sql_install | MySQL ]] ainsi que votre serveur [[HTTPD | HTTPD]].
Ligne 11 : Ligne 11 :
 
== Base de données exemple ==
 
== Base de données exemple ==
 
Nous allons utiliser la base de données suivante:
 
Nous allons utiliser la base de données suivante:
<pre>
+
<source lang="sql" style="border:1px solid black;font-size:120%">
 
--
 
--
 
-- Base de données: `exemple`
 
-- Base de données: `exemple`
Ligne 28 : Ligne 28 :
 
   PRIMARY KEY (`id`)
 
   PRIMARY KEY (`id`)
 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
</pre>
+
</source>
 +
 
 
= Développement =
 
= Développement =
 
== Structure du site ==
 
== Structure du site ==
Ligne 46 : Ligne 47 :
 
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.
 
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'':
 
Voici le code qui permet de se connecter à une base ''MySQL'':
<pre>
+
<source lang="php" style="border:1px solid black;font-size:120%">
 
<?php
 
<?php
 
try{
 
try{
Ligne 54 : Ligne 55 :
 
}
 
}
 
?>
 
?>
</pre>
+
</source>
 
La variable ''$db'' contient la connexion base de données et si l'instanciation réussie, vous êtes connecté !
 
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:
 
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:
<pre>
+
<source lang="html5" style="border:1px solid black;font-size:120%">
 
<html>
 
<html>
 
   <head>
 
   <head>
Ligne 67 : Ligne 68 :
 
           include("php/db.php");
 
           include("php/db.php");
 
       ?>
 
       ?>
   <body>
+
   </body>
<html>
+
</html>
</pre>
+
</source>
 
Si vous ne voyez pas de message d'erreur, la connexion s'est correctement effectuée !
 
Si vous ne voyez pas de message d'erreur, la connexion s'est correctement effectuée !
== Création des fonctions base ==
+
 
 +
== Création des fonctions base de données ==
 
Pour s’affranchir du ''CRUD'' nous allons agrémenter le fichier ''db.php'' des fonction suivantes:
 
Pour s’affranchir du ''CRUD'' nous allons agrémenter le fichier ''db.php'' des fonction suivantes:
 
<source lang="php" style="border:1px solid black;font-size:120%">
 
<source lang="php" style="border:1px solid black;font-size:120%">
Ligne 81 : Ligne 83 :
 
}
 
}
 
function getUserById($id){
 
function getUserById($id){
   $select = $db->prepare('SELECT id, nom, prenom, email FROM personnes WHERE id='.$id);
+
  global $db;
   $select->execute();
+
   $select = $db->prepare('SELECT id, nom, prenom, email FROM personnes WHERE id=:id');
   return $select->fetchAll()[0];
+
   $select->execute(array('id' => $id));
 +
   $result = $select->fetchAll();
 +
  return $result[0];
 
}
 
}
 
function addUser($nom, $prenom, $email){
 
function addUser($nom, $prenom, $email){
Ligne 120 : Ligne 124 :
 
</source>
 
</source>
 
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()'').
 
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==
 
==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'':
 
Pour créer des personnes nous allons utiliser un formulaire de création. Nous allons le mettre dans le fichier ''php/form.php'':
Ligne 132 : Ligne 137 :
 
   }
 
   }
 
?>
 
?>
<form method="post" <?php if(!empty($id)){echo "action=php/modifiy.php";}else{echo "action=php/create.php";} ?> >
+
<form method="post" <?php if(!empty($id)){echo "action=modify.php";}else{echo "action=php/create.php";} ?> >
 
   <table>
 
   <table>
 
       <tr>
 
       <tr>
Ligne 182 : Ligne 187 :
 
<source lang="php" style="border:1px solid black;font-size:120%">
 
<source lang="php" style="border:1px solid black;font-size:120%">
 
<?php
 
<?php
include("db.php");
+
include_once("db.php");
 
$nom=""; $prenom=""; $email="";
 
$nom=""; $prenom=""; $email="";
 
if(isset($_POST) && !empty($_POST)){
 
if(isset($_POST) && !empty($_POST)){
Ligne 189 : Ligne 194 :
 
   $email=$_POST['email'];
 
   $email=$_POST['email'];
 
   addUser($nom, $prenom, $email);
 
   addUser($nom, $prenom, $email);
 +
}
 +
echo '<meta http-equiv="refresh" content="0;URL=../index.php" />';
 +
?>
 +
</source>
 +
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:
 +
<source lang="php" style="border:1px solid black;font-size:120%">
 +
<?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();
 +
?>
 +
</source>
 +
Placez les icônes suivantes dans le répertoire ''img'':
 +
[[Fichier:delete_user.png|centré]][[Fichier:modify_user.png|centré]]
 +
 +
Nous allons maintenant appeler notre fichier dans ''index.php'' pour voir s'afficher les utilisateurs en ajoutant la ligne suivante:
 +
<source lang="php" style="border:1px solid black;font-size:120%">
 +
include("php/affiche.php");
 +
</source>
 +
Vous devriez voir le tableau suivant:
 +
[[Fichier:User tab pdo.png|centré]]
 +
 +
== Modification des utilisateurs ==
 +
Lorsque vous cliquez sur le bouton [[Fichier: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:
 +
[[Fichier:Form sql full.png|centré]]
 +
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:
 +
<source lang="php" style="border:1px solid black;font-size:120%">
 +
<?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" />';
 +
?>
 +
</source>
 +
 +
== 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:
 +
<source lang="php" style="border:1px solid black;font-size:120%">
 +
<?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" />';
 
echo '<meta http-equiv="refresh" content="0;URL=../index.php" />';
 
?>
 
?>
 
</source>
 
</source>

Version actuelle datée du 6 décembre 2018 à 15:53

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" />';
?>