我盡可能將問題說簡單一點, 資料庫是 utf-8
例如有一個 資料表 如下:
id | 名稱 | 產品編號 |
1 | 張三 | CE_222 |
2 | 李_四 | LE-223 |
上面的資料都是實際要顯示在網頁上
當我在網頁上只輸入一個符號
_ 然後按搜尋, 開始進入 php 產生 sql 語法
其他程式碼省略掉 ......
$keyword = mysqli_real_escape_string($link, $keyword); // 因應 mysql 自己語系在特殊字元前加上 \
$keyword = addcslashes($keyword , '%_'); // 在這 2 個符號前加上 \ , 轉為實體文字
$keyword = preg_replace('#^(\*)#', '', $keyword); // 刪掉開始的 * 號
$keyword = preg_replace('#(\*)$#', '', $keyword); // 刪掉最後的 * 號
$keyword = str_replace('*', '%', $keyword); // 網頁上輸入 * 即是代表 sql 語法裡的 %
$sql = SELECT * FROM 資料表
WHERE (名稱 LIKE '%$keyword%')
OR (REPLACE(產品編號, '-', '') LIKE '%$keyword%' ESCAPE '-');
這時出來的 sql 語法會變成, 看似是一個很正常的語法吧 =,=
SELECT * FROM 資料表
WHERE (名稱 LIKE '%\_%')
OR (REPLACE(產品編號, '-', '') LIKE '%\_%' ESCAPE '-')
為甚麼出來的結果只有 id:2
難度我錯誤理解 REPLACE() ,....ESCAPE 的用法
用這個語法的原因是想在搜尋 產品編號 欄位時,
無視我所輸入的 keyword 裡的
-無視資料表裡 產品編號 欄位裡的
-兩者來作比較