我想知道,如果我有一个值,我知道应该是数字,是乘以1一个安全的方法来清理它?
function x($p1){
$p1*=1;
sql="select * from t where id ={$p1}";
//run query..
}
虽然我的例子使用ID,这是用于许多类型的数值我在我的应用程序(可以是钱,可以是pai等)。
我不明白为什么不可以。但是使用预处理语句有什么问题呢?这总是比在SQL语句中直接使用PHP变量更安全。
可以使用is_numeric()
我相信有一个更"合适"的方式,但对于你的问题的范围,我会说是的。如果传递了某种类型的字符串,PHP在进行数学运算时会将其解释为零。
也可以使用is_int()
虽然这可能会起作用,但intval
似乎是更好的解决方案。http://php.net/manual/en/function.intval.php。你的意图可能会更明显的其他人阅读你的代码。
如果您想在将一个值转换为整型之前检查它是否是数字,请使用is_numeric
(http://php.net/manual/en/function.is-numeric.php)。它会检查字符串是数字还是整数。例如,如果一个数字通过AJAX从文本输入表单返回,那么它可能是一个字符串。在这种情况下,is_int
将返回false,但is_numeric
将返回true。
编辑
现在我知道MySQL的列类型是DECIMAL,你可以这样做:
function getItem($pValue)
{
if (!is_numeric($pValue))
{
return false;
}
$Query = sprintf
(
'SELECT * FROM %s WHERE %s = %.2f',
'TableName',
'Price',
$pValue
);
// Do something with $Query
}
它在大多数情况下都有效,因为它将字符串转换为整数或双精度,但您必须小心。它对标量值是正确的。但是,如果您这样做:
x(new stdClass);
你会得到一个E_NOTICE
。这不是很糟糕,对吧?:
x(array());
您将得到一个E_ERROR
, 不支持的操作数类型,脚本终止。
也许你会认为这并不是那么糟糕,但是在不合适的时候出现的致命错误可能会使系统处于不稳定状态,例如,通过失去引用完整性或使一系列查询未完成。
只有你知道上述情况是否会发生。但如果这些数据以任何方式来自用户,我就会遵循墨菲定律,不相信它。