我从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”分开,这样我就可以在数据库中查询两者。
谢谢! :)
答案 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;