使用没有参数的GET

时间:2013-09-17 06:13:04

标签: php get

假设您有一个类似的搜索表单:

<form action="<?php $_PHP_SELF ?>" method="GET">
Some filter:
<select name="filter">
<option value="">Any value</option>
<option value="1">value is 1</option>
etc...
</select>
<input type="submit" value="Search">
</form>

,您的索引页面如下所示:

<?php 
if($_GET['filter']){

$sql = 'SELECT * FROM table WHERE value=' . $_GET['filter'];
/* prepare, execute blah blah blah etc etc etc */

include 'results.php';
exit();
}
include 'searchform.php';
?>

如果设置了过滤器,这将非常有效。但如果不是,我希望它显示所有结果,而只是将页面保留在搜索表单上。如果我将其更改为if($_GET['filiter'] or $_GET['filter'] == ""){它(逻辑上)只是获得未过滤的所有结果并忽略搜索表单。任何解决方案?

注意: 我知道我可以设置一个隐藏的输入类型,如<input type="hidden" name="hidden" value="true">,而不是使用if($_GET['hidden'] == 'true'){检查过滤器,但它会在URL中显示,我不希望这样。我也不想只使用POST,因为那时过滤器将不可见,我宁愿如果有人想要更改URL中的过滤器而不是返回搜索表单。 / p>

注意2 我使用PDO来准备和执行,但这与问题无关,因此我没有提供它

7 个答案:

答案 0 :(得分:1)

<?php 
if(isset($_GET['filter'])){

$sql = 'SELECT * FROM table';
if ($_GET['filter'] != "") { $sql .= ' WHERE value=' . $_GET['filter'];
/* prepare, execute blah blah blah etc etc etc */

include 'results.php';
exit();
}
include 'searchform.php';
?>

答案 1 :(得分:1)

将表单更改为(为任意值添加all

<form action="<?php $_PHP_SELF ?>" method="GET">
Some filter:
<select name="filter">
<option value="all">Any value</option>
<option value="1">value is 1</option>
etc...
</select>
</form>

在PHP中

<?php 
if(isset($_GET['filter'])){

if($_GET['filter'] == 'all'){
 $sql = "SELECT * FROM table";
}else{
 //make sure the input is safe
 $value = intval($_GET['filter']);
 if($value < 1){
   die("SQL injection");
 }
 $sql = "SELECT * FROM table WHERE value=$value";
}

/* prepare, execute blah blah blah etc etc etc */

include 'results.php';
exit();
}
include 'searchform.php';
?>

答案 2 :(得分:1)

Steven Liao的解决方案非常适合您。 并且是通过在查询中转义$ _GET ['filter']来处理sql注入。 喜欢

$condition = isset($_GET['filter']) ? 'WHERE value='.mysql_real_escape_string($_GET['filter']) : ''; 

答案 3 :(得分:0)

根据您的要求,即:

“如果设置了过滤器,效果会非常好。但如果不是,我希望它能显示所有结果”

  if(isset($_GET['filter'])){

$sql = 'SELECT * FROM table WHERE value=' . $_GET['filter'];
/* prepare, execute blah blah blah etc etc etc */

}else {
$sql = 'SELECT * FROM table';
}

答案 4 :(得分:0)

简单,不安全解决方案。

$condition = isset($_GET['filter']) ? ' WHERE value='.$_GET['filter'] : ''; // assuming $_GET['filter'] is safe
$sql = 'SELECT * FROM table'.$condition.';';

请注意上述解决方案(以及此主题中提供的大多数其他解决方案)is vulnerable to SQL injections and that you should be using PDO instead

以下是使用PDO的安全解决方案:

$pdo_obj = new PDO(/*connection parameters*/);
$condition = isset($_GET['filter']) ? ' WHERE value=:filter' : ''; // no need for assumptions
$sql = 'SELECT * FROM table'.$condition.';';
$sth = $pdo_obj->prepare($sql);
$sth->bindParam(':filter', $_GET['filter']);
$sth->execute();
$result = $sth->fetchAll();

&GT;

答案 5 :(得分:0)

<?php 
$sql = 'SELECT * FROM table';
if($_GET['filter']!="")
$sql.=' WHERE value=' . $_GET['filter'];

// prepare, execute blah blah blah etc etc etc

include 'results.php';
exit();
}
include 'searchform.php';
?>

答案 6 :(得分:0)

尝试类似:

$sql = 'SELECT * FROM table';

if(!empty($_GET['filter']))
     $sql .= ' WHERE value=' . (int) $_GET['filter']; //at the very least, cast this as int.

/* prepare, execute blah blah blah etc etc etc */

include 'results.php';

如果您没有以某种方式清理用户输入,那么您对SQL injection持开放态度。