我正在构建基于PHP的过滤器,该过滤器将根据HTML文件中的下拉列表指定的条件缩小搜索范围。在MySQL文件中,我有一个image_url,客户端和服务列。搜索完成后,我想显示图像,客户端名称和服务。
目前,我根据一组特定标准进行了PHP设置。我想让它考虑额外的参数集。我怎样才能做到这一点?提前谢谢!
这是我到目前为止所做的。
HTML
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<title>Filter</title>
</head>
<body>
<br />
<form action="filter.php" method="post">
Search by:
<br />
Client:
<select name="client">
<option value="any">- Any -</option>
<option value="1">Test 1</option>
<option value="2">Test 2</option>
<option value="3">Test 3</option>
</select>
Services:
<select name="services">
<option value="any">- Any -</option>
<option value="1">Test 1</option>
<option value="2">Test 2</option>
</select>
<input type="submit" value="Submit" />
</form>
</body>
</html>
PHP
<?php
// declare sting variable and set value to link to index.html
// connect to database and select database 'directory'
$con = mysql_connect("localhost","username","123456");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("filter", $con);
$name = 'name';
if (isset($_REQUEST['client']))
{
$name = trim($_REQUEST['client']);
} else {
echo "Sorry, no search criteria.";
exit;
}
// contains the string input by the user on the name.html page
$query = "SELECT * FROM filter WHERE client LIKE '".mysql_real_escape_string($client)."%'";
$result = mysql_query($query) or die( "Problem executing: ". $query . " " . mysql_error() );
// if no results are returned from the query, give error message and exit
if (mysql_num_rows($result) == 0) {
echo "Sorry, no matching results.";
exit;
}
while ($row = mysql_fetch_assoc($result)) {
echo "<img src="<?php echo $row["image_url"]; ?>"/> ;
echo "<b>Client: </b>";
echo $row["client"] ;
echo " ";
echo "<b>Services: </b>";
echo $row["services"];
echo "<br>";
echo "<br>";
}
?>
答案 0 :(得分:4)
如果我正确理解了这个问题,你就是这样的:
$select = 'SELECT image_url, client, service from filter';
$criteria = array_filter(
filter_input_array(
INPUT_POST,
array(
'client' => FILTER_VALIDATE_INT,
'services' => FILTER_VALIDATE_INT
)
)
);
if (!empty($criteria)) {
array_walk($criteria, function(&$val, $column) {
$val = sprintf('%s = %d', $column, $val);
});
$select .= ' WHERE ' . implode(' AND ', $criteria);
}
当您提交表单时,您的$_POST
数组将如下所示:
array(
'client' => 'any',
'services' => 1
);
请注意you do not want to use $_REQUEST
,除非您了解其填充顺序。
好的,所以您的$_POST
数组包含要添加到基本查询的条件:
$select = 'SELECT image_url, client, service from filter';
当您要使用Select选项中的固定值时,我不确定您使用LIKE
的原因,所以让我们仅将$_POST
数组转换为简单的WHERE
条件。由于您只需要基本查询可以接受的值,我们需要先进行一些过滤:
$criteria = array_filter(
filter_input_array(
INPUT_POST,
array(
'client' => FILTER_VALIDATE_INT,
'services' => FILTER_VALIDATE_INT
)
)
);
filter_input_array
将从'$ _POST'数组中提取客户端和服务的值,并检查它们的值是否为整数。 array_filter
函数负责删除验证失败的所有元素。对于上面的示例数组,$criteria
变量现在将包含
array(2) {
["services"]=>
string(1) "1"
}
正如您所看到的,'any'被剥离,因为它不是整数。很酷,因为现在你所要做的就是array_walk
它
if (!empty($criteria)) {
array_walk($criteria, function(&$val, $column) {
$val = sprintf('%s = %d', $column, $val);
});
$select .= ' WHERE ' . implode(' AND ', $criteria);
}
此代码看起来比实际复杂得多:如果$criteria
中有任何值,我们会将值覆盖为 columnname = value ,其中value只能是一个数字。你最终会得到
Array
(
[services] => services = 1
)
之后,我们将这些值附加到$select
imploding每个值AND
。
您的$select
变量将包含
SELECT image_url, client, service from filter WHERE services = 1
如果您的$_POST
数组包含例如:
$array = array(
'client' => '3',
'services' => 1,
);
结果$select
将是:
SELECT image_url, client, service from filter WHERE client = 3 AND services = 1
如果您的$_POST
数组包含两个“任意”值,$select
将只包含基本查询。
上面的代码段可以轻松扩展为包含其他条件。您只需要将允许的键添加到过滤器功能。只要条件值是数字,剩下的代码就会在$criteria
中使用任意数量的数组值。
如果您的需求变得更复杂,例如因为您需要在条件中添加OR
,LIKE
和IN
,请考虑使用查询构建器而不是手动编码(不是这很难)。
答案 1 :(得分:0)
例如,您可以尝试在SQL语句中添加更多代码。
if(!empty($services)){
$query .= " AND service='{$service}'";
}
答案 2 :(得分:0)
我为我的一个网站做过这个。这是我写的代码。
function select($sql)
{
if(isset($_SESSION['Search']))
{
$Search = $_SESSION['Search'];
unset($_SESSION['Search']); // Remove it right away
$visibleFields = $Search->getVisibleFields();
$keywords = $Search->getKeywords();
$sql .= " AND (";
for($i = 0; $i < count($keywords); ++$i)
{
for($j = 0; $j < count($visibleFields ); ++$j)
{
$sql .= $visibleFields[$j]. " LIKE '%$keywords[$i]%'";
$sql .= " OR ";
}
}
$sql= substr($sql, 0, -4) . ")";
}
if(isset($_POST['sortby']) && isset($_POST['sortby']) != null)
{
$sql .= " ORDER BY " . $_POST['sortby'];
}
$this->query($sql);
return $this->getAffectedRows();
}
我已经传递了一个关键字列表,然后您只需将它们附加到您的SQL查询中。对我来说就像一个魅力。这用于在已经返回的信息列表中进行搜索
答案 3 :(得分:0)
您需要修改查询。这是一个简单的例子:
$query = "SELECT * FROM filter WHERE ";
$query .= "client LIKE '".mysql_real_escape_string($_POST['client'])."%'";
if(!empty($_POST['services']){
$query .= " AND services LIKE '".mysql_real_escape_string($_POST['services'])."%'";
}
答案 4 :(得分:0)
尝试做类似
的事情if($client != "any"){
$client_query = "client LIKE '$client%'";
}
if($services != "any"){
$services_query = "services LIKE '$services%'";
}
if($client_query && $services_query){
$query = "WHERE $client_query AND $services_query";
}
elseif($client_query && !$services_query){
$query = "WHERE $client_query";
}
elseif(!$client_query && $services_query){
$query = "WHERE $services_query";
}
// DO THE SEARCH
$query = "SELECT * FROM filter $query";
如果两者都被选中,那么它将检索所有记录