Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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 创建条件sql查询_Php_Mysql_Conditional - Fatal编程技术网

Php 创建条件sql查询

Php 创建条件sql查询,php,mysql,conditional,Php,Mysql,Conditional,我在让查询工作时遇到问题(同时也在质疑查询的安全性) 显然,如果FirstName_S未定义,查询将中断,并显示“WHERE或”。看起来它会有一个合乎逻辑的修复,但我已经盯着它看了有点太久了 此外,sql注入是作为一个问题提出的,作为一个附带问题,对输入进行消毒是否足够?或者这完全是一种糟糕的做法 if(isset($_POST)){ $sql = "SELECT * FROM members WHERE"; if($_POST['FirstName_S'] !=

我在让查询工作时遇到问题(同时也在质疑查询的安全性)

显然,如果FirstName_S未定义,查询将中断,并显示“WHERE或”。看起来它会有一个合乎逻辑的修复,但我已经盯着它看了有点太久了

此外,sql注入是作为一个问题提出的,作为一个附带问题,对输入进行消毒是否足够?或者这完全是一种糟糕的做法

  if(isset($_POST)){
        $sql = "SELECT * FROM members WHERE";

     if($_POST['FirstName_S'] !== ''){
        $sql .= "OR FirstName LIKE '%" . $_POST['FirstName_S'] . "%'";
     }
     if($_POST['LastName_S'] !== ''){
        $sql .= " OR LastName LIKE '%" . $_POST['LastName_S'] . "%'";
     }
     if($_POST['Firm_S'] !== ''){
        $sql .= " OR Firm LIKE '%" . $_POST['Firm_S'] . "%'";
     }
     if($_POST['Country_S'] !== ''){
        $sql .= " OR Country LIKE '%" . $_POST['Country_S'] . "%'";
     }
     if($_POST['City_S'] !== ''){
        $sql .= " OR City LIKE '%" . $_POST['City_S'] . "%'";
     }
     if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
        $sql .= " OR State LIKE '%" . $_POST['State_S'] . "%'";
     }

    $sql=str_replace("WHERE OR","WHERE",$sql);   // quick dirty fix

  }
当然,您需要清理输入,但是由于您没有提到您使用的MySQL API,我还没有添加任何清理功能。你可以看看


当然,您需要清理输入,但是由于您没有提到您使用的MySQL API,我还没有添加任何清理功能。您可以查看

我认为这可以帮助您:

if(isset($_POST)){
    $sql = "SELECT * FROM members";

 if($_POST['FirstName_S'] !== ''){
    $sql .= " WHERE FirstName LIKE '%" . $_POST['FirstName_S'] . "%'";
 }
 else {
   $sql .= " WHERE FirstName LIKE '%'";
 }
 if($_POST['LastName_S'] !== ''){
    $sql .= " OR LastName LIKE '%" . $_POST['LastName_S'] . "%'";
 }
 if($_POST['Firm_S'] !== ''){
    $sql .= " OR Firm LIKE '%" . $_POST['Firm_S'] . "%'";
 }
 if($_POST['Country_S'] !== ''){
    $sql .= " OR Country LIKE '%" . $_POST['Country_S'] . "%'";
 }
 if($_POST['City_S'] !== ''){
    $sql .= " OR City LIKE '%" . $_POST['City_S'] . "%'";
 }
 if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
    $sql .= " OR State LIKE '%" . $_POST['State_S'] . "%'";
 }
}


对于SQL注入,您可以查看General_Twyckenham评论。

我认为这可以帮助您:

if(isset($_POST)){
    $sql = "SELECT * FROM members";

 if($_POST['FirstName_S'] !== ''){
    $sql .= " WHERE FirstName LIKE '%" . $_POST['FirstName_S'] . "%'";
 }
 else {
   $sql .= " WHERE FirstName LIKE '%'";
 }
 if($_POST['LastName_S'] !== ''){
    $sql .= " OR LastName LIKE '%" . $_POST['LastName_S'] . "%'";
 }
 if($_POST['Firm_S'] !== ''){
    $sql .= " OR Firm LIKE '%" . $_POST['Firm_S'] . "%'";
 }
 if($_POST['Country_S'] !== ''){
    $sql .= " OR Country LIKE '%" . $_POST['Country_S'] . "%'";
 }
 if($_POST['City_S'] !== ''){
    $sql .= " OR City LIKE '%" . $_POST['City_S'] . "%'";
 }
 if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
    $sql .= " OR State LIKE '%" . $_POST['State_S'] . "%'";
 }
}


对于SQL注入,您可以查看General_Twyckenham注释。

按如下方式执行

if(isset($_POST)){
        $sql = "SELECT * FROM members WHERE";

     if($_POST['FirstName_S'] !== ''){
        $sql_arr[]=" FirstName LIKE '%" . $_POST['FirstName_S'] . "%'";

     }
     if($_POST['LastName_S'] !== ''){
        $sql_arr[]= " LastName LIKE '%" . $_POST['LastName_S'] . "%'";
     }
     if($_POST['Firm_S'] !== ''){
        $sql_arr[]= " Firm LIKE '%" . $_POST['Firm_S'] . "%'";
     }
     if($_POST['Country_S'] !== ''){
        $sql_arr[]= " Country LIKE '%" . $_POST['Country_S'] . "%'";
     }
     if($_POST['City_S'] !== ''){
        $sql_arr[]= " City LIKE '%" . $_POST['City_S'] . "%'";
     }
     if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
        $sql_arr[]= " State LIKE '%" . $_POST['State_S'] . "%'";
     }
     if(!empty($sql_arr)){
       $sql.=implode(' OR ',$sql_arr);
}

  }

按下面的方法做

if(isset($_POST)){
        $sql = "SELECT * FROM members WHERE";

     if($_POST['FirstName_S'] !== ''){
        $sql_arr[]=" FirstName LIKE '%" . $_POST['FirstName_S'] . "%'";

     }
     if($_POST['LastName_S'] !== ''){
        $sql_arr[]= " LastName LIKE '%" . $_POST['LastName_S'] . "%'";
     }
     if($_POST['Firm_S'] !== ''){
        $sql_arr[]= " Firm LIKE '%" . $_POST['Firm_S'] . "%'";
     }
     if($_POST['Country_S'] !== ''){
        $sql_arr[]= " Country LIKE '%" . $_POST['Country_S'] . "%'";
     }
     if($_POST['City_S'] !== ''){
        $sql_arr[]= " City LIKE '%" . $_POST['City_S'] . "%'";
     }
     if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
        $sql_arr[]= " State LIKE '%" . $_POST['State_S'] . "%'";
     }
     if(!empty($sql_arr)){
       $sql.=implode(' OR ',$sql_arr);
}

  }

快速修复方法是将
1=1
添加到查询中,因此您的查询以
结束,其中1=1
。这使您可以自由地在查询中附加任意数量的
或某物,而不必担心在第一个查询中省略

(1=1谓词不会引起任何问题;将在解析时对其进行计算,并且不会出现在执行计划中。)


至于SQL注入,是的,这段代码是易受影响的。如果您使用的是mysql接口,则使用
mysql\u real\u escape\u string
函数清理post变量。如果您使用的是mysqli或PDO(您应该这样做),那么请使用参数化查询。

快速修复方法是将
1=1
添加到查询中,因此您的查询以
结束,其中1=1
。这使您可以自由地在查询中附加任意数量的
或某物,而不必担心在第一个查询中省略

(1=1谓词不会引起任何问题;将在解析时对其进行计算,并且不会出现在执行计划中。)


至于SQL注入,是的,这段代码是易受影响的。如果您使用的是mysql接口,则使用
mysql\u real\u escape\u string
函数清理post变量。如果您正在使用mysqli或PDO(您应该这样做),那么请使用参数化查询。

您可以根据输入的参数编写WHERE命令

if(isset($_POST)){
    $sql_where = '';
    $sql = "SELECT * FROM members ";

    if($_POST['FirstName_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." FirstName LIKE '%" . $_POST['FirstName_S'] . "%' ";
    }
    if($_POST['LastName_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." LastName LIKE '%" . $_POST['LastName_S'] . "%' ";
    }
    if($_POST['Firm_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." Firm LIKE '%" . $_POST['Firm_S'] . "%' ";
    }
    if($_POST['Country_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." Country LIKE '%" . $_POST['Country_S'] . "%' ";
    }
    if($_POST['City_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." City LIKE '%" . $_POST['City_S'] . "%' ";
    }
    if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
        $sql_where .= (($sql_where != '')?('OR '):(''))." State LIKE '%" . $_POST['State_S'] . "%' ";
    }
    $sql .= (($sql_where != '')?('WHERE '.sql_where):(''));
}

您可以根据输入的参数组合WHERE命令

if(isset($_POST)){
    $sql_where = '';
    $sql = "SELECT * FROM members ";

    if($_POST['FirstName_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." FirstName LIKE '%" . $_POST['FirstName_S'] . "%' ";
    }
    if($_POST['LastName_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." LastName LIKE '%" . $_POST['LastName_S'] . "%' ";
    }
    if($_POST['Firm_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." Firm LIKE '%" . $_POST['Firm_S'] . "%' ";
    }
    if($_POST['Country_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." Country LIKE '%" . $_POST['Country_S'] . "%' ";
    }
    if($_POST['City_S'] !== ''){
        $sql_where .= (($sql_where != '')?('OR '):(''))." City LIKE '%" . $_POST['City_S'] . "%' ";
    }
    if($_POST['State_S'] !== '' AND $_POST['State_S'] !== 'other'){
        $sql_where .= (($sql_where != '')?('OR '):(''))." State LIKE '%" . $_POST['State_S'] . "%' ";
    }
    $sql .= (($sql_where != '')?('WHERE '.sql_where):(''));
}


FirstName\u
是否需要在
POST
中发送?不,不是。它只是一个搜索功能,用户可以在数据库中查找成员。您可以单独输入这些语句中的任意一个,也可以与其他语句一起输入。为了防止SQL注入,最好使用准备好的语句:将
从行的开头移动到行的末尾,只需使用
结束查询,其中1=1
。然后,您可以附加任意数量的
或某个
,而不必担心从第一个中省略
。(有一些查询生成器工具使用这种技术。)如果您使用的是mysql接口,请清理post变量。如果您正在使用mysqli或PDO(您应该这样做),请使用参数化查询。见我的答案。
FirstName\u S
是否需要在
帖子中发送?不,不是。它只是一个搜索功能,用户可以在数据库中查找成员。您可以单独输入这些语句中的任意一个,也可以与其他语句一起输入。为了防止SQL注入,最好使用准备好的语句:将
从行的开头移动到行的末尾,只需使用
结束查询,其中1=1
。然后,您可以附加任意数量的
或某个
,而不必担心从第一个中省略
。(有一些查询生成器工具使用这种技术。)如果您使用的是mysql接口,请清理post变量。如果您正在使用mysqli或PDO(您应该这样做),请使用参数化查询。看我的答案。如果名字没有定义-查询将失败-如果没有,你能告诉我怎么做吗?既然你添加了“快速修复”,它不会失败-我现在没有添加,这是我最初的答案-快速修复,请查看编辑历史。是的,或者仍然只是装饰性的,如果没有定义名字,查询将不会失败,你能告诉我怎么做吗?既然你添加了“快速修复”,它不会失败,我现在没有添加,这是我最初的答案,快速修复,查看编辑历史。是的,或者仍然只是表面的,不管有没有它,该查询仍然可以工作