Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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中正确地进行选择?_Php_Mysql_Sql - Fatal编程技术网

如何在PHP中正确地进行选择?

如何在PHP中正确地进行选择?,php,mysql,sql,Php,Mysql,Sql,我有以下问题:有一个巨大的查询连接了一组用户可选择的条件选择框、文本字段等。。 默认情况下,如果未选择任何内容,则无条件,按顺序根据各种参数进行排序。问题是,如果有条件,我们必须添加单词WHERE,并且只能添加一次,但如果没有条件,则不应添加,因为不可能在WHERE ORDER BY之后写入。如何解决这个问题 $payment\u select=选择payment\u id, 付款协议, 付款日协议, 付款行动, 付款截止日期:, 支付费用, 付款, 研究id, 卡号, 提名, 姓_主格, pa

我有以下问题:有一个巨大的查询连接了一组用户可选择的条件选择框、文本字段等。。 默认情况下,如果未选择任何内容,则无条件,按顺序根据各种参数进行排序。问题是,如果有条件,我们必须添加单词WHERE,并且只能添加一次,但如果没有条件,则不应添加,因为不可能在WHERE ORDER BY之后写入。如何解决这个问题

$payment\u select=选择payment\u id, 付款协议, 付款日协议, 付款行动, 付款截止日期:, 支付费用, 付款, 研究id, 卡号, 提名, 姓_主格, patr_提名, studu编号, 副局长姓名, 库斯研究所` 从…起 学习 卡上的内部连接卡\u id=学习卡\u id 名称上的内部联接名称\u id=卡名称\u id 姓氏id上的内部连接姓氏=卡姓氏id dep_id上的内部联接dep=研究dep_id 内部联接研究组上的研究组\u studgroups\u id=studgroups\u id 学习id上的左加入付款=学习id上的付款 左连接零件上的零件id=卡零件id ; 如果设置了$name\u过滤器&&$name\u过滤器{ $payment_select.=和name_命名,如“%$name_filter.%”; } 如果设置了$姓氏过滤器和$姓氏过滤器{ $payment_select.=和姓氏_主格类似“%$LANSAME_filter.%”; } 如果设置了$patr_过滤器和$patr_过滤器{ $payment_select.=和patr_主格类似“%.patr.%”; } 如果设置了$group\U过滤器&&$group\U过滤器{ $payment_select.=和studgroups_编号,如“%$group_filter.%”; } 如果设置了$agreement\u过滤器&&$agreement\u过滤器{ $payment_select.=和付款_协议,如“%$AGREATION_filter.%”; } 如果设置$debt\u filter&$debt\u filter==1{ $payment\u select.=和payment\u charge-payment\u pay>0; } 如果设置$debt\u filter&$debt\u filter==2{ $payment_select.=和payment_charge-payment_pay='.$date_from_mysql'; } 如果isset$date_from_mysql&$date_from_mysql&&isset$date_to_mysql&&$date_to_mysql{ $payment_select.=和payment_dateagreement='.$date_from_mysql。
'和payment_dateagreement您可以先收集数组中的所有where子句,然后检查其是否为空,然后将其内爆,而不是直接扩展SQL。如下所示:

//your select
$payment_select = "SELECT ....";

//helper var
$where_clauses = [];

//from your example
if (isset($name_filter) && ($name_filter)) {
    $where_clauses[] = "name_nominative like '%".$name_filter. "%'";
}

//from your example
if (isset($surname_filter) && ($surname_filter)) {
    $where_clauses[] = "surname_nominative like '%".$surname_filter. "%'";
}

//now append the clauses if there any
if (! empty($where_clauses)) {
    $payment_select .= " WHERE " . implode(" AND ", $where_clauses)
}

WHERE 1=1不是一个标准的php技巧吗?当然,您也可以不直接将所有这些条件连接到$payment_select,而是使用一个helper变量来组装这些条件;然后您只需检查helper变量是否在最后包含任何内容—如果是,那么该变量的位置和内容将附加到查询中,或者IMPLE-nothing。稍微脱离主题,但很有用。我在许多查询中使用Where 1=1和,Where 2=2和…来帮助我在代码中轻松找到它们。当您出现错误时,可以搜索4=4位。您应该尝试使用一些DB抽象库来执行此类任务。您在SQL注入方面有一个更严重的问题。