簡體   English   中英

PHP和MYSQL SELECT問題與數組

[英]php and MYSQL SELECT issues with arrays

我想知道您是否可以告訴我我的代碼有什么問題,或者指出我要去哪里,因為我無法顯示任何結果。 $ _POST ['checkbox']是一個數組。

<?
   $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>"; 
?>
  1. 您應該避免使用短標簽<? 因為PHP 5.4之后不支持它們。
  2. 您沒有連接到MySQL( $link undefined)
  3. 您正在使用不推薦使用的API( mysql_ )。 參見注釋(替代mysqli_PDO
  4. 您應該使用$_SERVERREQUEST_METHOD索引來確定是否已發布腳本。

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

  5. 您需要使用錯誤處理來檢查錯誤。 如果您echo $sql; 您會看到未填充復選框:

    SELECT * FROM products WHERE id=''

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

  7. $_POST[checkbox]是數組嗎?
  8. sprintf將無法按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
)

遵循Collie的循環:

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)";

請注意,這尚未消毒,您仍然容易受到注射的傷害。

如果$_POST["checkbox"]是一個像您所說的數組,則不能在sprintf中將其用作字符串。 嘗試使用array_pop返回該數組或類似數組的最后一個值。

您可以foreach數組中的每個元素:

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

盡管如果要求ID等於兩個不同的整數,這可能只會創建一個無效的SQL語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM