首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们需要在bindParam()中指定参数类型?

为什么我们需要在bindParam()中指定参数类型?
EN

Stack Overflow用户
提问于 2013-06-02 16:30:50
回答 2查看 1.9K关注 0票数 4

我有点困惑,为什么我们需要指定在Php的bindParam()函数中传递的数据类型。例如,此查询:

$calories = 150; 
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT); 
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
$sth->execute();

如果我不指定第三个参数,会有安全风险吗?我是说,如果我只是在bindParam()中这样做:

$sth->bindParam(1, $calories); 
$sth->bindParam(2, $colour);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-02 16:41:34

bindParam()与类型一起使用可以被认为是更安全的,因为它允许更严格的验证,从而进一步防止SQL注入。然而,如果你不这样做,我不会说有真正的安全风险,因为这更多的是因为你做的是一个防止SQL注入的prepared statement,而不是类型验证。一种更简单的方法是将一个数组传递给execute()函数,而不是使用bindParam(),如下所示:

$calories = 150; 
$colour = 'red';

$sth = $dbh->prepare('SELECT name, colour, calories
                      FROM fruit
                      WHERE calories < :calories AND colour = :colour');

$sth->execute(array(
    'calories' => $calories,
    'colour' => $colour
));

您不一定要使用字典,您也可以像处理问号一样使用字典,然后将其以相同的顺序放入数组中。但是,即使这种方法工作得很好,我也建议养成使用第一种方法的习惯,因为一旦达到一定数量的参数,这种方法就会变得一团糟。为了完整起见,它看起来是这样的:

$calories = 150; 
$colour = 'red';

$sth = $dbh->prepare('SELECT name, colour, calories
                      FROM fruit
                      WHERE calories < ? AND colour = ?');

$sth->execute(array($calories, $colour));
票数 3
EN

Stack Overflow用户

发布于 2013-06-02 17:12:07

如果不指定类型,则默认将参数绑定为字符串。然后,您可能会得到一个等同于以下内容的查询:

SELECT foo FROM bar WHERE baz = '42'

这可能是一个问题,也可能不是问题。就像PHP和其他编程语言一样,数据库具有类型和在类型之间进行转换的规则。MySQL通常会根据需要隐式地将数字字符串转换为数字。某些数据库比其他数据库更严格,某些操作需要正确的类型。在大多数情况下,这几乎没有什么不同。但是,如果您确实需要将42作为42而不是'42'传递,则需要显式地将其绑定为INT

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16881085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档