【发布时间】:2021-04-05 16:28:51
【问题描述】:
我正在使用 API 来根据用户输入检索记录。
有过滤器和过滤器组将被连接,但是,我不希望每个循环嵌套中的最后一个 AND 或 OR 连接到字符串。
我想要一个 if 语句来查找嵌套 foreach 循环中的最后一项并将不同的字符串连接到末尾,如下所示:
if($i == $lastItem) {
$conditions .= 'WHERE ' . $type . ' = '. "'". $tag . "'";
}
else {
$conditions .= 'WHERE ' . $type . ' = '. "'". $tag . "'" . ' ' . $condition . " ";
}
使用 PHP 为每个循环查找嵌套的最后一项的最佳做法是什么?
这里是参考代码:
$conditions = "";
$filters = "";
foreach($request->filters as $key=>$filter) {
foreach($filter as $item) {
if($item['tag']) {
$type = $item['code'];
$tag = $item['tag'];
$condition = $item['condition'];
$conditions .= 'WHERE ' . $type . ' = '. "'". $tag . "'" . ' ' . $condition . " ";
}
}
$groupCondition = $request->conditions[$key]['condition'];
$filters .= '('.$conditions.') ' . $groupCondition . " ";
}
这里是一个请求的例子,两个对象在foreach循环中组合起来:
filter: {
0 {
0 {
code: 'gl_code',
condition: 'OR',
tag: '10-140-4700-0401'
}
1 {
0 {
code: 'ty_letter_no',
condition: 'AND',
tag: 'AM123'
},
1 {
code: 'gl_code',
condition: 'OR',
tag: '10-140-4700-0401'
}
}
groupConditions: {
0 {
condition: 'OR'
}
1 {
condition: 'AND'
}
}
这里是当前输出的示例:
"(WHERE ty_letter_no = 'AM123' AND )
OR
(WHERE ty_letter_no = 'AM123' AND WHERE solicit_code = '19-10NL' AND WHERE ty_letter_no = 'AU' AND )
AND
(WHERE ty_letter_no = 'AM123' AND WHERE solicit_code = '19-10NL' AND WHERE ty_letter_no = 'AU' AND WHERE solicit_code = '19-04HRGOLF' AND )
AND "
我希望它输出:
"(WHERE ty_letter_no = 'AM123')
OR
(WHERE ty_letter_no = 'AM123' AND WHERE solicit_code = '19-10NL' AND WHERE ty_letter_no = 'AU')
AND
(WHERE ty_letter_no = 'AM123' AND WHERE solicit_code = '19-10NL' AND WHERE ty_letter_no = 'AU' AND WHERE solicit_code = '19-04HRGOLF')"
【问题讨论】:
-
你获取的代码应该是SQL吧?它有几个问题。你能举一个你得到的请求的例子吗?即“{“过滤器”:{“key1”:[{“code”:“ty_letter_no”,“tag”:“AU”}],“key2”:[...]},“条件”:{“key1 ": { "condition": "or" } }",应该输出什么?
-
我添加了一个请求示例。
-
我不太明白为什么您有一个带有“OR”的 groupCondition,并且 还有在过滤器内有一个“条件”。坦率地说,虽然您的要求很简单(我自己编写了几个这样的过滤器),但这个请求对象的结构却不是。最终代码是有效的 SQL,还是其他什么?在您的示例请求中,两个 OR 似乎都丢失了。这是预期的结果吗?
-
警告:使用
mysqli时,您应该使用parameterized queries 和bind_param将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿将$_POST、$_GET或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
标签: php foreach nested-loops