2015-10-19 45 views
1

我有AA类系列ID的一个阵列中,他们进入我的查询,如:MySQL的安全

WHERE category IN(".implode(',',$categories)) 

现在出于安全目的,我想,以确保每个值来自数组实际上是一个整数。有没有简单的方法来做到这一点,或者我应该分解我的数组,(int)$ val每一个,然后再次构造数组?

谢谢!

马特

+0

播下你的PHP脚本的完整片段 – Alex

回答

0

可悲的是,这是不可能逃脱使用数据库查询的整体“in'部分。所以你有两种可能性:

a)创建一个临时表,插入并连接到原来的表。 (在可能的情况下是首选,你不用INT你想拥有在where -clause的和你的工作非常大的数据集:

  • 创建一个临时表:create temporary table yourTempTable (tempColumn varchar(42)) ENGINE=MEMORY;
  • 插入所有值使用预处理语句以防止SQL-注射
  • 查询数据库:SELECT FROM orig_table INNER JOIN yourTempTable ON category = tempColumn

二)从技术上说,这是你所建议的解决方案:建立查询之前修改阵列。为了使代码更清晰可读,我建议使用array_map。然后,只需修改代码:

WHERE category IN(".implode(',',array_map($categories, function($a){return (int)$a;})) 

在这里,你得到所有返回值的新阵列consisisting的callable你提供的,这是在这种情况下,只是其中的每一个值强制转换为一个int的函数。这个数组直接输入到implode,所以你不需要任何新变量,全局函数,for -loops或其他任何东西。

+0

好的,谢谢我会试试! –