PHP pdo bindParam类型管理

use*_*490 5 php mysql pdo

这是帖子形式:

 $funcname->name= htmlentities($_POST['name']);
 $funcname->insert();
Run Code Online (Sandbox Code Playgroud)

这将是类funcname上的函数insert ,它将数据插入到名为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();
}
Run Code Online (Sandbox Code Playgroud)

现在问题是我已经设置了 PDO :: PARAM_INT,它不应该允许字符但只有整数为什么我能够将文本发布到数据库(表)?

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

提前致谢.

N.B*_*.B. 1

您的代码中有几个错误。

然而,让我们回顾一下类型PDO::PARAM_INT,PDO::PARAM_STRPDO::PARAM_NULL告诉 MySQL 做什么。

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

现在讨论其他问题:

  • 不要使用bindParam. 通过引用bindParam接受该值。这是为了当您调用存储过程并且变量应该根据过程的输出进行修改时使用。使用。如果您尝试使用 执行以下操作,它将不起作用并且您会收到错误消息:bindValuebindParam

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

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

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