PHP标准过滤器

时间:2012-01-30 19:56:10

标签: php mysql

我正在构建基于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  "&nbsp;";
                  echo "<b>Services: </b>";
                  echo $row["services"];
                  echo "<br>";
                  echo "<br>";

            }
            ?>

5 个答案:

答案 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中使用任意数量的数组值。

如果您的需求变得更复杂,例如因为您需要在条件中添加ORLIKEIN,请考虑使用查询构建器而不是手动编码(不是这很难)。

答案 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";

如果两者都被选中,那么它将检索所有记录