Connexion aux bases de données depuis PHP avec PDO

Une table simple en SQL:

        CREATE TABLE `CARNET` (
          `ID` int(11) NOT NULL AUTO_INCREMENT,
          `NOM` varchar(30) DEFAULT NULL,
          `PRENOM` varchar(30) DEFAULT NULL,
          `NAISSANCE` date DEFAULT NULL,
          `VILLE` varchar(30) DEFAULT NULL,
          PRIMARY KEY (`ID`)
        ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

        INSERT INTO `CARNET` VALUES 
        (1,'SMITH','JOHN','1980-12-17','ORLEANS'),
        (2,'DURAND','JEAN','1983-01-13','ORLEANS'),
        (3,'GUDULE','JEANNE','1967-11-06','TOURS'),
        (4,'ZAPATA','EMILIO','1956-12-01','ORLEANS'),
        (5,'JOURDAIN','NICOLAS','2000-09-10','TOURS'),
        (6,'DUPUY','MARIE','1986-01-11','BLOIS'),
        (7,'ANDREAS','LOU','1861-02-12','ST Petersbourg'),
        (9,'Kafka','Franz','1883-07-03','Prague'),
        (11,'Dalton','Joe','2003-12-06','Dallas');

On insère cette table dans MySQL en ligne de commande ou à l’aide de PHPMyAdmin. Puis, pour consulter cette table depuis PHP, on utilise le connecteur PDO qui offre une interface de connexion utilisable pour tous les SGBD (Systemes de Gestion de Bases de Donnees) habituels comme MySQL, PostgreSQL, Oracle ou Microsoft SQL Server.

Connexion Simple en PHP avec PDO

<!doctype html>
<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
</head>
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>

<?php
require("connect.php");
// pour oracle: $dsn="oci:dbname=//serveur:1521/base
// pour sqlite: $dsn="sqlite:/tmp/base.sqlite"
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }
$sql="SELECT * from CARNET";
if(!$connexion->query($sql)) echo "Pb d'accès au CARNET";
else{
     foreach ($connexion->query($sql) as $row)
     echo $row['PRENOM']." ".
          $row['NOM']."né(e) le ".
          $row['NAISSANCE']."<br/>\n";
}
?>
</body>
</html>

Avec un fichier connect.php contenant les informations de connexion au serveur MySQL:

<?php
define('USER',"scott");
define('PASSWD',"tiger");
define('SERVER',"localhost");
define('BASE',"dbscott");
?>

Resultat brut html :

<!doctype html>
<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
</head>
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>


JOHN SMITHné(e) le 1980-12-17<br/>
JEAN DURANDné(e) le 1983-01-13<br/>
JEANNE GUDULEné(e) le 1967-11-06<br/>
EMILIO ZAPATAné(e) le 1956-12-01<br/>
NICOLAS JOURDAINné(e) le 2000-09-10<br/>
MARIE DUPUYné(e) le 1986-01-11<br/>
LOU ANDREAné(e) le 1900-01-01<br/>
Le Bon Kafkané(e) le 2003-12-06<br/>
Joe Daltonné(e) le 2003-12-06<br/>
Franz Kafkadné(e) le 1992-06-22<br/>
</body>
</html>

Execution

carnet php

Fabrication d’une table HTML avec les résultats :

<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>

<?php
require("connect.php");
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }
$sql="SELECT * from CARNET";
if(!$connexion->query($sql)) echo "Pb d'accès au CARNET";
else{
?>
<table>
<tr> <td> Nom </td> <td> Prénom </td></tr>
  <?php
  foreach ($connexion->query($sql) as $row)
echo "<tr><td>".$row['NOM']."</td><td>".
  $row['PRENOM']."</td></tr>\n";
  ?>
</table>
<?php } ?>
</body>
</html>

Résultats bruts:

<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>


<table>
<tr> <td> Nom </td> <td> Prénom </td></tr>
  <tr><td>SMITH</td><td>JOHN</td></tr>
<tr><td>DURAND</td><td>JEAN</td></tr>
<tr><td>GUDULE</td><td>JEANNE</td></tr>
<tr><td>ZAPATA</td><td>EMILIO</td></tr>
<tr><td>JOURDAIN</td><td>NICOLAS</td></tr>
<tr><td>DUPUY</td><td>MARIE</td></tr>
<tr><td>ANDREA</td><td>LOU</td></tr>
<tr><td>Kafka</td><td>Le Bon</td></tr>
<tr><td>Dalton</td><td>Joe</td></tr>
<tr><td>Kafkad</td><td>Franz</td></tr>
</table>
</body>
</html>

Execution

On peut faire un petit refactoring avec une fonction qui établit la connexion à la base:

<?php

require("connect.php");
function connect_bd(){
	$dsn="mysql:dbname=".BASE.";host=".SERVER;
		try{
		$connexion=new PDO($dsn,USER,PASSWD);
		}
		catch(PDOException $e){
		printf("Échec de la connexion : %s\n", $e->getMessage());
		exit();
		}
	return $connexion;
}

?>

et améliorer l’affichage des résultats :

<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
<link rel="stylesheet" href="tabstyle.css" />
</head>
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>

<?php
require_once('connexion.php');
$connexion=connect_bd();
$sql="SELECT * from CARNET";
if(!$connexion->query($sql)) echo "Pb d'accès au CARNET";
else{
?>
<table class="centre" id="jolie">
<tr> <td> ID </td> <td> Prénom </td> <td> Nom </td><td> Naissance </td> </tr>
  <?php
  foreach ($connexion->query($sql) as $row)
echo "<tr><td>".$row['ID']."</td>
          <td>".$row['PRENOM']."</td>
          <td>".$row['NOM']."</td>
          <td>".$row['NAISSANCE']."</td></tr><br/>\n";
  ?>
</table>
<?php } ?>
</body>
</html>

Avec le fichier CSS :

/* Bordure simple autour des tableaux */
table,th, td { border: 1px solid grey;}
table{border-collapse:collapse;}
/* Centrage tableau */
table.centre{ margin:auto;}
/* centrage du texte dans les cellules du tableau */
table.centre td{text-align:center;}

table#jolie tr:first-child{
	background:LightPink;
}
table#jolie tr:nth-child(2n){
	background:#EFD3C9;
}
table#jolie tr:nth-child(2n+3){
	background:#BCBCD0;
}
/* si un tableau a une seule ligne on l'affiche en rouge */
table tr:only-child{
	background:red;
}

Résultats bruts:

<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
<link rel="stylesheet" href="tabstyle.css" />
</head>
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>


<table class="centre" id="jolie">
<tr> <td> ID </td> <td> Prénom </td> <td> Nom </td><td> Naissance </td> </tr>
  <tr><td>1</td>
          <td>JOHN</td>
          <td>SMITH</td>
          <td>1980-12-17</td></tr><br/>
<tr><td>2</td>
          <td>JEAN</td>
          <td>DURAND</td>
          <td>1983-01-13</td></tr><br/>
<tr><td>3</td>
          <td>JEANNE</td>
          <td>GUDULE</td>
          <td>1967-11-06</td></tr><br/>
<tr><td>4</td>
          <td>EMILIO</td>
          <td>ZAPATA</td>
          <td>1956-12-01</td></tr><br/>
<tr><td>5</td>
          <td>NICOLAS</td>
          <td>JOURDAIN</td>
          <td>2000-09-10</td></tr><br/>
<tr><td>6</td>
          <td>MARIE</td>
          <td>DUPUY</td>
          <td>1986-01-11</td></tr><br/>
<tr><td>7</td>
          <td>LOU</td>
          <td>ANDREA</td>
          <td>1900-01-01</td></tr><br/>
<tr><td>9</td>
          <td>Le Bon</td>
          <td>Kafka</td>
          <td>2003-12-06</td></tr><br/>
<tr><td>11</td>
          <td>Joe</td>
          <td>Dalton</td>
          <td>2003-12-06</td></tr><br/>
<tr><td>12</td>
          <td>Franz</td>
          <td>Kafkad</td>
          <td>1992-06-22</td></tr><br/>
</table>
</body>
</html>

Execution

Carnet Table Version2

On peut générer des pages différentes avec des listes déroulantes ou des listes de liens, listes à puces etc.

Création d’une liste déroulante :

<!doctype html>
<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
</head>
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>
<?php
require_once('connexion.php');
$connexion=connect_bd();
$sql="SELECT * from CARNET";
if(!$connexion->query($sql)) echo "Pb d'accès au CARNET";
else {
     ?>
     <form action="recherche.php" method="GET">
    	<select name="ID">
      <?php
      foreach ($connexion->query($sql) as $row)
      if(!empty($row['NOM']))
    	echo "<option value='".$row['ID']."'>"
        .$row['PRENOM']." ".$row['NOM']."</option>\n";
      ?>
     </select>
     <input type="submit" value="Rechercher">
     </form>
     <?php 
      } 
     ?>
</body>
</html>

Remarquez l’usage de la clef primaire de la table comme value des options, ce qui assurent l’unicité des valeurs et évite toute amiguité.

Résultats bruts:

<!doctype html>
<html>
<head>
<title>
Connexion à MySQL avec PDO
</title>
<meta charset="utf-8">
</head>
<body>
<h1>
Interrogation de la table CARNET avec PDO
</h1>

     <form action="recherche.php" method="GET">
    	<select name="ID">
      <option value='1'>JOHN SMITH</option>
<option value='2'>JEAN DURAND</option>
<option value='3'>JEANNE GUDULE</option>
<option value='4'>EMILIO ZAPATA</option>
<option value='5'>NICOLAS JOURDAIN</option>
<option value='6'>MARIE DUPUY</option>
<option value='7'>LOU ANDREA</option>
<option value='9'>Le Bon Kafka</option>
<option value='11'>Joe Dalton</option>
<option value='12'>Franz Kafkad</option>
     </select>
     <input type="submit" value="Rechercher">
     </form>
     </body>
</html>

Execution

Carnet Select