2012-08-11 85 views
0

我有一個具有大量的複選框,這是從唯一值在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

回答

0
$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

0

取出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