2013-02-23 54 views
0

我想知道是否可以告訴我我的代碼出了什麼問題,或者指出我出錯的地方,因爲我無法顯示任何結果。 $ _POST ['checkbox']是一個數組。php和MYSQL SELECT數組問題

<? 
    $get_id=$_POST['checkbox']; 

    if(empty($get_id)) { 
     echo("<h3>You didn't select anything.</h3>"); 
    } else { 
     $where[] = sprintf(" id='%s'",$_POST["checkbox"]); 
    } 

    $where_str = " WHERE ".implode(" AND ",$where); 
    $sql = "SELECT * FROM products $where_str"; 
    $result = mysql_query($sql, $link); 

    echo "<table>"; 
    echo "<tr> <th>Description</th> </tr>"; 
     while($row = mysql_fetch_array($result)) { 
      echo "<tr><td>";  
      echo $row['description']; 
      echo "</td></tr>"; 
     } 
    echo "</table>"; 
?> 
+3

[**在新的代碼,請不要使用'mysql_ *'功能**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果選擇PDO,[這裏是一個很好的教程(http://www.brightmeup.info/article.php?a_id=2)。 – insertusernamehere 2013-02-23 15:12:50

+0

您是否迴應您的查詢以查看它的外觀?它如果'$ _POST ['checkbox']'是一個數組,那麼你需要遍歷它。否則,你得到'ID =陣列和id = Array' ...另外,好像那些應該是'或',而不是'和',在這種情況下,他們應該是在一個'IN()'條款(後你對SQL注入進行清理) – 2013-02-23 15:14:16

+0

[以下是一大堆示例](http://stackoverflow.com/search?q=%5Bphp%5D+%5Bmysql%5D+array+of+checkboxes)如何傳輸該post數組變成一個'IN()'子句。 – 2013-02-23 15:16:36

回答

0

如果$_POST["checkbox"]是像你說的,你不能用它作爲sprintf一個字符串數組。嘗試使用array_pop返回該數組或類似的最後一個值。

你可以foreach遍歷數組中的每個元素:

foreach ($_POST['checkbox'] as $checkbox) { 
    $where[] = sprintf(" id='%s'",$checkbox); 
} 

雖然這如果詢問ID等於兩個不同的整數可能只是創建一個無效的SQL語句。

3
  1. 您應該避免使用短標籤<?,因爲它們在PHP 5.4之後不受支持。
  2. 您未連接到MySQL($link未定義)
  3. 您正在使用已棄用的API(mysql_)。查看備選方案的評論(mysqli_PDO
  4. 您應該使用REQUEST_METHOD索引$_SERVER來確定您的腳本是否已發佈。

    if($_SERVER[REQUESTED_METHOD] == 'POST' && !empty($_POST['checkbox'])) { ... }

  5. 您需要使用錯誤處理來檢查錯誤。如果您echo $sql;你會看到沒有被填充的複選框:

    SELECT * FROM products WHERE id=''

  6. 你的腳本是容易受到SQL注入。當您切換到當前API時,請使用綁定參數。

  7. $_POST[checkbox]數組?
  8. sprintf將無法​​正常工作,因爲您將整個$_POST[checkbox]數組傳遞給它。你需要遍歷它來格式化它。 (見奧利的答案)

假設你的HTML看起來像這樣:

<form method="post" ...> 
<input type="checkbox" name="checkbox[]" value="1" /> 
<input type="checkbox" name="checkbox[]" value="2" /> 
<input type="checkbox" name="checkbox[]" value="3" /> 
<input type="submit" name="submit" /> 
</form> 

而且所有三個框;它會產生此陣:

 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
)

繼牧羊犬的循環:

foreach ($_POST['checkbox'] as $checkbox) { 
    $where[] = sprintf(" id='%s'",$checkbox); 
} 

$where將看起來像:

 
Array 
(
    [0] => id='1' 
    [1] => id='2' 
    [2] => id='3' 
)

腳本的其餘部分應該工作。但是,您應該考慮使用IN運算符。

這將使你跳過循環,直接使用implode

$where = "'" . implode("', '", $_POST[checkbox]) . "'"; 

主要生產:

'1', '2', '3'

,並結合IN

$sql = "SELECT ... FROM WHERE id IN ($where)"; 

注意,這沒有被消毒,你仍然很容易注射。

+0

感謝您的意見。道歉不清楚,但鏈接是在頭文件中定義的。 $ POST_ [複選框]是一個數組,我現在按照Ollie的建議編輯了相應的代碼,但是我仍然沒有收到結果。 – user2097289 2013-02-23 15:47:50

+0

@ user2097289查看我的更新。 – Kermit 2013-02-23 16:18:30