Erreur sur une requête.

Petit nouveau ! | 2 Messages

23 nov. 2023, 13:11

Bonjour,

J'ai la requête suivante qui fonctionne parfaitement en PHP 7.4 mais me fait une erreur en PHP 8.0
Qui peut me dire où se trouve mon erreur svp ?

Code : Tout sélectionner

$sql = $link->prepare("SELECT groupe, annee_article, libelle, en_ligne FROM bulletins_officiels WHERE groupe='".$_GET['groupe']."' AND en_ligne='1'"); $sql->bindParam(':groupe', $_GET['groupe'], PDO::PARAM_STR); $sql->execute(); while ($data=$sql->fetch()){ echo "<div class='menu-bo'><a href='bulletin-municipal.php?annee=".$data['annee_article']."&libelle=".$data['libelle']."' target='_self'>".$data['annee_article']."</a></div>"; }
Et voici l'erreur sous PHP 8.0

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\la-machine\mairie\lirebm.php on line 9

La ligne 9 est : $sql->execute();

PS : $_GET['groupe'] vient de la page précédente et est bien renseigné.

Merci par avance pour votre aide

ynx
Mammouth du PHP | 586 Messages

23 nov. 2023, 13:35

Bonjour,

Le message indique que le nombre de paramètre bindé à la requête ne correspond pas au nombre de marqueurs dans la requête : en effet, tu bind un marqueur ":groupe" qui n'existe pas dans ta requête sql.

Il ne faut surtout pas injecter une variable PHP dans une requête au risque d'avoir des injections sql.
Il faut utiliser correctement les marqueurs dans la requête :
$sql = $link->prepare("SELECT groupe, annee_article, libelle, en_ligne FROM bulletins_officiels WHERE groupe=:groupe AND en_ligne='1'");
$sql->bindParam(':groupe', $_GET['groupe'], PDO::PARAM_STR);
$sql->execute();

Petit nouveau ! | 2 Messages

23 nov. 2023, 14:19

Ca fonctionne, je te remercie. Mais pourquoi cette requête fonctionnait en PHP 7.4 ? Ou se trouve l'incompatibilité avec PHP 8.0 ?

ynx
Mammouth du PHP | 586 Messages

23 nov. 2023, 14:38

Tu devais déjà avoir l'erreur avec ce code en PHP 7 mais cette erreur était surement masquée (rapport d'erreur de PDO et/ou configuration de error_reporting).

Avant PHP 8, le rapport d'erreur par défaut de PDO était défini sur PDO::ERRMODE_SILENT qui n'arrête pas l'exécution du script.
Depuis PHP 8, le rapport d'erreur par défaut de PDO est PDO::ERRMODE_EXCEPTION qui déclenche une exception/erreur fatale.
https://www.php.net/manual/fr/pdo.error-handling.php