Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用php清理搜索查询_Php_Mysql - Fatal编程技术网

用php清理搜索查询

用php清理搜索查询,php,mysql,Php,Mysql,当用户在我的站点上搜索时,我获取get请求并对其执行mysql查询。我的原始代码如下所示:$q=$\u GET['q'] 现在urldecode正在为我添加斜杠,但我决定也使用santize字符串过滤器尝试filter_var 这是我使用$q=urldecode($\u GET['q'])时的sql: 这是我使用时的sql:q=filter\u var(urldecode($\u GET['q']),filter\u SANITIZE\u STRING) sql是完全相同的,但我得到不同的结果,

当用户在我的站点上搜索时,我获取get请求并对其执行mysql查询。我的原始代码如下所示:
$q=$\u GET['q']

现在urldecode正在为我添加斜杠,但我决定也使用santize字符串过滤器尝试filter_var

这是我使用
$q=urldecode($\u GET['q'])时的sql

这是我使用时的sql:
q=filter\u var(urldecode($\u GET['q']),filter\u SANITIZE\u STRING)

sql是完全相同的,但我得到不同的结果,我不知道为什么?仅使用urldecode从数据库返回正确的结果,但filter_var不返回任何结果(即使sql是相同的)

我想我的问题是,清理和搜索查询字符串的最佳方法是什么

$q = mysql_real_escape_string( stripslashes( $_GET['q'] ) );

不要试图清理数据

使用参数化查询


有关示例,请参见。

Urldecode是一个错误的函数-PHP将自动解码$\u GET中的任何变量,因此您不需要这样做,并且

人们经常谈论消毒输入,但我更喜欢考虑消毒输出

例如,消毒输入为:

$q = urldecode($_GET['q']);
$sql = "SELECT * FROM item WHERE title LIKE '%{$q}%'"

// later
echo "These items match '$q'";
和消毒输出:

$sql = "SELECT * FROM item WHERE title LIKE '%".mysql_real_escape_string($_GET['q'])."%'"

// later
echo "These items match '".htmlspecialchars($_GET['q']).'";
注意,在后一个示例中,我使用了不同的函数——一个用于将数据转换为mysql安全格式,另一个用于将数据转换为HTML安全格式。在知道如何处理数据之前,您无法知道要运行哪个函数


其他人提到了参数化查询。是的,这些都是尽可能安全的,可以避免意外错误,但不容易在一夜之间切换。

最好的变体是使用php清理过滤器,

将PDO与参数化查询一起使用-
stripslashes
仅在无法关闭magic quotes时才需要。@alex--谢谢@Staticsan——这很好,但我们不知道op的设置。请尝试以下操作:
$stripslashes=(get_magic_quotes_gpc()?“stripslashes”:创建函数('$f',返回$f;')然后您可以执行
$q=$stripslashes($\u GET['q'])
@Staticsan——这需要做更多的工作,而不需要做额外的编码。如果你不知道神奇引号的状态并且无法更改它,你真的没有什么选择。对于大多数LAMP开发人员来说,“准备好的语句”可能更像是敲响了警钟,参数化查询是imho不常用的行话。
$q = urldecode($_GET['q']);
$sql = "SELECT * FROM item WHERE title LIKE '%{$q}%'"

// later
echo "These items match '$q'";
$sql = "SELECT * FROM item WHERE title LIKE '%".mysql_real_escape_string($_GET['q'])."%'"

// later
echo "These items match '".htmlspecialchars($_GET['q']).'";