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)