php和MYSQL SELECT问题与数组

时间:2013-02-23 15:09:03

标签: php mysql

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

2 个答案:

答案 0 :(得分:3)

  1. 您应该避免使用短标记<?,因为PHP 5.4之后不支持它们。
  2. 您没有连接到MySQL($link undefined)
  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]数组传递给它。你需要迭代它来格式化它。 (见奥利的回答)
  9. 示例

    假设您的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)";
    

    请注意,这并未消毒,您仍然容易受到注射。

答案 1 :(得分:0)

如果$_POST["checkbox"]是您所说的数组,则不能将其用作sprintf中的字符串。尝试使用array_pop返回该数组的最后一个值或类似值。

您可以foreach遍历数组中的每个元素:

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

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