我想让我们的搜索模块能够搜索像* lex这样的关键字。用*替换之前的字母。我发现我添加到查询中的%不起作用并返回错误。请帮我看看我的代码。感谢
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 :(得分:1)
我必须使用引号我认为:
LIKE '%...'
或LIKE '...%'
<强>编辑:强>
那么,错误很明显:
使用格式化程序运行查询就像.... LIKE %'....'
一样,这是完全错误的
当您使用LIKE
子句时,请不要使用格式化程序,而是直接使用$searchfirst_name
!!
答案 1 :(得分: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)."'";
}
答案 2 :(得分: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);
}
答案 3 :(得分: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使用参数化查询)。
答案 4 :(得分:0)
你有一个%的字符串引号,你可能还需要摆脱*字符
因此,如果构成,则不是整体:
$subquery .= " AND first_name LIKE ".str_replace('*','%',Formatter::sql($searchfirst_name));
但请注意,这提供了在字符串
中替换*的功能