2011-04-26 55 views
10

将参数绑定到SQL语句时,可以提供参数类型,如PDO::PARAM_STR。如果不这样,请输入默认值PDO::PARAM_STR。什么可以是专门设置每个参数类型的原因?至少在MySQL中,PDO :: PARAM_STR与任何参数一起工作。我认为即使使用PDO :: PARAM_STR也可以使用BLOB列。在PDO中强类型参数的原因是什么?

PDO :: PARAM_STR不会引入任何SQL注入,因为您仍然有准备好的查询。

回答

7

使用PARAM_STR恰好始终在列值中工作,因为MySQL的implicitly converts values to the correct type where it can,但它会在此查询失败,例如:

$limit = 1; 

$dbh->prepare("SELECT * FROM items LIMIT :limit"); 
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
    // Will throw "You have an error in your SQL syntax..." 

一个绝对应该使用PARAM_INT酌情 - 对于像上面的案例,准备除mySQL之外的数据库引擎,这些引擎对他们的期望可能更为严格。

+0

+1 from me,excellent example。这不仅仅是应该避免的SQL注入,向用户显示原始的MySQL错误消息并不真正具有吸引力,也不是专业的,所以开发者**应该始终强制执行类型安全。 – 2011-04-26 17:21:28

+0

@ N.B。对我来说太无聊了。我宁愿简洁的代码重复一遍又一遍的这种绑定 – 2011-04-26 17:23:56

+0

太无聊做什么? – 2011-04-26 17:25:00

5

我个人认为没有理由,只要你有这个属性设置:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

所以,它会检测极限情况自动

反正我宁愿在一个占位符定义类型,没有绑定功能。

但是,我的PDO经验并不强。我只是试了一下,决定回到普通的mysql。

相关问题