为了防止SQL注入,将SQL提交给数据库前使用 quote 处理变量值是必不可少的步骤。如下面的例子:
$db=& MDB2::connect($dsn, $options);
$query = "SELECT * FROM users WHERE userid = ".$db->quote('2554963798', 'float');
1. quote 的数据类型
quote 的定义:
function quote($value, $type = null, $quote = true, $escape_wildcards = false)
使用 quote 时可以不指定数据类型,MDB2 将通过 gettype() 方法获得 $value 的数据类型。如果需要手工指定,必须选择正确的数据类型。例如,数据包的 id 类型是 bigint ,quote 时需指定类型为 float,而不是 integer,否则当数值大于 2^31 -1 时会发生益处错误。
可选择的数据类型
text
integer
date
timestamp
boolean
decimal
float
time
clob
blob
2. quote 空字符串返回null
这个问题曾经困扰着我,当我使用 quote($value) 而 $value 为空字符串时,结果返回null,这并不是我想要的。查阅了MDB2的文档才发现,options 的 portability 属性控制着这个特性。这个属性默认为
MDB2_PORTABILITY_ALL,其中就包括了
MDB2_PORTABILITY_EMPTY_TO_NULL。关于
MDB2_PORTABILITY_EMPTY_TO_NULL 的官方说明
Convert empty strings values to null in data in and output. Needed because Oracle considers empty strings to be null, while most other DBMSs know the difference between empty and null.
意思是为使数据库的行为一致,数据库返回结果集时,MDB2 将空字符串的字段强制转换成 null 返回。但连同 quote 时也将空字符串强制转成 null 了。
如果觉得这样不爽,可以在 options 设置
portability 属性,
$dsn = 'mysql://user:password@host/database'
$options = array(
'debug' => 2,
'portability' =>MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL
);
$mdb2 =& MDB2::connect($dsn, $options);
这样就保留了其他的
portability 属性,但关闭
MDB2_PORTABILITY_EMPTY_TO_NULL
属性。
quote 的相关源码
if (is_null($value)
|| ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)
) {
if (!$quote) {
return null;
}
return 'NULL';
}