2011-09-19 123 views
3
function sql_like_expression($expression) 
{ 
    $expression = utf8_str_replace(array('_', '%'), array("\_", "\%"), $expression); 
    $expression = utf8_str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression); 

    return $this->_sql_like_expression('LIKE \'' . $this->sql_escape($expression) . '\''); 
} 

我不確定這個函數在做什麼。從我所看到的,我認爲它取代_\_雖然我不確定這是否是什麼正在發生。爲什麼它是array's和%是什麼意思? 乾杯。PHP幫助解釋函數

回答

4

在SQL LIKE表達式中,_裝置任何單個字符,和%手段任何字符

  • 逸出%_字符以除去它們的特殊含義(添加\他們除去它們的特殊含義之前)
  • 第二行反轉義,是由一個preceeded的%_字符的第一行NULL字節(char(0))。

在str_replace中使用數組允許一次執行多個替換。

+0

謝謝你的解釋 –

2

%和_用於SQL語句中,它們是通配符。 %匹配任何一組字符,而_匹配單個字符。

有\%意味着它不會匹配任何字符,它會轉義它,所以它現在是一個文字,同樣也是_。

+1

今天我才知道_是單個字符的通配符。 – jasonbar

2

這是一個非常可靠和不可靠的SQL轉義方法。找到誰寫了這些,並用一條臭魚粘魚幾個小時。

總之,它做1:1更換兩個陣列的:

_ -> \_ 
% => \% 

,然後用字符串,其中有(由於某種原因)之前的原始字符串的臨界值的NULL字符是相同的。

+1

你可能應該向班級解釋爲什麼它很可靠/不可靠。 – webbiedave

+0

謝謝你的回答。幫助我很多。我同意webbiedave雖然 –

+1

它不會逃避'\'字符。當'%'被'\%s'替換時,''foo \%'''變成''foo \\%「''。結果''%'實際上沒有逃脫。此外,它假定該字符串不能包含惡意的NULL。 – arnaud576875