PDO ERROR: invalid input syntax for type boolean and integer - if empty input
PDO ERROR: invalid input syntax for type boolean and integer - if empty input
我正在使用 PDO 进行 PostgreSQL 的动态更新查询。问题是,所有值都作为字符串传输到数据库,这会为假定的布尔值(edit: 和整数)值抛出错误:
PHP Fatal error: Uncaught PDOException: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type boolean: »«
编辑: 只要布尔值或整数字段输入为空,就会出现问题。我该怎么做才能使 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;
}
}
但我一直收到同样的错误。
有谁知道如何解决这个问题?
无论是否有任何值要写入,您都在循环中创建查询的“设置部分”。
所以解决方案是检查给定键是否有值。
一个简单的解决方案可能是在包含数据的数组上调用 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
文档说:
If no callback is supplied, all empty entries of array will be removed
好的,我刚找到答案:
我的错误是我试图将类型转换为 booleans/integers,这对空字符串不起作用。所以我也必须自己过滤空字符串并将它们直接转换为空值。因此,上面的绑定 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 进行 PostgreSQL 的动态更新查询。问题是,所有值都作为字符串传输到数据库,这会为假定的布尔值(edit: 和整数)值抛出错误:
PHP Fatal error: Uncaught PDOException: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type boolean: »«
编辑: 只要布尔值或整数字段输入为空,就会出现问题。我该怎么做才能使 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;
}
}
但我一直收到同样的错误。 有谁知道如何解决这个问题?
无论是否有任何值要写入,您都在循环中创建查询的“设置部分”。
所以解决方案是检查给定键是否有值。
一个简单的解决方案可能是在包含数据的数组上调用 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
文档说:
If no callback is supplied, all empty entries of array will be removed
好的,我刚找到答案:
我的错误是我试图将类型转换为 booleans/integers,这对空字符串不起作用。所以我也必须自己过滤空字符串并将它们直接转换为空值。因此,上面的绑定 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++;
}