使用explode()删除

时间:2013-09-13 17:26:16

标签: php mysql sql arrays

我有一个表单,它将一组事务ID提交给$_POST['transid'],以便删除这些事务记录。

我通常使用mysqli_real_escape_string来帮助防止攻击,但我不知道如何使用数组来解决这个问题。以下是我的问题:

$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ("'.implode('","',$_POST[transid]).'")'

...这给了我这样的东西:

$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ("123","124","138","145")'

这似乎是在寻找麻烦。我如何保护自己免受灾难(恶意或其他)?有没有一种有效的方法来消毒阵列?或者我应该采取另一种方式?

任何想法或指导都将不胜感激。

2 个答案:

答案 0 :(得分:3)

你可能最好在使用它来破坏之前消毒$ _POST,为此你必须遍历它。 @ user870018打败了我的结构,但这就是我要做的事情:

function sanitize($n)
{
    return your_escape_function_here($n);
}

$values = implode(",", array_map("sanitize", $_POST[transid]));
$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ('.$values.')';

答案 1 :(得分:2)

在构建查询之前使用foreach循环;

foreach ($_POST[transid] as &$x) $x = your_escape_function_here($x);

或者(如果你经常以这种方式使用数组)将它构建成一个函数,以保持整个程序更清洁;

function sqlEscapeArray($arr){
foreach ($arr as &$x)
$x = your_escape_function_here($x);
return $arr;
}

然后像这样使用它;

$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ("'.implode('","',sqlEscapeArray($_POST[transid])).'")';

当然,将your_escape_function替换为......你的转义函数。