爆炸Textarea和传入选择声明

时间:2014-12-16 17:15:57

标签: php mysql arrays

我有一个名为mycode的文本区域,它接收一个代码列表:

1234
3456
7654
3456

等...

我的php process.php脚本接受代码:

  $codes = $_POST['mycode'];

然后我尝试将$ code分解为名为$arr的变量:

  $arr = explode("\n", $codes);

接下来,我尝试将$arr数组传入我的MySQL SELECT语句:

  $sql = "SELECT code, name, FROM rawcodes where code IN ($arr)";
  $rs=$conn->query($sql);

我从数据库中获取数据,但是它的记录没有代码但是有一个名称,因此很明显是创建了一个空数组,因此传递给了mysql语句。

我也尝试过:

  $arr = explode(",", $codes);

这也会返回错误。

修改

我也尝试过:

implode('","',$arr)

所以我需要数据实际存在于数组中吗?

任何帮助表示感谢。

干杯

3 个答案:

答案 0 :(得分:1)

可以尝试使用此

$in = "'".implode("','", array_filter(explode(" ", $codes))) . "'";
$sql = "SELECT code, name FROM rawcodes where code IN ($in)";

答案 1 :(得分:1)

在sql

中的,后面有一个不需要的name
$sql = "SELECT code, name, FROM rawcodes where code IN ($arr)";

$sql = "SELECT code, name FROM rawcodes where code IN ($arr)";

答案 2 :(得分:1)

如果$_POST['mycode']确实是带有空格分隔符的1234 3456 7654 3456字符串,则会在“”上爆炸。您将帖子更改为换行符,因此我进行了相应更改。

此外,我建议跳过一些额外的箍来绑定每个部分作为参数,以防止注入攻击。 (实际上,你应该验证每个部分以确保它只包含数字!!)

棘手的部分是mysqli不允许您将参数数组绑定到一组标记。使用PDO可以更轻松地在SQL中使用':param'之类的'命名标签'。使用mysqli,您必须使用call_user_func_array来获取可变数量的参数。

// removed extra comma after 'name'
$values = explode("\n", $_POST['mycode']);
$placeholders = "";
$bindTypes = str_repeat("s", count($values));
$params = array(&$bindTypes);
for($i = 0, $len = count($values), $i < $len, $i++) {
    // validate $values[$i] here! 
    if(strlen($placeholders)) $placeholders .= ", ";
    $placeholders .= "p".$i;
    $params[] = &$values[$i];
}

$sql = "SELECT code, name FROM rawcodes where code IN ($placeholders)";
$statement = $conn->prepare($sql);
// make params array act like a comma-separated argument list
call_user_func_array(array($stmt, 'bindparams'), $params);
$rs=$statement->execute();
// check return code, process results here