mysql查询中的多个PHP值 - 如何将多个选项分隔到查询数据库

时间:2017-05-03 20:55:21

标签: php mysql sql

我从this post得到了帮助,但还需要一些帮助:) 我有12个下拉菜单,可以选择多个值。提交时,这些值将发布到另一个页面,我在其中对数据库执行mysql查询。如果我从每个下拉列表中选择一个值,它就可以工作。但是,如果我选择多个,则只查询一个。

如果我选择多个值,这是查询输出:

SELECT * 
  FROM dummy_table 
 WHERE Role = 'Student' 
    OR Name = '**George,Sheila**' 
    OR City = 'New York'; 

我希望它是Name='George OR Sheila'所以我可以用这些名字或其他值吸引人们。

<?php 
foreach($_POST as $key=>$option){
    $countValue = count($option);

    for($i=0; $i<$countValue; $i++){
        $queryString_start_with_comma .= ",$option[$i]";

        if($i >1){
            $queryString_start_with_comma .= ",$option[$i] OR";
        }
    }

    $queryString_remove_extra_comma= preg_replace("/,/", "", $queryString_start_with_comma, 1);
    $query_string_with_and .= " OR $key = '$queryString_remove_extra_comma'"; 

    unset($queryString_start_with_comma);
}

if ($sql_post_parameters == "AND") {
    $query_string_second_part_ready = preg_replace("/AND/", "", $query_string_with_and, 1);
}
else {
    $query_string_second_part_ready = preg_replace("/OR/", "", $query_string_with_and, 1);
}


$query_string= "SELECT * FROM dummy_table WHERE $query_string_second_part_ready";

TL; DR:我想将下拉菜单中提取的值与“OR”分开,这样我就可以在数据库中查询两者。

谢谢! :)

2 个答案:

答案 0 :(得分:1)

正如已经说过的那样SQL and PHP filter sqli_*函数在处理用户输入时并不是那么好(好吧,实际上它们真的很糟糕,你必须自己清理并构建查询,根本不是用户友好的)

安全性首先,这是一种在PDO中使用预准备语句和可信参数的白名单的方法:

        // DB connect
$db = new PDO('mysql:host=localhost;dbname=DB_name', 'user', 'pwd');

$where = array();
$param = array();

foreach($_POST as $key => $option) {
    if (
        !empty($option) 
        and in_array($key, array('Role','Name','City'))) 
    {
        if (is_array($option)) {
            foreach($option as $k => $optval) {
                $where[] = "`".$key."` = ?";
                $param[] = $optval;
            }
        }
        else {
                $where[] = "`".$key."` = ?";
                $param[] = $option;
        }
    }
}

$query_string = "SELECT * FROM dummy_table";

if(!empty($where))
    $query_string .= " WHERE ".implode(' OR ',$where);

    // we prepare our request
$stmt = $db->prepare($query_string);
    // we execute with our parameters
$stmt->execute($param);
echo '<pre>';
print_r($stmt->fetchAll());
echo '</pre>';

答案 1 :(得分:0)

试一试。它采用每个字段并拆分选项,为每个选项值创建一个条件。然后它将它们与OR一起重新组合。

$where_a = array();
foreach($_POST as $key => $option) {
    $val_a = explode(',',$option);
    foreach($val_a as $k => $optval) {
        $where_a[] = "`".$key."` = '".$optval."'";
    }
}
$where = implode(' OR ',$where_a);

$query_string = "SELECT * FROM dummy_table WHERE ".$where;