假设您有一个类似的搜索表单:
<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来准备和执行,但这与问题无关,因此我没有提供它
答案 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持开放态度。