PHP pdo-bindParam类型管理


PHP pdo bindParam type management

这是张贴形式:

 $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::PARAM_INT,它不应该允许字符,而应该只允许整数。为什么我能够将文本发布到数据库(表)?

我有没有办法在这里高度限制bindParam上的数据类型。

提前谢谢。

您的代码中有几个错误。

但是,让我们来看看类型PDO::PARAM_INTPDO::PARAM_STRPDO::PARAM_NULL告诉MySQL要做什么

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

现在讨论其他问题:

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

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

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

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