PDO 错误:布尔和整数类型的输入语法无效 - 如果输入为空

Posted

技术标签:

【中文标题】PDO 错误:布尔和整数类型的输入语法无效 - 如果输入为空【英文标题】:PDO ERROR: invalid input syntax for type boolean and integer - if empty input 【发布时间】:2021-10-08 14:16:32 【问题描述】:

我正在使用 PDO 对 PostgreSQL 进行动态更新查询。问题是,所有值都作为字符串传输到数据库,这会为假定的布尔值(edit: 和整数)值引发错误:

php 致命错误:未捕获的 PDOException:SQLSTATE[22P02]:无效文本表示:7 错误:布尔类型的无效输入语法:»«

编辑:每当布尔或整数字段获得空输入时,就会出现问题。我该怎么做才能使 PDO 将输入作为“null”传输到数据库,而不是抛出数据类型错误的空字符串?

以下是我的更新方法,我尝试在循环内进行绑定,并为两个假定的布尔值添加显式类型转换:

public function updateMod($array)

    $keys = array_keys($array);
    $vals = array_values($array);

    $setStr = "";
    foreach ($keys as $key) 
        $setStr .= "$key = :$key, ";
    
    $setStr = rtrim($setStr, ", ");

    $pdoConn = DbConnection::openConnection();
    $stmt = $pdoConn->prepare("UPDATE mods SET $setStr WHERE id = :id;");

    $i = 0;
    foreach ($keys as $key) 
        // type casting the two supposed booleans:
        if($key === 'g_exists' || $key === 'w_exists') 
            $stmt->bindValue($key, $vals[$i], PDO::PARAM_BOOL);
         else 
            $stmt->bindValue($key, $vals[$i]);
        
        $i++;
    

    $stmt->bindValue('id', $this->Id());

    if ($stmt->execute()) 
        return true;
     else 
        return false;
    

但我不断收到同样的错误。 有谁知道如何解决这个问题?

【问题讨论】:

【参考方案1】:

无论是否有任何值要写入,您都在循环中创建查询的“设置部分”。

所以解决方案是检查给定键是否有值。

一个简单的解决方案可能是我在包含数据的数组上调用 array_filter - 这样empty 值及其键在处理之前被删除

尝试像这样启动方法:

public function updateMod($array)

    $array = array_filter($array); # This line is important
    $keys = array_keys($array);
    $vals = array_values($array);

    ...

array_filter 文档说:

如果没有提供回调,数组的所有空条目都将被删除

【讨论】:

感谢您的回答!但我不想从数组中删除这些字段,我确实希望对它们进行处理。应用程序的用户应该能够删除字段的最后一个输入条目,然后将该字段留空。因此,我需要更新方法才能将空条目输入数据库。但是之前过滤数组并将空输入更改为“null”也无济于事,因为(我想)通过 pdo 绑定这些 null 再次转换为“null”字符串,然后 Postgres 无法正确识别。跨度> 在撰写该评论时,答案对我来说很清楚:我应该尝试将类型强制转换为 null,但不是在绑定过程之前,而是在过程中。它奏效了! (请参阅我的回答) @Nana 很高兴听到这个消息【参考方案2】:

好的,我刚刚找到了答案:

我的错误是我试图将类型转换为对空字符串不起作用的布尔值/整数。所以我必须自己过滤空字符串并将它们直接转换为空值。因此,上面的绑定 foreach 循环应该如下所示:

foreach ($keys as $key) 
        if($key === 'g_exists' && $vals[$i] === '')  // filter key AND empty value
            $stmt->bindValue($key, $vals[$i], PDO::PARAM_NULL); // cast to null
         else 
            $stmt->bindValue($key, $vals[$i]);
        
        $i++;
    

【讨论】:

以上是关于PDO 错误:布尔和整数类型的输入语法无效 - 如果输入为空的主要内容,如果未能解决你的问题,请参考以下文章

整数类型的输入语法无效:执行函数时具有复合数据类型的“(2,2)”

PG::InvalidTextRepresentation:错误:整数的无效输入语法:“M”

“错误:整数的输入语法无效:”在 Redshift 表中为 SMALLINT 列插入 NULL 值时?

错误:数字类型 (SQL) 的输入语法无效

*跟进** 我正在尝试使用 Selenium 在网站框中输入一个整数,但我在 send_keys 上遇到了无效的语法错误

PHP / PDO动态绑定值(无效的参数计数错误)