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参数。
答案 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, '\\');