【问题标题】:Passing array of values from form to sql query WHERE IN clause将值数组从表单传递到 sql 查询 WHERE IN 子句
【发布时间】:2012-08-08 11:58:39
【问题描述】:

我有一个带有多个复选框的表单,这些复选框是从 MySQL 表中的唯一值生成的:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<?php
    $query5="SELECT distinct from_user from tracks WHERE uploaded_page='$this_path_short' ORDER BY from_user";
    $result5=mysql_query($query5) or die(mysql_error());
    while ($row = mysql_fetch_array($result5)) {
        $from_user = $row['from_user'];
        echo "<input type=\"checkbox\" name=\"from_user[]\" value=\"AND ".$from_user."\" checked=\"checked\">".$from_user."<br>";
    }
?>
<input type="submit" name="submit" value="filter"><br>

然后我想将“from_user”值的数组传递给页面上的另一个 MySQL 查询。我可以得到这样的值:

$names=implode(" ", $_POST['from_user']);

但我不确定如何在以下 MySQL 查询中包含此数组:

$query1="SELECT * FROM tracks WHERE from_user IN **array goes here**)";

【问题讨论】:

标签: php mysql arrays forms


【解决方案1】:
$query1='SELECT * FROM tracks WHERE from_user IN ('.implode(',',$_POST['from_user']).')';

【讨论】:

  • -1 因为代码对 SQL 注入开放。永远不要在 SQL 语句中直接使用用户输入。清理输入并使用准备好的语句。
  • 点了,但是 - 不知道在此之前发布了什么,你不能说它没有被清理。
  • 也许是,也许不是。如果你不知道,你不应该假设它。显然,OP 的代码中没有任何暗示。
  • 同样明智地假设它不是?
  • +1 有两个原因: 1. 我不喜欢这里的老用户通过“拍其他用户的手”来“教育”的事实。和 2. 当您投反对票时,您说这个答案没有用 - 这是不正确的。 TMHO,@Gordon 的评论很好,不用投反对票。
【解决方案2】:

删除AND,使复选框值如下所示:

echo "<input type=\"checkbox\" name=\"from_user[]\" value=\"".$from_user."\" checked=\"checked\">".$from_user."<br>";
    }

IN 需要逗号分隔值:

$names=implode(",", $_POST['from_user']);    
$query1="SELECT * FROM tracks WHERE from_user IN (".$names."))";

!!!!但是:请,请,请使用准备好的语句,因为您的代码对 SQL 注入是开放的: http://php.net/manual/de/mysqli.prepare.php

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  exit();
}

$result = null;
$names = implode(",", $_POST['from_user']);  

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT * FROM tracks WHERE from_user IN (?)")) {

  /* bind parameters for markers */
  $stmt->bind_param("s", $names);

  /* execute query */
  $stmt->execute();

  /* bind result variables */
  $stmt->bind_result($result);

  /* fetch value */
  $stmt->fetch();

  print_r($result);

  /* close statement */
  $stmt->close();
}

/* close connection */
$mysqli->close();

【讨论】:

  • 感谢,并感谢您提供有关准备好的报表的信息。我已经添加了您的代码(即删除 AND,在 implode 上添加逗号并更改查询,但我收到以下 implode 错误:[11-Aug-2012 11:44:22] PHP Warning: implode() [&lt;a href='function.implode'&gt;function.implode&lt;/a&gt;]: Invalid arguments passed in **** on line 136
  • 尽管有此警告,但似乎 $names 设置正常,但由于某种原因,当我提交运行查询的表单时页面正在中断(即我得到一个白屏) $names 在
  • 我现在已经使用$names = "\"".implode('","', $_POST['from_user'])."\"";$query1="SELECT * FROM tracks WHERE from_user IN ($names)"; 进行了这项工作。似乎我需要将每个 $_POST['from_user'] 值用引号引起来,因为要在我的 MySQL 表中检查的项目是字符串。我仍然在 implode 行上收到 PHP 警告 - 我不确定为什么会这样,但我可以正常工作。我应该将您的答案标记为原样,还是您要根据此评论中的信息进行调整?
猜你喜欢
  • 1970-01-01
  • 2017-06-26
  • 2021-09-03
  • 2020-04-23
  • 2018-07-17
  • 2018-06-18
相关资源
最近更新 更多