0

假设您有一个这样的搜索表单:

<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 中的过滤器,他们可以而不是返回搜索表单。

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

4

7 回答 7

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';
?>
于 2013-09-17T06:18:56.197 回答
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';
?>
于 2013-09-17T06:20:52.630 回答
1

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

$condition = isset($_GET['filter']) ? 'WHERE value='.mysql_real_escape_string($_GET['filter']) : ''; 
于 2013-09-17T06:24:34.163 回答
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';
}
于 2013-09-17T06:17:51.537 回答
0

简单,不安全的解决方案。

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

请注意,上述解决方案(以及此线程中提供的大多数其他解决方案)容易受到 SQL 注入的影响,您应该改用 PDO

这是使用 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();

?>

于 2013-09-17T06:17:52.130 回答
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';
?>
于 2013-09-17T06:18:42.150 回答
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 注入持开放态度。

于 2013-09-17T06:19:53.273 回答