搜索php代码中选择框中的所有项目

时间:2014-06-12 20:10:27

标签: php mysql

我有form和php文件,我需要从数据库中查询数组中的颜色。

数据看起来像

red,white         mustang  1977
black,blue        ford     2000
white,pink,blue   opel     2003

和表单看起来像

<form method="POST" action="select.php">

    <p><input type="radio" value="just" checked name="selection">just selected<input type="radio" name="selection" value="allinclude">all include </p>
    <p><input type="checkbox" name="color[]" value="ON">red</p>
    <p><input type="checkbox" name="color[]" value="ON">blue</p>
    <p><input type="checkbox" name="color[]" value="ON">black</p>
    <p><input type="checkbox" name="color[]" value="ON">white</p>
    <p><input type="checkbox" name="color[]" value="ON">pink</p>
    <p>&nbsp;</p>
    <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>

我需要2个sql查询,一个在数据中检查所有选中的选项,其中一个在数据中检查

在我的select.php中

$selection= $_POST["selection"];
$color=implode(",",$_POST["color"]); 

$sql= mysql_query("select model,year,color where color like '%".$color."%'");

当我选择蓝色和白色时,sql不返回任何行。 如果我选择白色,则返回2行

但是我想选择所有包含单选框并选择蓝色和白色然后返回3行

如何为所有包含的选择编写第二个sql?

这是新代码,但这只是查询数组中的最新项目,而不是所有选择形式的“仅”部分选择

$selection= $_POST["selection"];
$color=implode(",",$_POST["color"]); 

if($selection=='just'){


$colorselect = explode(',', $color);

foreach($colorselect as $b)

{

$mycolor = trim($b);

$sql= mysql_query("select model,year,color where color like '%".$mycolor."%'");
}

}
else{

$sql= mysql_query("select model,year,color where color like '%".$color."%'");
}

3 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您的第一个查询会获取包含所有所选颜色的所有行 - 并且您需要第二个查询来获取包含一行的所有行或更多选择的颜色。在这种情况下,您需要在查询中包含一系列OR,以检查每行中的每种颜色。 (注意:你的查询似乎缺少一个FROM语句。我已经添加了这个,假设你的表名为cars)。

假设$colors是一组选定颜色,例如:['blue', 'white', 'red'],您可以按如下方式设置查询:

$query = 'SELECT model,year,color FROM cars WHERE ';
$or = '';
foreach ($colors as $color) {
    $query .= $or . "color LIKE '%" . $color . "%'";
    $or = ' OR ';
}

这将有效地构建一个如下所示的查询:

SELECT model,year,color 
FROM cars
WHERE color LIKE '%blue%'
    OR color LIKE '%white%'
    OR color LIKE '%red%'

将从示例数据中选择所有行 - 每行至少包含一个所选颜色。如果您想更改此逻辑以获取包含所有颜色的所有行,只需将OR更改为AND - 这将匹配具有所有所选颜色的行,无论他们被选中的顺序。

其他想法:

存储逗号分隔值(如blue,white)通常是不好的做法。考虑规范化您的数据并使用包含colorscar_colors表格的系统。

不推荐使用

mysql_ *函数。考虑切换到mysqli_*pdo

<强>更新

这是完整的系统。这将根据选择的单选按钮创建适当的查询:

(假设您提供的样本数据位于名为cars的表中)

形式:

<form method="POST" action="select.php">
    <p><input type="radio" value="just" checked name="selection">just selected<input type="radio" name="selection" value="allinclude">all include </p>
    <p><input type="checkbox" name="color[]" value="red">red</p>
    <p><input type="checkbox" name="color[]" value="blue">blue</p>
    <p><input type="checkbox" name="color[]" value="black">black</p>
    <p><input type="checkbox" name="color[]" value="white">white</p>
    <p><input type="checkbox" name="color[]" value="pink">pink</p>
    <p>&nbsp;</p>
    <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>

select.php:

$selection = $_POST['selection'];
$colors = $_POST['color'];

$op = $selection == 'just' ? ' AND ' : ' OR ';
$query = 'SELECT model,year,color FROM cars WHERE ';
$and_or = '';
foreach ($colors as $color) {
    $query .= $and_or . "color LIKE '%" . $color . "%'";
    $and_or = $op;
}

$sql = mysql_query($query);

答案 1 :(得分:0)

Fred -ii-s评论的有效HTML是:

<form method="POST" action="select.php">

    <p><input type="radio" value="just" checked name="selection">just selected<input type="radio" name="selection" value="allinclude">all include </p>
    <p><input type="checkbox" name="colors[]" value="red">red</p>
    <p><input type="checkbox" name="colors[]" value="blue">blue</p>
    <p><input type="checkbox" name="colors[]" value="black">black</p>
    <p><input type="checkbox" name="colors[]" value="white">white</p>
    <p><input type="checkbox" name="colors[]" value="pink">pink</p>
    <p>&nbsp;</p>
    <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>

然后在PHP代码中,您只需使用$_POST['colors']数据数组,就像PHP中的任何其他数组一样。

$colors = implode($_POST['colors'],',');
$sql= mysql_query("select model,year,color where color in (".$colors.")");

答案 2 :(得分:0)

您的HTML:

<form method="POST" action="select.php">

    <p><input type="radio" value="just" checked name="selection">just selected<input type="radio" name="selection" value="allinclude">all include </p>
    <p><input type="checkbox" name="color[]" value="red">red</p>
    <p><input type="checkbox" name="color[]" value="blue">blue</p>
    <p><input type="checkbox" name="color[]" value="black">black</p>
    <p><input type="checkbox" name="color[]" value="white">white</p>
    <p><input type="checkbox" name="color[]" value="pink">pink</p>
    <p>&nbsp;</p>
    <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>

你的PHP:

$colors = array("red", "blue", "black", "white", "pink");

// Make sure that only allowed colors make through - we don't want SQL injection
$selection = array();
foreach ($_POST["colors"] as $color)
  {
    if (in_array($color, $colors) === true)
      {
        $selection[] = $color;
      }
  }

// Now a bit of magic
$sql= mysql_query("select model,year,color from data where color like '%" . implode("%' " . ($_POST["selection"] === "just" ? "or" : "and") . " color like '%",$selection) . "%'");