1

我在 Linux 上使用 Postgresql 9.2 和 PHP 5.5。我有一个包含“患者”记录的数据库,我正在网页上显示这些记录。这很好用,但现在我需要添加交互式过滤器,以便它根据用户使用的过滤器仅显示某些类型的记录,比如有 10 个复选框,我根据这些信息构建一个临时 WHERE 子句和然后实时重新运行查询。我有点不清楚如何做到这一点。

如何使用 PHP 来解决这个问题?

4

3 回答 3

1

您需要做的就是使用 $_POST 或 $_GET 接收用户选择的过滤器的所有数据,然后使用循环创建一个小函数,以按照查询需要的方式连接所有内容。

像这样的东西......在这种情况下,您的数据库中只有一个字段可以匹配。这是一个简单的场景,您需要添加更多字段,以便在每种情况下添加您真正需要的字段,没什么太复杂的。

<?php 

//recieve all the filters and save them in array

$keys[] = isset($_POST['filter1'])?'$_POST['filter1']':'';  //this sends empty if the filter is not set.
$keys[] = isset($_POST['filter2'])?'$_POST['filter2']':''; 
$keys[] = isset($_POST['filter3'])?'$_POST['filter3']':''; 


//Go through the array and concatenate the string you need. Of course, you might need AND instead of OR, depending on what your needs are.
foreach ($keys as $id => $value) {
    if($id > 0){
       $filters.=" OR ";
    }
    $filters.=" your_field = '".$value."' ";
}

//at this point $filters has a string with all your 

//Then make the connection and send the query. Notice how the select concatenates the $filters variable

$host = "localhost"; 
$user = "user"; 
$pass = "pass"; 
$db = "database"; 

$con = pg_connect("host=$host dbname=$db user=$user password=$pass")
    or die ("Could not connect to server\n"); 

$query = "SELECT * FROM table WHERE ".$filters; 

$rs = pg_query($con, $query) or die("Cannot execute query: $query\n");

while ($row = pg_fetch_row($rs)) {
  echo "$row[0] $row[1] $row[2]\n";

  //or whatever way you want to print it...
}

pg_close($con); 

?>

上面的代码将从发送 3 个变量的表单中获取变量(假设它们都对应于数据库中的 SAME 字段,并生成一个字符串用作 WHERE 子句。

如果您的数据库中有多个字段要过滤,您需要做的就是注意如何将用户输入与您的字段匹配。

注意:出于实际原因,我没有在此处添加它...但是请清理用户输入。在查询中使用用户控制的数据之前,请始终清理用户输入。

祝你好运。

于 2013-04-05T07:00:27.267 回答
0

为此,我创建了一个Where 子句生成器。它与 Pomm 项目一起提供,但您可以单独使用它。

<?php

$where = Pomm\Query\Where::create("birthdate > ?", array($date->format('Y-m-d')))
    ->andWhere('gender = ?', array('M'));

$where2 = Pomm\Query\Where::createWhereIn('something_id', array(1, 15, 43, 104))
    ->orWhere($where);

$sql = sprintf("SELECT * FROM my_table WHERE %s", $where2);

$statement = $pdo->prepare($sql);
$statement->bind($where2->getValues());

$results = $statement->execute();

这样,您的值就会被转义,您可以动态构建 where 子句。您将在Pomm 的文档中找到更多信息。

于 2013-04-06T14:35:53.980 回答
0

不要进行字符串连接。获得值后,只需将它们传递给常量查询字符串:

$query = "
    select a, b
    from patient
    where
        ($x is not null and x = $x)
        or
        ('$y' != '' and y = '$y')
";

如果用户未通知该值,则将其传递为 null 或空。在上面的查询中,x = $x如果为空,则条件将被忽略,如果$x为空,则y = '$y'条件将被忽略$y

话虽如此,复选框将始终为真或假。您面临的确切问题是什么?

始终清理用户输入或使用驱动程序为您完成!

于 2013-04-05T12:17:50.863 回答