PHP pdo bindParam类型管理

时间:2016-01-10 07:14:14

标签: php mysql pdo

这是帖子形式:

 $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上的数据类型。

提前感谢。

1 个答案:

答案 0 :(得分:1)

你的代码中有几个错误。

但是,让我们回顾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可帮助您根据连接信息(以及其他内容)清理输入。它不会执行验证。