我正在用PHP编写的网站上的搜索功能中实现过滤器。
我的目标是使其易于管理,因为在不久的将来该项目的规模将大大增加。现在,搜索页面上有一个带有一些输入字段的php,php通过检查表单按钮的名称是否在$ _POST数组内来检查表单是否已提交。在此搜索页面的右侧,有一个实际搜索结果的列表,一个foreach循环的输出在打印到屏幕上的项目列表上。为了清楚起见,我已经编写了一些代码来解释它的作用,并且还展示了我尝试提出的自己的方法:
<?php
$arrayToDisplay = array(
array("id"=>0,"name"=>"first","lastname"=>"last"),
array("id"=>1,"name"=>"first","lastname"=>"last"),
);
$acceptedName = "";
if(isset($_POST['buttonName'])) {
if(isset($_POST['name'])) {
$acceptedName = sanitize($_POST['name']);
}
}
?>
<form>
<input type="text" name="name">
<input type="submit" name="buttonName">
</form>
<?php
foreach($arrayToDisplay as $person) {
if(exists($acceptedName) && $acceptedName != "") {
if($person["name" == $acceptedname) {
echo $person["id"]." ".$person["name"];
}
}
else {
echo $person["id"]." ".$person["name"];
}
}
?>
这可以处理一个值,并按名称过滤。但是最终这些人员对象将具有近50个属性,并且搜索过滤器不仅必须能够按名称过滤列表,而且还必须能够过滤所有人员属性。该解决方案是无法维持的。
是否存在现有的设计模式,可以在这种情况下使用?
有很多解决此问题的方法,有人认为您可以/应该键入每个表单元素及其对应的处理程序,因为如果要使用文本框,选择列表,单选按钮等,这样将更易于维护。 ,您提到的只是使用文本框,因此这是使用单个数组驱动整个应用程序的方法。
<?php
// This array will drive your form and your query.
$columns = [
'firstname',
'lastname',
'email',
'address_1',
'address_2',
'city'
];
// The form was submitted.
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Match posted data to the `$columns` array and filter out any empty values.
$postedData = array_filter(array_intersect_key($_POST, array_flip($columns)));
// We have at least 1 search criteria to use.
if (!empty($postedData)) {
// Generate a list of columns for a WHERE clause. Ex. [`address_1 LIKE ?`, `name LIKE ?`]
$terms = array_map(function ($val) {
return "$val LIKE ? ";
}, array_keys($postedData));
// Generate a list of values wrapped in percent signs. Ex. [`123 King St.`, `%tony%`]
$values = array_map(function ($val) {
return "%$val%";
}, $postedData);
// Change this to `AND ` if needed.
$query = 'SELECT * FROM table WHERE ' . implode('OR ', $terms);
// Just showing you what the generated query and data looks like.
var_dump([
$query,
array_values($values)
]);
// Finally, use them to drive your query.
// $sql = $connection->prepare($query);
// $sql->execute(array_values($values));
}
}
?>
<form method="post">
<?php foreach ($columns as $column): ?>
<label>
<input type="text" name="<?php echo $column; ?>" placeholder="<?php echo $column; ?>">
</label>
<br>
<?php endforeach; ?>
<input type="submit" value="Search">
</form>
样本输出
array (size=2)
0 => string 'SELECT * FROM table WHERE firstname LIKE ? OR email LIKE ? ' (length=59)
1 =>
array (size=2)
0 => string '%Tony%' (length=6)
1 => string '%[email protected]%' (length=16)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句