2011-10-07 57 views
0

我想让我们的搜索模块能够搜索像* lex这样的关键字。用*代替之前的字母。我发现添加到我的查询中的%不起作用并返回错误。请帮我看看我的代码。谢谢如何在MYSQL查询中函数返回值前后添加%

if(substr($searchfirst_name, 0, 1) == '*'){ 
    $subquery .= " AND first_name LIKE %".Formatter::sql($searchfirst_name); 
}elseif(substr($searchfirst_name, -1, 1) == '*'){ 
    $subquery .= " AND first_name LIKE ".Formatter::sql($searchfirst_name)."%"; 
}else{ 
    $subquery .= " AND first_name LIKE ".Formatter::sql($searchfirst_name); 
} 

我认为问题是因为函数Formatter :: sql()。它过滤变量并向其添加斜线。我如何修改或创建一个新的功能来做到这一点?

public static function sql($value, $fieldName = false) { 
if($fieldName) { 
    return '`' . $value . '`'; 
} 
else if(is_string($value)) { 
    return '\'' . addslashes($value) . '\''; 
} 
else if($value === null) { 
    return 'NULL'; 
} 
else if($value === true) { 
    return 1; 
} 
else if($value === false) { 
    return 0; 
} 
else if(is_numeric($value)) { 
    return $value; 
} 
else { 
    return '\'' . addslashes($value) . '\''; 
} 

}

+0

你有一个'Formatter :: sql'文档或它的代码的链接吗?您需要查看是否有其他参数不能自动包含引号。 – webbiedave

+0

我的猜测是这样的错误:'你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,在'%' – webbiedave

回答

1

你必须使用引号,我认为:
LIKE '%...'LIKE '...%'

编辑:
那么,错误现在很清楚:
查询运行使用格式是像.... LIKE %'....'这是完全错误的。
当您使用LIKE子句不使用格式化程序,而是直接使用$searchfirst_name

+0

正确的附近使用正确的语法。没有引号,你只是得到一个语法错误。 –

+0

@AlexHu:你能告诉我们'Formatter :: sql($ searchfirst_name)'的输出吗? – Marco

+0

@AlexHu:无论如何,你应该用引号括起LIKE参数... – Marco

0

试试这个

if(substr($searchfirst_name, 0, 1) == '*'){ 
    $subquery .= " AND first_name LIKE '%".Formatter::sql($searchfirst_name)."'"; 
}elseif(substr($searchfirst_name, -1, 1) == '*'){ 
    $subquery .= " AND first_name LIKE '".Formatter::sql($searchfirst_name)."%'"; 
}else{ 
    $subquery .= " AND first_name LIKE '".Formatter::sql($searchfirst_name)."'"; 
} 
+0

由于函数Formatter :: sql() –

+0

它不起作用您可以存储Formatter :: sql($ searchfirst_name )在一个变量中,然后尝试将其置于查询中。 –

0

前两个看起来不错,但其他第三个不能像。见下文。

if(substr($searchfirst_name, 0, 1) == '*'){ 
    $subquery .= " AND first_name LIKE %".Formatter::sql($searchfirst_name); 
}elseif(substr($searchfirst_name, -1, 1) == '*'){ 
    $subquery .= " AND first_name LIKE ".Formatter::sql($searchfirst_name)."%"; 
}else{ 
    $subquery .= " AND first_name = ".Formatter::sql($searchfirst_name); 
} 
0

只要做到:

if(substr($searchfirst_name, 0, 1) == '*'){ 
    $subquery .= " AND first_name LIKE ".Formatter::sql('%'.$searchfirst_name); 
}elseif(substr($searchfirst_name, -1, 1) == '*'){ 
    $subquery .= " AND first_name LIKE ".Formatter::sql($searchfirst_name.'%'); 
}else{ 
    $subquery .= " AND first_name LIKE ".Formatter::sql($searchfirst_name); 
} 

这工作,因为在Formatter::sql逃生功能不会影响德 '%'

在你sql功能,与数据库提供的逃生更换addslashes功能,例如mysql_real_escape_string。总是使用数据库机制来转义字符串(或者更好的是,使用带有PDO的参数化查询)。

0

您有一个%字符串引号之外,你可能需要摆脱的*字符太

所以不是全部,如果contruct:

$subquery .= " AND first_name LIKE ".str_replace('*','%',Formatter::sql($searchfirst_name)); 

,但要注意这给替代的功能*在字符串中的任何地方

相关问题