如何在MYSQL查询中的函数返回值之前和之后添加%

时间:2011-10-07 20:02:15

标签: php mysql

我想让我们的搜索模块能够搜索像* 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) . '\'';
}

}

5 个答案:

答案 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));

但请注意,这提供了在字符串

中替换*的功能