用于查询的定义的搜索项

对于搜索功能,我编写了一个MySQL查询,由PHP脚本执行。 我没有进行全文搜索。 相反,我正在使用以下方法进行搜索:

... WHERE field LIKE '%etc%' AND field REGEXP '[[:<:]]etc[[:>:]]'

现在,我的想法是在PHP中准备这些动态值,如:

$word = '2*3%5_1^0'; // just an example

$wordLike = strtr($word,array(''=>'\','%'=>'%','_'=>'_'));
// instead of my old solution:
// $wordLike = preg_replace('~([%_])~', '\$1', $word);
$wordLike = $db_con->escape('%' . $wordLike . '%');

$spaces = '[[:blank:]]|[[:punct:]]|[[:space:]]';
// I'm not sure about the difference between blank & space, though

$wordRX = preg_quote($word);
$wordRX = $db_con->escape('(^|'.$spaces.')'.$wordRX.'($|'.$spaces.')');
// instead of my old solution:
// $wordRX = $db_con->escape('[[:<:]]' . $wordRX . '[[:>:]]');

然后使用这些值,如...

... WHERE field LIKE '$wordLike' AND field REGEXP '$wordRX'

其中,这个例子的输入结果

...
WHERE field LIKE '%2*3%5_1^0%' AND
field REGEXP '[[:<:]]2*3%5_1^0[[:>:]]`

几个笔记...

  • 在我的实际代码中,我正在处理多个单词,这只是伪代码。
  • 我用来搜索单词的方法 - 与LIKEREGEXP一起 - 是我尝试的方法中最快的一个。
  • 我知道我应该使用PDO,请不要输入任何关于它的东西,除非它与我的问题有关
  • 问题1:这是否正确?
    Q2:这对SQL注入来说足够安全吗?


    一些额外的信息

    关于MySQL REGEXP ...

    通过preg_quote()转义以下字符

    + *? [^] $(){} =! <> | : -

    以下是REGEXP中[偶尔]特殊字符的列表

    + *? [^] $(){} | -

    REGEXP中还有其他的构造,但它们都被单/双括号包围,并且因为我知道所有的括号都会被preg_quote()转义,所以我觉得我不应该关心它们。

    关于MySQL LIKE ...

    LIKE中只有2个特殊字符

    _%

    所以逃避它们似乎已经足够解决问题了。
    如果我缺少任何东西,请纠正我。


    从你提到的mysql_real_escape_string()函数中,Appart应该对SQL注入进行消毒处理。

    您只需使用适当的转义函数正确地转义任何用户输入,如果您将其视为处理此用户输入的链式处理块,您将知道按何种顺序(从上次到第一次)以及何时转义/ unescape以及何时,只要确保一个干净的输入(确认是一个不同的问题),你应该没问题。

    而且,正如您似乎已经知道的那样,PDO或Mysqli prepare()中的quote()是更好的方法。


    试试这个使用mysql_real_escape_string()

    $word = '2*3%5_1^0';
    
    $query = 'SELECT * FROM TABLE_NAME WHERE field REGEXP "(.*)[[:<:]]'.mysql_real_escape_string($word).'[[:>:]](.*)" ';
    

    function clean($str) {
        $str = @trim($str);
        if(get_magic_quotes_gpc()) {
            $str = stripslashes($str);
        }
        return mysql_real_escape_string($str);
    }
    

    然后:

    $word = clean($_POST['whatever post']);
    

    然后修剪词和你的好去。 这个php函数的作用是将所有文字转化为字符串,因此没有人可以说删除你的db等

    链接地址: http://www.djcxy.com/p/62581.html

    上一篇: defined search term(s) for query

    下一篇: Multiple Methods in one Controler in ASP.Net WebAPI