这是帖子形式:
$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上的数据类型。
提前感谢。
答案 0 :(得分:1)
你的代码中有几个错误。
但是,让我们回顾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
可帮助您根据连接信息(以及其他内容)清理输入。它不会执行验证。