3 votes

Comment vérifier en PHP si le nombre de paramètres PDO fournis est supérieur au nombre nécessaire ?

J'ai le code suivant (PHP 7.3.16) qui récupère des données dans une base de données (MySQL) :

// db credentials
$dbhost = "localhost";
$dbuser = "user";
$dbpass = "password";
$dbname = "database";

// pdo
$dsn = "mysql:host=".$dbhost.";dbname=".$dbname.";charset=utf8";
$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES => false
];
$pdo = new PDO($dsn, $dbuser, $dbpass, $options);

// run sql query
$sql = "SELECT * FROM foo WHERE bar > ?";

$pdo_parameters = [ 1 ];
// this will produce no results without any error:
// $pdo_parameters = [ 1, 2, 3 ];

$stmt = $pdo->prepare($sql);
$stmt->execute( $pdo_parameters );

while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    var_dump($row);
}

Si le tableau $pdo_parameters ne contient qu'un seul élément, alors tout fonctionne comme prévu et je reçois un résultat. Cependant, lorsque $pdo_parameters contient plus d'un, je ne reçois aucun résultat sans aucun message d'exception. Les erreurs PHP sont actives, mais je ne vois aucun message d'erreur PDO. Pourquoi ?

Je voudrais lever une exception PHP s'il y a trop de paramètres. Est-ce possible ?

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in /tmp/test:42 Stack trace: #0 /tmp/test.php(42): PDOStatement->execute(Array) #1 {main} thrown in /tmp/test.php on line 42

J'ai une énorme base de code et j'ai besoin dans de tels cas d'un traitement approprié des exceptions. Cependant, je ne comprends pas pourquoi PHP ne lève pas d'exception dans ce cas. S'agit-il simplement d'un autre bug de PHP ou bien n'y a-t-il aucun moyen pour PHP (les internes de PHP C) de vérifier s'il y a trop de paramètres PDO ? Je sais comment vérifier cela par moi-même en PHP (cela peut être assez imprécis si nous avons des " ?" dans certaines chaînes de caractères), mais ce serait mieux si l'extension PHP PDO avait une fonction pour vérifier de tels cas.


EDIT : C'est un bogue connu de PHP : https://bugs.php.net/bug.php?id=77490 (premier rapport du 20 janvier 2019)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X