如何在PHP中检查是否提供了比需要的更多PDO参数?

问题描述 投票:0回答:1

我有以下一段代码(PHP 7.3.16)可以从数据库(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);
}

如果数组 $pdo_parameters 只包含1个元素,那么一切都按预期进行,我收到了一个结果。然而,当 $pdo_parameters 包含多个,我没有收到任何结果,也没有任何异常信息。PHP错误是活跃的,但我没有看到任何PDO错误信息。为什么?

如果参数太多,我想引发一个PHP异常。这可能吗?

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

我有一个庞大的代码库,在这种情况下需要一个适当的异常处理。但是我不明白为什么PHP在这种情况下不引发异常。这是PHP的另一个bug还是PHP(PHP C内部)没有办法检查PDO参数是否太多?我知道如何在普通的 PHP 中检查(如果我们在一些字符串中使用了"?",可能会很不准确),但如果 PHP PDO 扩展能有一个检查这种情况的函数会更好。


EDIT.这是个已知的PHP bug:如果我们的字符串中有"?",可能会很不准确,但如果PHP PDO扩展能有一个检查这种情况的功能会更好。 这是一个已知的PHP bug。https:/bugs.php.netbug.php?id=77490 (2019年1月20日的第一次报告)

php mysql exception pdo
1个回答
3
投票

你是对的,这种情况似乎不会抛出异常,也不会触发错误。PDOStatement::execute() 至少回报 false 这样你就可以自己卷了。

$dsn = "mysql:host=$dbhost;dbname=$dbname;charset=utf8mb4";
$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);

$sql = 'SELECT ? AS foo';
$stmt = $pdo->prepare($sql);

if (!$stmt->execute([1, 2])) {
    throw new InvalidArgumentException('Failed to execute statement');
}
while ($row = $stmt->fetch()) {
    var_dump($row);
}

不是很理想,但...


-1
投票

要检查所提供的param,请使用这个。https:/www.php.netmanualenpdostatement.debugdumpparams.php此外,还可以使用param绑定来绝对确保你绑定param的方式是正确的。https:/www.php.netmanualenpdostatement.bindparam.php

© www.soinside.com 2019 - 2024. All rights reserved.