Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将QBE筛选器添加到SQL语句_Php_Mysql - Fatal编程技术网

Php 如何将QBE筛选器添加到SQL语句

Php 如何将QBE筛选器添加到SQL语句,php,mysql,Php,Mysql,我一直很高兴在我的网站上的某个页面上添加了一个if语句来生成一个数据列表,但现在它的代码行数已经达到了1000行,而且非常混乱 我相信我所做的有更好的逻辑,所以任何帮助都是好的 这就是我的逻辑(或者说is应该如何工作) 运行查询 现在我已经使用了很多嵌套的div来计算get是否已设置,如果没有设置,则将它们添加到sql中,还必须计算出是否需要WHERE或and 我找到了这个帖子 我想这可能会有帮助,但不确定。 我的代码示例 if (isset($_GET['product'])&&

我一直很高兴在我的网站上的某个页面上添加了一个if语句来生成一个数据列表,但现在它的代码行数已经达到了1000行,而且非常混乱

我相信我所做的有更好的逻辑,所以任何帮助都是好的

这就是我的逻辑(或者说is应该如何工作)

运行查询

现在我已经使用了很多嵌套的div来计算get是否已设置,如果没有设置,则将它们添加到sql中,还必须计算出是否需要WHERE或and

我找到了这个帖子

我想这可能会有帮助,但不确定。 我的代码示例

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条件
  • 查询数据库
然后只通过在适当的位置输出db结果来呈现HTML部分。不要将上述任何逻辑放入脚本的HTML部分


至于构建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;
   }