Requêtes préparées en PHP

Recherche simple en PHP avec PDO

<!doctype html>
<html>
<head>
<title>
Recherche d'une personne par ID
</title>
<meta charset="utf-8">
</head>
<body>
<?php $wanted=$_GET['ID']; 
if (!empty($wanted)){
	echo "<h1>Recherche de  $wanted </h1>";
	require_once('connexion.php');
	$connexion=connect_bd();
	$sql="SELECT * from CARNET where ID='".$wanted."'";
	if(!$connexion->query($sql))
		echo "Pb de requete";
	else{
	foreach ($connexion->query($sql) as $row)
		echo $row['NOM']." ".$row['PRENOM']."</br>\n";
  }
}
  ?>
</body>
</html>

Appel avec le paramètre ID passé sur l’URL: php exemples/pdo/recherche.php?ID=3

Execution

recherche php

Mais lorsqu’il y a de nombreux paramètres, on se retrouve avec de nombreuses concaténations de chaines entourées de “cotes” ce qui est une grande source d’erreurs et de lenteurs d’écriture. Pour remédier à cela, on peut utiliser des requêtes préparées qui permettent de bien dissocier la requête des paramètres qui vont lui être fournis avant son exécution. Ces PreparedStatement seront également bien préférables en termes de sécurité et à utiliser systématiquement.

Recherche avec PreparedStatement

<!doctype html>
<html>
<head>
<title>
Recherche d'une personne par ID
</title>
<meta charset="utf-8">
</head>
<body>
<?php $wanted=$_GET['ID']; 
if (!empty($wanted)){
  echo "<h1>Recherche de  $wanted </h1>";
  require_once('connexion.php');
  $connexion=connect_bd();
$sql="SELECT * from CARNET where ID=:id";
$stmt=$connexion->prepare($sql);
$stmt->bindParam(':id', $_GET['ID'],PDO_PARAM_INT);
$stmt->execute();
if (!$stmt) echo "Pb d'accès au CARNET";
else{
    if ($stmt->rowCount()==0) echo "Inconnu !<br/>";
    else
     foreach ($stmt as $row)
     echo $row['PRENOM']." ".$row['NOM'].
          "né(e) le ".$row['NAISSANCE']."<br/>";
}
}
?>
</body>
</html>

Les requêtes préparées limitent fortement la possibilité d”injections SQL comme nous le verront plus tard.