升级到PHP 8.1后的PDOException SQLSTATE[HY093]



今天我在从PHP 7.4升级到PHP 8.1后遇到了一个问题。我一直在使用这段代码来建立MySQL连接:

<?php
$kundencode=$_SESSION['kdnr'];
$i=0;
$q = $pdo->prepare("SELECT * FROM qi_rechnungen WHERE kdnr='$kundencode' ORDER BY rgnr DESC");
$q->execute([$_SESSION['id']]);
$res = $q->fetchAll();
foreach ($res as $row) {
$i++;
?>

这很好,但当使用PHP 8.1时,我的系统抛出:

致命错误:未捕获的PDOException:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与/home/clients de/public_html/rechnunge2.php:60堆栈跟踪:#0/home/customers de/public_html/rechNunge2.php(60(:PDOStatement->execute(Array(#1{main}抛出…

我看不出有什么错误!?PHP 7.4和8.1之间有什么区别?

谢谢你的帮助。。。

您遇到的变化是,在PHP8之前,PDO的错误模式默认设置为静默。如果它遇到任何错误,它就会忽略它们。现在已更改为异常模式;每次遇到错误时,都会引发异常。所以这个问题以前就存在,只是没有被报道。

关于实际问题:你应该认真阅读准备好的语句,它们会让你的代码更安全。您没有在查询中为准备好的变量提供任何占位符,但您在下面的行中传递了它们(这导致了异常(:

$q->execute([$_SESSION['id']]);

据我所见,会话ID对于您的查询来说是完全不必要的,但您可以将客户编号作为变量传递。以下应该可以解决您的问题:

$q = $pdo->prepare("SELECT * FROM qi_rechnungen WHERE kdnr=? ORDER BY rgnr DESC");
$q->execute([$kundencode]);

首先,您不应该在查询中内联原始变量,使用param绑定。

无效参数编号:绑定变量的数量与令牌的数量不匹配

这意味着传递到PDO::execute()方法的数组的计数与查询中的params的计数不同。

对于您的情况,也许这个解决方案可以帮助您:

// let's assume there is '5'
$kundencode=$_SESSION['kdnr'];
$q = $pdo->prepare("SELECT * FROM qi_rechnungen WHERE kdnr=:kundencode ORDER BY rgnr DESC");
// pass $kundencode into query
$q->bindValue('kundencode', $kundencode); 
// SELECT * FROM qi_rechnungen WHERE kdnr='5' ORDER BY rgnr DESC
$q->execute();

若要将$_SESSION['id']传递到查询中,必须在查询模板显式中指定它

@vixducis:这正是我昨天终于做的——并使其按预期工作:

$q = $pdo->prepare("SELECT * FROM qi_domains WHERE kdnr = ? AND aktiv = ? ORDER BY id DESC");
$q->execute([$_SESSION['kdnr'], 0]);

所以,让我感谢大家的支持!

最新更新