作者 主題: 不知問題出在哪, 搜尋資料欄位裡含有 %_ 的資料  (閱讀 4303 次)

0 會員 與 1 訪客 正在閱讀本文。

dwhtefr

  • 訪客
我盡可能將問題說簡單一點, 資料庫是 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 裡的 -
無視資料表裡 產品編號 欄位裡的 -
兩者來作比較

dwhtefr

  • 訪客
看來是我自己理解錯了   ::)

ESCAPE '-' 指的不是略過 - 這個符號的意思 =,=

是指自訂 - 這個符號來脫逸字元

即是在這一欄用 -' 來代替 \'