-1

我根据 url 动态创建用于执行的 sql 语句。我这样做:

URL (using htaccess):
`http://www.example.com/us/california/sanjose`

Which translates to:
`http://www.example.com/index.php?country=US&state=california&sub=sanjose`

Then, in my script I do:
$sql = 'select * from table where';

if(isset($_GET['country'])){
$sql .= ' country='.$_GET['country'];  
} else {
$sql .= ' country=US';  
}

if(isset($_GET['state'])){
$sql .= ' and state='.$_GET['state'];  
}

if(isset($_GET['sub'])){
$sql .= ' and sub='.$_GET['sub'];  
}

//PDO
execute $SQL

我就是这样做的。有没有更好、更清洁的方法来做到这一点?根据 url 即时创建 sql 语句?你会怎么做这样的事情?

4

3 回答 3

1

除了容易受到 SQL 注入的影响之外,您如何执行此操作也没有任何问题。

要防止 SQL 注入,请使用准备好的语句:

 $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
 $stmt->bindParam(':name', $name);
 $stmt->bindParam(':value', $value);

具体来说,'bindParam' 方法通过正确转义查询中的值来防止 SQL 注入。

http://php.net/manual/en/pdo.prepared-statements.php

于 2013-06-29T04:29:42.453 回答
0

看看http://j4mie.github.io/idiormandparis/

Idiorm 是一个流畅的查询构建器,上面的代码将变为:

$query = ORM::for_table('table_name')

if(isset($_GET['country'])){
    $query->where_equal('country', $_GET['country']);
} else {
    $query->where_equal('country', 'US');
}

if(isset($_GET['state'])) {
    $query->where_equal('state', $_GET['state']);
}

if(isset($_GET['sub'])) {
    $query->where_equal('sub', $_GET['sub']);
}

$results = $query->find_many();

最重要的是使用准备好的语句,因此您可以正确转义关闭上面发布的代码中的一个大安全漏洞。(用于 sql 注入的谷歌)

于 2013-06-29T04:31:54.107 回答
0

如果您使用 MySQL,请使用mysqli_real_escape_string 。

于 2013-06-29T04:41:07.140 回答