数字数据是否不需要mysql\u real\u escape\u string()?PHP

数字数据是否不需要mysql\u real\u escape\u string()?PHP,php,mysql,security,escaping,Php,Mysql,Security,Escaping,我有一个将MySQL表ID作为输入的函数 我可以使用is\u numeric而不是mysql\u real\u escape\u字符串吗 像这样: protected function validId($id) { if(!is_numeric($id)) return false; // else do stuff } 编辑: 我还想提一下,我有时会用到: $val=(int)$val 以下是PHP文档中关于类型转换的部分: 另外,我相信mysql\u real\u esc

我有一个将MySQL表ID作为输入的函数

我可以使用is\u numeric而不是mysql\u real\u escape\u字符串吗

像这样:

protected function validId($id) {
    if(!is_numeric($id)) return false; 
    // else do stuff
}
编辑:

我还想提一下,我有时会用到:

$val=(int)$val

以下是PHP文档中关于类型转换的部分:

另外,我相信mysql\u real\u escape\u字符串需要每次使用时对数据库进行点击。为什么在验证整数时会这样做

编辑2:

另外,is_int()不适用于表单输入,这就是我使用is_numeric的原因。但是,这样做可能会解决问题并加快工作速度/减少服务器负载:

protected function validId($id) {
    if(!is_numeric($id)) return false;  // confirm it is number or numeric string
    $id = (int) $id; // cast to int (will chop off decimals I believe)
    // do stuff
}
视情况而定

是数字的
允许十六进制表示法。如果在查询中用引号将其括起来,则只会导致
0
,但如果不这样做,则会正确解释
是数字的
也允许使用科学记数法,这也会遇到同样的问题

就个人而言,我建议使用
intval()
,但是
mysql\u real\u escape\u string
更安全

如果是函数名的长度,只需执行此操作,然后忘记它:

function esc($str) {return mysql_real_escape_string($str);}

作为补充说明,我建议不要使用mysql函数库,因为它已被弃用。使用MySQLi扩展,或者更好的使用PDO库。@spryno724是的,我知道。我需要完成我开始的工作,然后回去用PDO替换一切。我能理解|-(我自己也有这样的项目。尽管你可能想知道。不要使用不推荐的函数来完成你已经开始的工作。当你编写新代码时,请使用PDO或MySQLi。这样,当项目完成时,你可以少重写代码,并帮助你更快地学习新的方法。实际上,没有一个conv使用不推荐使用的函数编写新代码的原因。请参阅我的编辑:我还想知道如何使用(int)将值转换为整数。这与
intval
基本相同。谢谢。我不知道mysql\u real\u escape\u string如何比inval()/(int)更安全尽管如此。一个整数怎么可能是不安全的?没有什么可以逃逸的?我怀疑PHP会有一个bug,它会影响像类型转换这样基本的东西,允许通过int值进行SQL注入。@ButtleButkus:为什么不调用逃逸函数呢?它不会伤害任何东西(从性能上讲,这比解析运行它的PHP脚本要快得多…@BillyONeal为什么不呢?因为mysql_real_escape_string()每次调用时都会命中一个db。PHP必须询问mysql如何对每个字符串进行转义。当转换为int时,PHP中没有解析。只需要int,int是安全的。(如果PHP不是一种松散类型的语言,这不会是一个问题)在这种情况下,我仍然不相信我应该使用mysql\u real\u escape\u string()。这看起来仍然是一种浪费。