PHP - Ajout d'une variable dans une requête SQL

mariloute

mariloute Le 11 novembre 2020 à 23:15 (Édité le 11 novembre 2020 à 23:16)

Bonjour,

Je me permet de poster ici afin d'avoir un peu d'aide car je débute en PHP. Sur une page PHP, j'essai d'intégrer une variable dans une requête SQL mais après de longues heures (plutôt en jours) cela n'aboutit jamais.

Le but est de récupérer tout les numéros de tickets attribué à une personne (refclient). Quand je renseigne directement le numéro de "refclient" dans la requête SQL, le résultat s'affiche bien et liste tout les numéros de tickets! 😃

<?php
session_start(); 
$bdd = new PDO('mysql:host=127.0.0.1;dbname=utilisateur;charset=utf8', 'root', '');
$numticket = $bdd->query('SELECT * FROM tickets WHERE refclient="201110171518BRDE"');
?>

<?php while($m = $numticket->fetch()) { ?>
      <li><?= $m['numeroticket'] ?><br/>
<?php } ?>

Par contre cela ne fonctionne pas dès que je veux intégrer une variable. Si dessous quand je veux mettre la variable "$reqrefclient", la page est toute blanche.

<?php
session_start(); 
$bdd = new PDO('mysql:host=127.0.0.1;dbname=utilisateur;charset=utf8', 'root', '');
$reqrefclient = "201110171518BRDE";
$numticket = $bdd->query('SELECT * FROM tickets WHERE refclient="$reqrefclient"');
?>

<?php while($m = $numticket->fetch()) { ?>
      <li><?= $m['numeroticket'] ?><br/>
<?php } ?>

Si dessous quand je veux mettre la variable '$reqrefclient', je rencontre le message d'erreur: Parse error: syntax error, unexpected '$reqrefclient' (T_VARIABLE), expecting ')' in C:\wamp64\www\test\ticket.php on line 5

<?php
session_start(); 
$bdd = new PDO('mysql:host=127.0.0.1;dbname=utilisateur;charset=utf8', 'root', '');
$reqrefclient = "201110171518BRDE";
$numticket = $bdd->query('SELECT * FROM tickets WHERE refclient='$reqrefclient'');
?>

<?php while($m = $numticket->fetch()) { ?>
      <li><?= $m['numeroticket'] ?><br/>
<?php } ?>

Si dessous quand je veux mettre la variable '".$reqrefclient."' , je rencontre le message d'erreur: Parse error: syntax error, unexpected '"', expecting ')' in C:\wamp64\www\test\ticket.php on line 5

<?php
session_start(); 
$bdd = new PDO('mysql:host=127.0.0.1;dbname=utilisateur;charset=utf8', 'root', '');
$reqrefclient = "201110171518BRDE";
$numticket = $bdd->query('SELECT * FROM tickets WHERE refclient='".$reqrefclient."'');
?>

<?php while($m = $numticket->fetch()) { ?>
      <li><?= $m['numeroticket'] ?><br/>
<?php } ?>

Après avoir longuement cherché, je vois pas comment faire pour intégrer une variable dans la requête SQL.

Je vous remercie par avance de votre aide. 😃

Mariloute.

PrimFX

PrimFX Le 21 novembre 2020 à 21:41

Bonjour @mariloute,

L'idée derrière ta requête pour l'intégration de la variable est bonne; il ne manque pas grand chose pour que ça fonctionne 😉

Lorsque tu veux insérer une variable dans une chaîne de caractères, il faut faire de la concaténation. Ici, il faudrait donc écrire ta requête de la façon suivante :

$numticket = $bdd->query('SELECT * FROM tickets WHERE refclient="' . $reqrefclient . '"');

Tu remarqueras que j'ajoute des guillemets doubles " pour la requête SQL (puisqu'en SQL, une chaîne de caractères doit être entre guillemets), ainsi que des guillemets simples ' pour délimiter les chaînes de caractère PHP qui constituent la requête SQL.

Cela dit, cette façon de faire fonctionne mais est loin d'être recommandée pour des raisons de sécurité (pour éviter, entre autre, des injections SQL). Il est préférable d'utiliser des requêtes préparées. L'idée est d'utilier des "variables SQL" dans ta requête puis d'indiquer un peu plus loin par quelles valeurs (i.e. variables PHP) devront être remplacées ces variables SQL. Il existe plusieurs façons de faire cela, en voici une :

<?php
session_start(); 
$bdd = new PDO('mysql:host=127.0.0.1;dbname=utilisateur;charset=utf8', 'root', '');
$reqrefclient = "201110171518BRDE";
$numticket = $bdd->prepare('SELECT * FROM tickets WHERE refclient = :ref');
$numticket->bindValue('ref', $reqrefclient);
$numticket->execute();
?>

<?php while($m = $numticket->fetch()) { ?>
      <li><?= $m['numeroticket'] ?><br/>
<?php } ?>

On décompose donc ici cette requête en 3 étapes :

  1. On indique que l'on prépare une requête SQL avec $bdd->prepare et on indique une variable SQL nommée ref avec la notation :ref dans la valeur de refclient
  2. On indique ensuite que l'on lie la valeur de notre variable PHP $reqrefclient à la variable SQL :ref avec la fonction `bindValue``
  3. Finalement, on indique à MySQL que l'on a fini de préparer notre requête et qu'elle peut être exécutée avec execute

Je te laisse également un lien vers la documentation de PHP sur les requêtes préparées qui propose davantage d'exemples et explications sur le sujet ! Note : bindParam est utilisé dans les exemples au lieu de bindValue, mais le comportement est grosso modo similaire (pour ne pas rentrer plus dans les détails).

En espérant avoir pu t'aider !

A bientôt,

Boris ('PrimFX')

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte