SELECT * FROM `entries` WHERE MATCH(`title`) AGAINST('Linux\'s')
您的SQL语法中有错误;检查与您的MySQL Server版本相对应的手册,以获取正确的语法
我没有最模糊的想法,为什么当报价被逃脱时此错误仍然存在。
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>';
}
}
以前无需回声,因为未设置限制和订单参数。
显然在PHP中不起作用,因为
\'
AGAINST('Linux\\\'s')
PS:如果您使用已准备好的语句或至少使用正确使用的逃生功能,则您的MySQL客户端提供了 - 这不是问题。
这是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;
这是输出:
entries
title
)与('linux \'s')您在sql语法中有一个错误;检查与您的MySQL Server版本相对应的手册,以获取正确的语法
问题已经解决,我需要在str_word_count()函数中添加'\',以便将\识别为单词的一部分。
$words = str_word_count($value, 1, '\\');