我在 Linux 上使用 Postgresql 9.2 和 PHP 5.5。我有一个包含“患者”记录的数据库,我正在网页上显示这些记录。这很好用,但现在我需要添加交互式过滤器,以便它根据用户使用的过滤器仅显示某些类型的记录,比如有 10 个复选框,我根据这些信息构建一个临时 WHERE 子句和然后实时重新运行查询。我有点不清楚如何做到这一点。
如何使用 PHP 来解决这个问题?
我在 Linux 上使用 Postgresql 9.2 和 PHP 5.5。我有一个包含“患者”记录的数据库,我正在网页上显示这些记录。这很好用,但现在我需要添加交互式过滤器,以便它根据用户使用的过滤器仅显示某些类型的记录,比如有 10 个复选框,我根据这些信息构建一个临时 WHERE 子句和然后实时重新运行查询。我有点不清楚如何做到这一点。
如何使用 PHP 来解决这个问题?
您需要做的就是使用 $_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 子句。
如果您的数据库中有多个字段要过滤,您需要做的就是注意如何将用户输入与您的字段匹配。
注意:出于实际原因,我没有在此处添加它...但是请清理用户输入。在查询中使用用户控制的数据之前,请始终清理用户输入。
祝你好运。
为此,我创建了一个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 的文档中找到更多信息。
不要进行字符串连接。获得值后,只需将它们传递给常量查询字符串:
$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
。
话虽如此,复选框将始终为真或假。您面临的确切问题是什么?
始终清理用户输入或使用驱动程序为您完成!