我需要更新数据库,我使用PDO的execute()
方法,给它一个数组作为参数。
我的想法是,在尝试插入NULL
值时,它会给我一个错误...
以下是发送的查询/参数示例:
生成的查询:
UPDATE table SET name=?, id_extra1=?, id_extra2=? WHERE id_something=?
参数数组:
array (size=8)
'name' => string 'testing' (length=6)
'id_extra1' => string '2' (length=1)
'id_extra2' => null
'id_something' => string '1958' (length=4)
因此NULL
值适用于id_extra2
在id_extra2
的代码中我有这样的条件(我的想法是我有一个ID,0或者我必须用NULL
来更新DB值) :
if ($_POST['id_extra2']==0) {
$_POST['id_extra2'] = null;
}
我尝试将$_POST['id_extra2']
设置为''
和NULL
以及'null'
,但它仍无法正常工作......
任何想法都表示赞赏!谢谢!
答案 0 :(得分:4)
请考虑使用bindValue而不是传递数组来执行。正如它所说here:
所有值都被视为PDO :: PARAM_STR。
应该可以使其对应用程序的其余部分非常透明,因为您已经将要更新的值作为数组进行更新。尝试例如像这样的东西:
<?php
function executeWithDataTypes(PDOStatement $sth, array $values) {
$count = 1;
foreach($values as $value) {
$sth->bindValue($count, $values['value'], $values['type']);
$count++;
}
return $sth->execute();
}
$sth = $handle->prepare("UPDATE table SET name = ?, id_extra1 = ?, id_extra2 = ? WHERE id_something = ?");
$values = array();
$values[] = array('value' => 'testing', 'type' => PDO::PARAM_STR);
$values[] = array('value' => 2, 'type' => PDO::PARAM_INT);
$values[] = array('value' => null, 'type' => PDO::PARAM_NULL);
$values[] = array('value' => 1958, 'type' => PDO::PARAM_INT);
$result = executeWithDataTypes($sth, $values);
?>
正如您所指出的,使用bindParam过去令您头疼,请注意bindValue和bindParam之间的细微差别。就个人而言,我从不使用bindParam,因为副作用使得理解脚本变得更加困难,尽管有些情况下这些效果会派上用场。
编辑:您当然可以进一步简化功能,并且无需通过执行以下操作将类型指定为传递数组中的附加键:
$type = PDO::PARAM_STR;
switch(true) {
case is_null($value): $type = PDO::PARAM_NULL; break;
case is_numeric($value): $type = PDO::PARAM_INT; break;
// ...
default: break;
}
并根据数组中传递的值的类型确定类型;然而,这更容易出错,因为例如浮点数也是数字,这将导致上述switch语句中的错误决定,但我认为为了完整起见我会提到它。
答案 1 :(得分:-1)
没有这样的问题。
不需要特殊功能,也不需要复杂的过度设计的解决方案。
它只是有效。任何方法 - execute()
、bindValue()
或 bindParam()
- 使用您希望的任何一种方法。您只需要一个 null
值。然后在查询中使用它作为任何其他值。
$null = null;
$stmt = $pdo->prepare("INSERT INTO table (id) VALUES (?)");
$stmt->execute([$null]);
$stmt->bindParam(1, $null);
$stmt->execute();
$stmt->bindValue(1, $null);
$stmt->execute();