PHP 构建动态 WHERE 过滤掉列名



构建一个用于我的几个网站的搜索引擎,我给它一个查询,它使用查询中的字段构建 WHERE。由于站点使用的大多数查询都有一些不需要搜索的共同列名,因此我已经为返回的查询编写了一个过滤器,一切都运行良好,但现在我想将一个包含其他列名称的数组传入其中构建 WHERE 时不使用,并且不确定如何做到这一点。我可能试图让它比实际更困难,所以我该怎么办?

这段代码实际上是一个更大函数的片段,但对于这个问题的目的来说应该足够了。

$HideFields = "BaseMarque, DateUpdated, LinkPage, LinkPath, AdminPage";
$HideFields = ($HideFields && !is_array($HideFields)) ? csv2Array($HideFields) : "";
$queryField = DBConnect($querySQL,"Select",$siteDB,"assoc");
$columns = array_keys($queryField);
$Where = 'WHERE ' . implode("nAND ", array_map(function ($keyword) use ($columns) {
return "n(" . implode(' OR ', array_map(function ($column) use ($keyword) {
return "n`$column` LIKE '%$keyword%'";
}, array_filter($columns, function ($column) {
/* if (isset($HideFields)) {
$column .= array_diff_key($columns, array_flip($HideFields));
} */
if (is_array($HideFields)) {
foreach ($HideFields as $b) {
$column !== $b;
}
}
return $column !== 'ID' && $column !== 'Deleted' && $column !== 'ShowPage';
}))) . "n)";
}, $keywords));

事实证明,这很简单,就像我想象的那样。此外,代码是很久以前编写的,我没有注意到其中有一个小函数,所以它甚至没有获得$HideFields值,直到我将其添加为函数中的全局值。如果我决定我手头有很多时间,并希望将所有这些网站转换为PDO和/或准备好的声明,我将单独发布。

$Where = 'WHERE ' . implode("nAND ", array_map(function ($keyword) use ($columns) {
return "n(" . implode(' OR ', array_map(function ($column) use ($keyword) {
return "n`$column` LIKE '%$keyword%'";
}, array_filter($columns, function ($column) {
global $HideFields;
return $column !== 'ID' && $column !== 'Deleted' && $column !== 'ShowPage' && !in_array($column,$HideFields);
}))) . "n)";
}, $keywords));

最新更新