Php 创建条件sql查询
我在让查询工作时遇到问题(同时也在质疑查询的安全性) 显然,如果FirstName_S未定义,查询将中断,并显示“WHERE或”。看起来它会有一个合乎逻辑的修复,但我已经盯着它看了有点太久了 此外,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'] !=
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(您应该这样做),请使用参数化查询。看我的答案。如果名字没有定义-查询将失败-如果没有,你能告诉我怎么做吗?既然你添加了“快速修复”,它不会失败-我现在没有添加,这是我最初的答案-快速修复,请查看编辑历史。是的,或者仍然只是装饰性的,如果没有定义名字,查询将不会失败,你能告诉我怎么做吗?既然你添加了“快速修复”,它不会失败,我现在没有添加,这是我最初的答案,快速修复,查看编辑历史。是的,或者仍然只是表面的,不管有没有它,该查询仍然可以工作