Page 1 sur 1

Erreur sur une requête.

Posté : 23 nov. 2023, 13:11
par Sq78
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

Re: Erreur sur une requête.

Posté : 23 nov. 2023, 13:35
par ynx
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();

Re: Erreur sur une requête.

Posté : 23 nov. 2023, 14:19
par Sq78
Ca fonctionne, je te remercie. Mais pourquoi cette requête fonctionnait en PHP 7.4 ? Ou se trouve l'incompatibilité avec PHP 8.0 ?

Re: Erreur sur une requête.

Posté : 23 nov. 2023, 14:38
par ynx
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