MySQL报价转义仍然返回错误

时间:2014-03-04 20:05:09

标签: mysql escaping quote

SELECT * FROM `entries` WHERE MATCH(`title`) AGAINST('Linux\'s')

您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“s”附近使用正确的语法

我没有最清楚的想法,为什么在报价转义时这个错误仍然存​​在。

PS:上层查询适用于 phpMyAdmin

class SmalllightSearch extends Smalllight {

        //----- SEARCH BY FIELD VALUE -----\\
        public function searchByFieldValue($field, $value, $smart = true, $limit = NULL, array $orderby = NULL) {
            $value = mysql_real_escape_string($value);
            $entries = array();
            $q = "SELECT * FROM `".$this->table."` WHERE MATCH (`$field`) AGAINST ('$value')";
            echo $q;

            if($orderby != NULL) {
                $list = array();
                foreach($orderby as $k => $v) { array_push($list, '`'.$k.'` '.$v); }
                $order = implode(', ', $list);
                $q .= ' ORDER BY '.$order;
            }
            if($limit != NULL) { $q .= ' LIMIT '.$limit; }

            $r = mysql_query($q) or die(mysql_error());
            while($row = mysql_fetch_assoc($r)) {
                array_push($entries, $row);
            }

            if($smart == true) {
                $right = new Smalllight('right');
                $wrong = new Smalllight('wrong');
                $words = str_word_count($value, 1);

                foreach($words as $word_key => $word_value) {
                    $find_right = $right->findByFieldValue('value', $word_value);

                    if($find_right == false) {
                        $find_wrong = $wrong->findByFieldValue('value', $word_value);

                        if($find_wrong == true) {
                            $pair_right = $right->findById($find_wrong[0]['right_id']);
                            $words[$word_key] = $pair_right['value'];
                        }
                        else {
                            $pattern_right = $right->findByPattern('value', $word_value, 5, array('occur' => 'DESC'));

                            if($pattern_right == true) {
                                foreach($pattern_right as $pattern_key => $pattern) {
                                    similar_text($word_value, $pattern['value'], $similar);

                                    if($similar >= 70 && $word_value !== $pattern['value']) {
                                        $wrong->setValue('right_id', $pattern['id']);
                                        $wrong->setValue('value', $word_value);
                                        $wrong->store();
                                        $words[$word_key] = $pattern['value'];
                                    }
                                }
                            }
                        }
                    }
                }
                $meaning = implode(' ', $words);
                if($meaning != $value) {
                    $link = implode('+', $words);
                    echo 'Did you mean: <a href="index.php?search='.$link.'">'.$meaning.'</a><br/>';
                }
                return $entries;
            }

            elseif($smart == false) {
                return $entries;
            }
        }
}

这就是我执行它的方式:

if($_GET['search']) {
        $slight = new SmalllightSearch('entries');
        $entries = $slight->searchByFieldValue('title', $_GET['search']);
        if($entries == true) {
            foreach($entries as $entry) {
                echo '<b>'.$entry['title'].'</b><br/>'.$entry['body'].'<br/><br/>';
            }
        }
        else {
            echo '<br/>No results found for: <b>'.$_GET['search'].'</b>';
        }
    }

之前无需回显,因为未设置limit和orderby参数。

3 个答案:

答案 0 :(得分:2)

它显然在php中不起作用,因为\'被视为转义序列,因此它被php解析。

所以你也需要逃避斜线

AGAINST('Linux\\\'s')

PS:如果您使用预处理语句或至少正确使用的mysql客户端提供的转义函数 - 这不会是一个问题。

答案 1 :(得分:0)

这是PHP代码(部分内容):

public function searchByFieldValue($field, $value, $smart = true, $limit = NULL, array $orderby = NULL) {
            $value = mysql_real_escape_string($value);
            $entries = array();
            $q = "SELECT * FROM `".$this->table."` WHERE MATCH (`$field`) AGAINST ('$value')";
            echo $q;

这是输出:

SELECT * FROM entries WHERE MATCH(title)AGAINST('Linux \'s')你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“s”附近使用正确的语法

答案 2 :(得分:-1)

问题解决了,我需要在str_word_count()函数中添加'\',这样才能识别\作为单词的一部分。

$words = str_word_count($value, 1, '\\');