传递值数组从形式到SQL查询WHERE IN子句

问题描述:

我有一个具有大量的复选框,这是从唯一值在MySQL表中生成的一种形式:传递值数组从形式到SQL查询WHERE IN子句

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
<?php 
    $query5="SELECT distinct from_user from tracks WHERE uploaded_page='$this_path_short' ORDER BY from_user"; 
    $result5=mysql_query($query5) or die(mysql_error()); 
    while ($row = mysql_fetch_array($result5)) { 
     $from_user = $row['from_user']; 
     echo "<input type=\"checkbox\" name=\"from_user[]\" value=\"AND ".$from_user."\" checked=\"checked\">".$from_user."<br>"; 
    } 
?> 
<input type="submit" name="submit" value="filter"><br> 

我将随后要通过'from_user'值的数组到另一个MySQL页面上的查询。我能得到的值是这样的:

$names=implode(" ", $_POST['from_user']); 

但我不知道如何将这个数组在下面的MySQL查询:

$query1="SELECT * FROM tracks WHERE from_user IN **array goes here**)"; 
+0

可能重复[使用IN指令用事先准备好的声明中搜索(HTTP://计算器.com/questions/9006066/use-the-in-directive-to-search-with-a-prepared-statement) – Gordon 2012-08-11 11:28:14

+0

[PDO with where in queries]的可能重复(http://stackoverflow.com/questions/2373562/pdo-with-where-in-queries) – Gordon 2012-08-11 11:28:51

+0

[MySQL Prepared statement with a variable size variable list]可能的重复(http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable -size-variable-list) – Gordon 2012-08-11 11:29:15

$query1='SELECT * FROM tracks WHERE from_user IN ('.implode(',',$_POST['from_user']).')'; 
+3

-1,因为代码对SQL注入是开放的。永远不要在SQL语句中直接使用用户输入。清理输入并使用准备好的语句。 – Gordon 2012-08-11 11:31:51

+0

已经采取了一些措施,但是 - 不知道在这之前发布了什么,你不能说它没有被消毒。 – 2012-08-12 02:32:39

+0

也许它是,也许它没有。如果你不知道它,你就不应该假设它。在OP的代码中显然没有暗示它。 – Gordon 2012-08-12 09:34:52

取出AND所以该复选框值的样子此:

echo "<input type=\"checkbox\" name=\"from_user[]\" value=\"".$from_user."\" checked=\"checked\">".$from_user."<br>"; 
    } 

IN预计逗号分隔值:

$names=implode(",", $_POST['from_user']);  
$query1="SELECT * FROM tracks WHERE from_user IN (".$names."))"; 

!!!!但是:请,请,请用准备好的语句,因为你的代码是SQL注入敞开:的 http://php.net/manual/de/mysqli.prepare.php

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$result = null; 
$names = implode(",", $_POST['from_user']); 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT * FROM tracks WHERE from_user IN (?)")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $names); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($result); 

    /* fetch value */ 
    $stmt->fetch(); 

    print_r($result); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
+0

谢谢,并感谢准备好的陈述信息。我已经添加了你的代码(即删除AND,在implode上添加逗号,并且改变查询,但是我得到了implode的以下错误:'[11-Aug-2012 11:44:22] PHP Warning: implode()[function.implode]:在第136行****中传递的参数无效 – Nick 2012-08-11 11:48:45

+0

看来,尽管有这个警告,$ name被设置为OK,但由于某种原因,页面正在破坏一个白色的屏幕)当我提交的表单运行查询与$ name在 – Nick 2012-08-11 12:06:28

+0

我已经得到了这个工作现在使用'$ names =“\”“。​​implode('','',$ _POST ['from_user']) 。“\”“;'和'$ query1 =”选择*从跟踪WHERE from_user IN($ names)“;'看来我需要将每个$ _POST ['from_user']值包含在引号中,在我的MySQL表中检查是字符串。我仍然在implode行上得到PHP警告 - 我不知道为什么这样,但我有它的工作。我应该标记你的答案是答案,因为它是,或者您是否想根据评论中的信息进行调整? – Nick 2012-08-11 13:53:36