2011-10-07 94 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)); 

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