2013-04-05 25 views
1

我在Linux上使用Postgresql 9.2和PHP 5.5。我有一个带有“耐心”记录的数据库,并且在网页上显示记录。这很好,但现在我需要添加交互式过滤器,因此它将只显示某些类型的记录,具体取决于用户所使用的过滤器,例如有10个复选框,我根据这些信息构建临时WHERE子句,然后实时重新运行查询。我有点不清楚该怎么做。为PHP的Postgresql查询构建交互式WHERE子句

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

+0

让我举一个更具体的例子。假设我有一些复选框,用户可以在查询中选择一个或多个作为过滤器元素。复选框可能是“红色”,“绿色”和/或“蓝色”,因此用户可以过滤查看大型文本框中显示的任何或所有这些类型的记录。我的问题是这样的:如何在PHP中使用这些复选框选择事件来调用查询的重新执行?这是我不知道如何处理的部分。 – 2013-04-06 00:38:05

回答

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个变量(假设他们都对应于同一领域中您的数据库的表单变量,使一个字符串作为您的WHERE子句。

如果使用你有你的数据库来过滤通过的多个字段,所有你需要做的是要小心你如何在用户输入与您的域匹配

注:我没有在这里添加它实际的原因...但请您请清理用户输入信息。在使用用户控制的数据在您的查询之前,请始终清理用户输入信息。

祝你好运。

0

不要做字符串连接。一旦你的价值观只是将它们传递到不断查询字符串:

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

如果该值不是由用户通知把它作为空。在上述查询中,如果$x为空,则x = $x条件将被忽略,如果$y为空,则y = '$y'条件将被忽略。

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

总是消毒用户输入或使用驱动程序为您做到这一点!

+0

在数据库记录中,存在哪个站点,哪个患者,哪个医生等进入了该域。我试图让用户从表格中选择一组编程选项来选择要过滤的字段和值。这样就不需要消毒输入。 我不知道该怎么做才能让用户在选择一个过滤器时(从列表中选择),这会在同一页面上再次触发查询。 PHP为这种类型的事件使用什么连接/设置? – 2013-04-05 18:16:30

+0

@Jon _这样就不需要消毒input_。是的,当然有。 _这会引发查询_您的疑问与HTML和一小部分JavaScript有关。重写你的问题。 – 2013-04-06 15:37:14

0

我为此创建了一个Where clause builder。它配备了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's documentation找到更多的信息。