2014-09-21 45 views
0

我開始了與:準備MySQL的語句上,像

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE ?")or die($db->error); 

不工作,並且不會返回任何行。試圖深入它,並來到:

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE CONCAT('%', ?, '%')")or die($db->error); 

但也沒有喜樂。已經在全部大寫和常規框中嘗試了我的參數。沒有不同。如何結合這三個?

+1

向我們展示您嘗試匹配的示例數據。 – 2014-09-21 00:48:30

+0

也許並沒有真正的結果:p所提供的代碼是不夠的,你應該多發一些 – Ghost 2014-09-21 01:02:18

+0

你的第一個準備聲明已經足夠好了。除非在創建時不包含引號'LIKE'%SOMECHARACTERS%'' – andrex 2014-09-21 01:09:23

回答

0

您需要通過等作爲包裹%的變量:

$val = '%some-value%'; 
$q = $db->prepare("SELECT id, name FROM this_table WHERE UPPER(name) LIKE ?"); 
$q->bindValue(1, $val); 
0

問:如何這三個結合起來?

答:有沒有在你的問題知道你在觀察什麼樣的行爲(準備與錯誤消息失敗,執行與錯誤消息失敗的足夠的信息,執行是成功的,但取不返回任何或者正在返回意想不到的行......我們只是在猜測

你發佈的兩條SQL語句的語法看起來都是有效的(從提供的信息來看,我們沒有辦法驗證標識符,數據類型,特權等)

我們注意到,如果name列是使用不區分大小寫的collat​​i開(即以_ci結尾的字符集和客戶端字符集不區分大小寫,則可能不需要使用UPPER()函數,但它是有效的。 (我們在這裏猜測,name列被定義爲VARCHAR列,但同樣這只是一個猜測。

爲了保持一致,我們希望LIKE比較的兩邊都會被包裹在UPPER()函數...

SELECT t.id 
    , t.name 
    FROM `this_table` t 
WHERE UPPER(t.name) LIKE UPPER(?) 
     ^^^^^    ^^^^^ 

如果你期待的通配符匹配,其中「ABCD」的name值將匹配「BC」,那麼你需要在你的bindParam提供的值將包括通配符字符

如果您提供的值只是'bc',那麼您可以包含t他在第二個示例中顯示了通配符字符,其中CONCAT函數和文字'%'字符。

SELECT t.id 
    , t.name 
    FROM `this_table` t 
WHERE UPPER(t.name) LIKE CONCAT('%', UPPER(?), '%') 
     ^^^^^       ^^^^^ 

除此之外,我們只是猜測您所觀察到的行爲與您提供的信息。