【问题标题】:Does PDO::bindParam / bindValue throw an exception if the data type is different from the supplied?如果数据类型与提供的不同,PDO::bindParam / bindValue 是否会引发异常?
【发布时间】: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 将进行强制转换。不管怎样,我相信这是一个选角问题。

标签: php mysql pdo


【解决方案1】:

至少对于 mysql - 不,它永远不会抛出错误。

此外,99.99% of time mysql is happy with PDO::PARAM_STR 适用于任何类型。因此,您可以大大简化您的插入函数,从 $values 数组中省略所有不必要的东西:

public function insert($sql, $values){
    return $this->connect()->prepare($sql)->execute($values);
}
$array = array('jotName' => 'some jot string');
$db->insert($sql, $array);

【讨论】:

  • 所以我的问题现在转向 PDO::PARAM_x 的意义何在。 IE。我的逻辑是,获取数据、验证/清理数据、绑定数据、执行。虽然我理解@bassxzero 所说的关于类型转换的内容。如何将字符串类型转换为 int。
  • 没有那么多意义,但有一些可能有用的边缘情况,INT for example
猜你喜欢
  • 2014-07-28
  • 2013-02-15
  • 2023-03-28
  • 2011-04-13
  • 2012-02-04
  • 1970-01-01
  • 2013-08-16
  • 2014-08-20
  • 1970-01-01
相关资源
最近更新 更多