0

我想知道您是否可以告诉我我的代码有什么问题或指出我哪里出错了,因为我无法显示任何结果。$_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>"; 
?>
4

2 回答 2

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>

并且所有三个框都被选中;它将产生这个数组:

大批
(
    [0] => 1
    [1] => 2
    [2] => 3
)

按照 Collie 的循环:

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

$where看起来像:

大批
(
    [0] => id='1'
    [1] => 身份证='2'
    [2] => 身份证='3'
)

你的脚本的其余部分应该可以工作。但是,您应该考虑使用IN运算符。

这将使您能够跳过循环并仅使用implode

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

产生:

“1”、“2”、“3”

并结合IN

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

请注意,这没有经过消毒,您仍然容易受到注射。

于 2013-02-23T15:22:42.977 回答
0

如果$_POST["checkbox"]是你说的数组,那么你不能将它用作sprintf. 尝试使用array_pop返回该数组或类似数组的最后一个值。

您可以foreach通过数组中的每个元素:

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

虽然如果要求 ID 等于两个不同的整数,这可能只会创建一个无效的 SQL 语句。

于 2013-02-23T15:15:29.690 回答