【发布时间】:2018-05-29 19:14:26
【问题描述】:
据我了解,在显式声明数据类型时使用 PDO::bindParam / bindValue 时,如果数据类型与提供的值不同,则会引发异常。
摘自用于连接 mysql 数据库的 db 类
public function insert($sql, $values){
$stmt = $this->connect()->prepare($sql);
foreach($values as $value){
$stmt->bindValue($value[1], $value[2], $value[3]);
}
$stmt->execute();
}
$array = array(
0 => array(
1 => ':jotName',
2 => 'some jot string',
3 => PDO::PARAM_STR
)
);
$iSql = "INSERT INTO `jots`(`jotContext`) VALUES (:jotName)";
$con = new sql();
try{
$con->insert($iSql,$array);
} catch(PDOException $exception) {
echo $exception->getMessage();
}
即如果 $array[0][3] 中的 PDO::PARAM_STR 更改为 PDO::PARAM_INT,mysql 事务将失败,因为 $array[0][2] 是字符串而不是 int。
我已经使用 PDO::PARAM_STR、PDO::PARAM_INT 和 PDO::PARAM_BOOL 测试了这个代码块。虽然我希望 _STR 能够正常工作并将新记录插入数据库。我没想到 _BOOL & _INT 在调用 insert 方法时不会抛出异常。
【问题讨论】:
-
如果您使用
PDO::ATTR_EMULATE_PREPARES,这可能会改变,但如果可以,mysql 或 php 通常会转换参数。我猜这就是正在发生的事情。 php.net/manual/en/pdo.setattribute.php -
它可能是类型转换而不是验证。您是否检查了 sql 以查看这些值是否实际上......正确?就像一些小字符串变成零一样。
-
@bassxzero -
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)是唯一的属性集。 -
@IncredibleHat - 无论指定什么数据类型,
some jot string都会添加到数据库中。 -
@Jaxchief 没关系。我的意思是,如果你设置
PDO::ATTR_EMULATE_PREPARES。然后 PHP 将进行强制转换。如果你不这样做,那么 MySQL 将进行强制转换。不管怎样,我相信这是一个选角问题。