繁体   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