这是张贴形式:
$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_INT
、PDO::PARAM_STR
和PDO::PARAM_NULL
告诉MySQL要做什么
这些值告诉PDO如何处理输入,而不是禁止的输入。如果您发送文本,但列为int
,那么MySQL将尝试将数据强制转换为int
。它不会告诉你"你输入了abcd,但期望值是整数"。在将数据传递给PDO
之前,您必须自己进行此检查。
现在讨论其他问题:
-
不要使用
bindParam
。bindParam
通过引用接受该值。这适用于调用存储过程时,并且变量应该根据过程的输出进行修改。使用bindValue
。如果您尝试使用bindParam
执行以下操作,它将不起作用,并且会出现错误:$stmt->bindParam(':my_column', 1, PDO::PARAM_INT); // It fails and yields an error
-
不要锁桌子。您已经在使用事务,不需要锁定表,MySQL为您处理并发和访问。
底线-在使用PDO
进行插入之前执行验证。PDO
可帮助您根据连接信息(以及其他信息)清理输入。它不会执行验证。