用于在查询中使用数组的mysql安全性

用于在查询中使用数组的mysql安全性,mysql,Mysql,我在一个数组中有一系列类别ID,它们进入我的查询,如下所示: WHERE category IN(".implode(',',$categories)) 现在为了安全起见,我想确定数组中的每个值实际上都是一个整数。有没有一种简单的方法可以做到这一点,或者我应该分解我的数组,(int)$val每个数组,然后重新构造数组 谢谢 Matt遗憾的是,使用数据库无法逃避整个查询的“内部”部分。所以你有两种可能: a) 创建临时表,插入并连接到原始表。(如果您在where-子句中没有想要的int,并且您

我在一个数组中有一系列类别ID,它们进入我的查询,如下所示:

 WHERE category IN(".implode(',',$categories))
现在为了安全起见,我想确定数组中的每个值实际上都是一个整数。有没有一种简单的方法可以做到这一点,或者我应该分解我的数组,(int)$val每个数组,然后重新构造数组

谢谢


Matt

遗憾的是,使用数据库无法逃避整个查询的“内部”部分。所以你有两种可能:

a) 创建临时表,插入并连接到原始表。(如果您在
where
-子句中没有想要的int,并且您正在处理非常大的数据集,则可能会首选:

  • 创建临时表:
    创建临时表yourtestable(tempColumn varchar(42))ENGINE=MEMORY;
  • 使用准备好的语句插入所有值以防止SQL注入
  • 查询数据库:
    SELECT FROM orig_table internal JOIN yourtestable ON category=tempColumn
b) 从技术上讲,这是您建议的解决方案:在构建查询之前修改数组。为了使代码更清晰易读,我建议使用。然后只需修改您的代码:

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

在这里,您得到了一个新数组,该数组包含您提供的所有返回值,在本例中,它只是一个将每个值转换为int的函数。该数组直接输入到
内爆
,因此您不需要任何新变量、全局函数、
用于
-循环或其他任何东西。

遗憾的是,不可能使用数据库对整个查询的“in”部分进行转义。所以你有两种可能:

a) 创建临时表,插入并连接到原始表。(如果您在
where
-子句中没有想要的int,并且您正在处理非常大的数据集,则可能会首选:

  • 创建临时表:
    创建临时表yourtestable(tempColumn varchar(42))ENGINE=MEMORY;
  • 使用准备好的语句插入所有值以防止SQL注入
  • 查询数据库:
    SELECT FROM orig_table internal JOIN yourtestable ON category=tempColumn
b) 从技术上讲,这是您建议的解决方案:在构建查询之前修改数组。为了使代码更清晰易读,我建议使用。然后只需修改您的代码:

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

这里,您将得到一个新数组,它包含您提供的所有返回值,在本例中,它只是一个将每个值转换为int的函数。该数组直接输入到
内爆
,因此您不需要任何新变量、全局函数,
用于循环或其他任何内容。

为我们播送php脚本的完整片段为我们播送php脚本的完整片段