【问题标题】:PHP pdo bindParam type managementPHP pdo bindParam 类型管理
【发布时间】:2016-04-14 16:03:35
【问题描述】:

这是发帖形式:

 $funcname->name= htmlentities($_POST['name']);
 $funcname->insert();

这将是类 funcname 上的函数 insert,它将数据插入到名为 name

的列中
$this->conn->beginTransaction();
$stmt = $this->conn->prepare("INSERT INTO nameTBL (name) values (:name)";
$stmt->bindParam(':name', $this->name, PDO::PARAM_INT);
if ($stmt->execute()) {
         $this->conn->commit(); //This will save your changes
         $this->conn->exec('UNLOCK TABLES ' . self::$table_name);
         header('Location: ../');
         exit();
} else {
         $this->conn->rollBack(); //This will undo your changes
         $this->conn->exec('UNLOCK TABLES ' . self::$table_name);
         header('Location: ../');
         exit();
}

现在的问题是我设置了 PDO::PARAM_INT,它不应该允许字符但只允许整数,为什么我能够将文本发布到数据库(表)?

我有什么方法可以在这里高度限制 bindParam 上的数据类型。

提前致谢。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您的代码中有几个错误。

    不过,让我们看看 PDO::PARAM_INTPDO::PARAM_STRPDO::PARAM_NULL 类型告诉 MySQL 做什么。

    这些值告诉 PDO 如何处理输入,而不是禁止输入。如果您发送文本,但列是 int,那么 MySQL 将尝试将数据强制转换为 int。它不会告诉您“您输入了 abcd 但预期值是整数”。在将数据传递给 PDO 之前,您必须自己进行此检查。

    现在讨论其他问题:

    • 不要使用bindParambindParam 接受 reference 的值。这适用于当您调用存储过程并且应该根据过程的输出修改变量时。使用bindValue。如果您尝试使用 bindParam 执行以下操作,它将不起作用并且您会收到错误消息:

      $stmt->bindParam(':my_column', 1, PDO::PARAM_INT); // It fails and yields an error

    • 不要锁定表。您已经在使用事务,无需锁定表,MySQL 为您处理并发和访问。

    底线 - 使用PDO 进行插入验证之前PDO 帮助您根据连接信息(除其他外)清理输入。它不会执行验证。

    【讨论】:

    • 亲爱的,但使用 bindParam 我没有收到任何错误,只是文本值进入数据库,即使 MySQL 列上的类型是文本,这里也不应该执行语句,因为我已将 PDO 类型设置为诠释。所以你的意思是我应该使用bindValue,哪个更好更安全,还是两者都一样?
    • bindValuebindParam 不一样。两者都同样“安全”,并且都将清理输入以插入查询。两者都具有相似的功能签名。在您的情况下,您可以简单地将bindParambindValue 切换。这两个函数对 2nd 参数的处理方式不同。如果您只做一些琐碎的查询(如果您从不调用存储过程),那么请使用bindValue。如果列是文本类型,不要使用PDO::PARAM_INT。这不是它的工作方式,也不是为了那个目的。如果你想要一个整数,请在 php 中执行强制转换(使用(int)$variable)。
    • with $stmt->bindValue(':name',$this->name,, PDO::PARAM_INT);,,,当我插入文本时,它将插入 (0) 代替.. ?好吗?
    • --表锁和事务,只有$this->conn->beginTransaction();可以进行交易,因为她有超过 1000 个用户在一个数据库表上进行交易,如果重复,它会防止重复或错误
    • 为防止重复,请使用UNIQUE 键。锁定表不会防止重复。
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 2015-03-14
    • 2014-08-11
    • 2012-05-03
    • 2011-01-11
    • 2013-02-15
    • 2014-08-20
    • 2021-02-13
    相关资源
    最近更新 更多