提问人:user3286490 提问时间:1/10/2016 最后编辑:user3286490 更新时间:1/10/2016 访问量:173
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::P ARAM_INT,它不应该允许字符,而只允许整数,为什么我能够将文本发布到数据库(表)?
我有什么方法可以在这里高度限制 bindParam 上的数据类型。
提前致谢。
答:
1赞
N.B.
1/10/2016
#1
你的代码中有几个错误。
但是,让我们回顾一下 类型 ,并告诉MySQL要做什么。PDO::PARAM_INT
PDO::PARAM_STR
PDO::PARAM_NULL
这些值告诉 PDO 如何处理输入,而不是禁止输入。如果您发送文本,但该列是 那么MySQL将尝试将数据强制转换为。它不会告诉你“你输入了 abcd,但预期值是整数”。在将数据传递给 之前,必须自行执行此检查。int
int
PDO
现在谈谈其他问题:
不要使用 . 通过引用接受该值。这适用于调用存储过程时,并且应该根据过程的输出修改变量。用。如果您尝试使用 ,它将不起作用,并且您会收到错误:
bindParam
bindParam
bindValue
bindParam
$stmt->bindParam(':my_column', 1, PDO::PARAM_INT); // It fails and yields an error
不要锁定表。您已经在使用事务,无需锁定表,MySQL为您处理并发和访问。
底线 - 在用于插入之前执行验证。 帮助您根据连接信息(除其他外)清理输入。它不会执行验证。PDO
PDO
评论
0赞
user3286490
1/10/2016
亲爱的,但是使用 bindParam 我没有收到任何错误,只是文本值进入数据库,即使 MySQL 列上的类型是文本,它也不应该执行该语句,因为,我已将 PDO 类型设置为 int。 所以你的意思是我应该使用 bindValue,哪一个更好、更安全,还是两者都相同?
0赞
N.B.
1/10/2016
bindValue
并且不一样。两者都同样“安全”,并且都将清理输入以插入到查询中。两者都具有相似的功能签名。在您的情况下,您可以简单地切换 .这两个函数以不同的方式处理第二个参数。如果只执行琐碎的查询(如果从不调用存储过程),则使用 .如果列是文本类型,请不要使用 。这不是它的工作方式,也不是为了这个目的。如果想要一个整数,请在 php 中执行强制(使用 )。bindParam
bindParam
bindValue
bindValue
PDO::PARAM_INT
(int)$variable
0赞
user3286490
1/11/2016
使用 $stmt->bindValue(':name',$this->name,, PDO::P ARAM_INT);,,,当我插入文本时,它会插入 (0) 而不是..?可以吗?
0赞
user3286490
1/11/2016
--用于表锁定和事务,仅使用 $this->conn->beginTransaction();交易是可以的,因为她有超过 1000 个用户在数据库的一个表上有事务,它会防止重复或错误,而如果重复
0赞
N.B.
1/12/2016
为防止重复,请使用密钥。锁定表不会防止重复。UNIQUE
评论