Php 如何将QBE筛选器添加到SQL语句
我一直很高兴在我的网站上的某个页面上添加了一个if语句来生成一个数据列表,但现在它的代码行数已经达到了1000行,而且非常混乱 我相信我所做的有更好的逻辑,所以任何帮助都是好的 这就是我的逻辑(或者说is应该如何工作) 运行查询 现在我已经使用了很多嵌套的div来计算get是否已设置,如果没有设置,则将它们添加到sql中,还必须计算出是否需要WHERE或and 我找到了这个帖子 我想这可能会有帮助,但不确定。 我的代码示例Php 如何将QBE筛选器添加到SQL语句,php,mysql,Php,Mysql,我一直很高兴在我的网站上的某个页面上添加了一个if语句来生成一个数据列表,但现在它的代码行数已经达到了1000行,而且非常混乱 我相信我所做的有更好的逻辑,所以任何帮助都是好的 这就是我的逻辑(或者说is应该如何工作) 运行查询 现在我已经使用了很多嵌套的div来计算get是否已设置,如果没有设置,则将它们添加到sql中,还必须计算出是否需要WHERE或and 我找到了这个帖子 我想这可能会有帮助,但不确定。 我的代码示例 if (isset($_GET['product'])&&
if (isset($_GET['product'])&& $_GET['product'] >0){
$product = $_GET['product'];
if($a == 1){
$sql_fields ="WHERE `Status_ID` = '$status' AND `Product` = '$product'";
}
else {
$sql_fields ="WHERE `Product` = '$product'";
}
$b++;
}
if (isset($_GET['company'])&& $_GET['company'] >0){
$company = $_GET['company'];
if($a == 0 && $b == 0){
$sql_fields ="WHERE `Company_ID` = '$company'";
}
else if($a == 0 && $b == 1){
$sql_fields ="WHERE `Product` = '$product' AND `Company_ID` = '$company'";
}
else if($a == 1 && $b == 0){
$sql_fields ="WHERE `Status_ID` = '$status' AND `Company_ID` = '$company'";
}
else {
$sql_fields ="WHERE `Status_ID` = '$status' AND `Product` = '$product' AND `Company_ID` = '$company' ";
}
$c++;
}
if ($a == 0 && $b == 0 && $c == 0){
$sql_fields =" ";
}
if (isset($_GET['date_from']) && $_GET['date_from'] >0 && isset($_GET['date_to'])&& $_GET['date_to'] >0){
if ($access_level == 1){
if ($a == 0 && $b == 0 && $c == 0){
$search_date = "WHERE `Date_added` >= '$date_from' AND `Date_added` <= '$date_to'";
}
else {
$search_date = "AND `Date_added` >= '$date_from' AND `Date_added` <= '$date_to'";
}
}
if ($access_level ==2 or $access_level ==3){
if ($a == 0 && $b == 0 && $c == 0){
$search_date = " `Date_added` >= '$date_from' AND `Date_added` <= '$date_to'";
$and = "AND";
}
else {
$search_date = " `Date_added` >= '$date_from' AND `Date_added` <= '$date_to'";
$and = "AND";
}
}
}
else {
$search_date = "";
$and = "";
}
现在我已经使用了很多嵌套div来计算get是否已设置
将html、php和sql混合在一个脚本中是一个经过尝试和测试的意大利面条代码配方。如果您至少不想完全分离HTML和PHP
- 将PHP逻辑置于脚本之上,然后
- 清理所有给定的输入
- 建立where条件
- 查询数据库
至于构建where子句的条件逻辑:我不知道它是做什么的。我看了30秒,但是代码的格式很差,并且有像$a、$b和$c这样带有幻数的变量。您应该选择一种具有适当缩进和格式的一致编码样式。您应该适当地命名变量,并使用常量或函数调用最小化幻数。从长远来看,这将使代码更具可读性。您(和其他开发人员)将能够更容易地理解正在发生的事情。首先,条件分支不需要确定要使用的正确SQL关键字(只需使用连接关键字作为状态变量即可)。此外,您的代码容易受到SQL注入的攻击,并可能导致查询无法有效地使用索引。考虑:
$join='WHERE';
$sql_filter='';
// potentially te following field meta data could be stored in a DB or file...
// or even selectively overriden at run time by the request...
$qbe=array(
array('get_name'=>'product',
'db_name'=>'Product',
'op' => '=',
'type'=>'string'),
array('get_name'=>'date_from',
'db_name'=>'date_added',
'op' => '>=',
'type' =>'date'),
array('get_name'=>'date_to',
'db_name'=>'date_added',
'op' => '<=',
'type' =>'date')
....
);
foreach ($qbe as $f) {
$sql_filter=add_filter($sql_filter, $join, $f['get_name'],
$f['type'], $f['op'], $f['db_name']);
}
function add_filter($sql_filter, &$join, $get_name, $type, $op, $db_name)
{
$mod_filter=$sql_filter;
if ($_GET[$get_name]) {
switch(upper($type)) {
case 'DATE':
$mod_filter=$mod_filter
. " $join $db_name $op "
. date(strtotime($_GET[$get_name]), 'YmdHis');
break;
case 'NUMBER':
$match=array();
if (preg_match('/([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)/', $_GET[$get_name], $match) {
$mod_filter=$mod_filter
. " $join $db_name $op " . $match[0];
}
break;
default:
$mod_filter=$mod_filter . " $join $db_name $op '" .
mysql_real_escape_string($_GET[$get_name]) . "'";
break;
}
if ($mod_filter != $sql_filter) {
$join='AND';
}
return $mod_filter;
}
$join='WHERE';
$sql_过滤器=“”;
//以下字段元数据可能存储在数据库或文件中。。。
//甚至在运行时被请求选择性地覆盖。。。
$qbe=数组(
数组('get_name'=>'product',
“db_名称”=>“产品”,
“op'=>'=”,
'type'=>'string'),
数组('get_name'=>'date_from',
“db_名称”=>“添加日期”,
'op'=>'>=',
'类型'=>'日期'),
数组('get_name'=>'date_to',
“db_名称”=>“添加日期”,
“op'=>”你能为你的代码提供一个示例吗?它检查了多少东西?请解释一下如果设置为“添加到sql”
,那么意味着什么?@nine7ySix我想我已经解决了这个问题很多了:/i我会离开并修改这个代码,然后看看我会得到什么!我已经创建了这个(比以前少了很多)您认为呢?SQL注入和索引的低效使用仍然存在问题。
$fields = array();
if (isset($_GET['status']) && $_GET['status'] >0){
$status = $_GET['status'];
$fields['Status_ID']= $_GET['status'];
}
if (isset($_GET['product']) && $_GET['product'] >0){
$product = $_GET['product'];
$fields['Product_ID']= $_GET['product'];
}
if (isset( $_GET['company']) && $_GET['company'] >0){
$company = $_GET['company'];
$fields['Company_ID']= $_GET['company'];
}
if (isset( $_GET['closer']) && $_GET['closer'] >0){
$closer = $_GET['closer'];
$fields['Closer']= $_GET['closer'];
}
if (isset( $_GET['date_from']) && $_GET['date_from'] >0 && isset( $_GET['date_to']) && $_GET['product'] >0){
$date_from = $_GET['date_from'];
$date_from = $_GET['date_to'];
}
$field_count = count($fields);
if ($field_count == 0){
$sql = "";
}
else {
$field_count --;
$sql="";
$i=0;
foreach($fields as $k => $v) {
if($i==0){
$sql = "WHERE `$k` = '$v'";
}
else{
$sql .=" AND `$k` = '$v'";
}
$i++;
}
}
echo $sql;
$join='WHERE';
$sql_filter='';
// potentially te following field meta data could be stored in a DB or file...
// or even selectively overriden at run time by the request...
$qbe=array(
array('get_name'=>'product',
'db_name'=>'Product',
'op' => '=',
'type'=>'string'),
array('get_name'=>'date_from',
'db_name'=>'date_added',
'op' => '>=',
'type' =>'date'),
array('get_name'=>'date_to',
'db_name'=>'date_added',
'op' => '<=',
'type' =>'date')
....
);
foreach ($qbe as $f) {
$sql_filter=add_filter($sql_filter, $join, $f['get_name'],
$f['type'], $f['op'], $f['db_name']);
}
function add_filter($sql_filter, &$join, $get_name, $type, $op, $db_name)
{
$mod_filter=$sql_filter;
if ($_GET[$get_name]) {
switch(upper($type)) {
case 'DATE':
$mod_filter=$mod_filter
. " $join $db_name $op "
. date(strtotime($_GET[$get_name]), 'YmdHis');
break;
case 'NUMBER':
$match=array();
if (preg_match('/([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)/', $_GET[$get_name], $match) {
$mod_filter=$mod_filter
. " $join $db_name $op " . $match[0];
}
break;
default:
$mod_filter=$mod_filter . " $join $db_name $op '" .
mysql_real_escape_string($_GET[$get_name]) . "'";
break;
}
if ($mod_filter != $sql_filter) {
$join='AND';
}
return $mod_filter;
}