PHP pdo bindParam 类型管理

PHP pdo bindParam type management

提问人:user3286490 提问时间:1/10/2016 最后编辑:user3286490 更新时间:1/10/2016 访问量:173

问:

这是帖子表格:

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

这将是 funcname 类上的函数插入,它将数据插入到名为 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::P ARAM_INT,它不应该允许字符,而只允许整数,为什么我能够将文本发布到数据库(表)?

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

提前致谢。

php mysql pdo

评论


答:

1赞 N.B. 1/10/2016 #1

你的代码中有几个错误。

但是,让我们回顾一下 类型 ,并告诉MySQL要做什么。PDO::PARAM_INTPDO::PARAM_STRPDO::PARAM_NULL

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

现在谈谈其他问题:

  • 不要使用 . 通过引用接受该值。这适用于调用存储过程时,并且应该根据过程的输出修改变量。用。如果您尝试使用 ,它将不起作用,并且您会收到错误:bindParambindParambindValuebindParam

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

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

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

评论

0赞 user3286490 1/10/2016
亲爱的,但是使用 bindParam 我没有收到任何错误,只是文本值进入数据库,即使 MySQL 列上的类型是文本,它也不应该执行该语句,因为,我已将 PDO 类型设置为 int。 所以你的意思是我应该使用 bindValue,哪一个更好、更安全,还是两者都相同?
0赞 N.B. 1/10/2016
bindValue并且不一样。两者都同样“安全”,并且都将清理输入以插入到查询中。两者都具有相似的功能签名。在您的情况下,您可以简单地切换 .这两个函数以不同的方式处理第二个参数。如果只执行琐碎的查询(如果从不调用存储过程),则使用 .如果列是文本类型,请不要使用 。这不是它的工作方式,也不是为了这个目的。如果想要一个整数,请在 php 中执行强制(使用 )。bindParambindParambindValuebindValuePDO::PARAM_INT(int)$variable
0赞 user3286490 1/11/2016
使用 $stmt->bindValue(':name',$this->name,, PDO::P ARAM_INT);,,,当我插入文本时,它会插入 (0) 而不是..?可以吗?
0赞 user3286490 1/11/2016
--用于表锁定和事务,仅使用 $this->conn->beginTransaction();交易是可以的,因为她有超过 1000 个用户在数据库的一个表上有事务,它会防止重复或错误,而如果重复
0赞 N.B. 1/12/2016
为防止重复,请使用密钥。锁定表不会防止重复。UNIQUE