2017-04-07 83 views
0

想建立一個設備數據庫searchpage,我有一份聲明這需要一個設備「標籤」(總是需要),並搜索在六個不同的數據字段的關鍵詞,其中'tag'匹配用戶輸入。結合LIKE並在PHP的MySQLi準備好的語句

的問題是,沒有結果發現如果關鍵字是這些可能是長字段的IN一個,所以很多預期的結果丟失。

在常規的SQL我只是表加入並添加LIKE查詢到IN查詢;但與mysqli我使用?佔位符的準備聲明,並不確定可以做什麼關於每個變量多次使用此標記。

我必須聲明是這樣的:

if (!($stmt = $conn->prepare("SELECT * FROM equipment 
    WHERE EQUIP_CND LIKE ? 
    AND (EQUIP_TYP LIKE ? OR ((EQUIP_SER LIKE ? OR EQUIP_PNO LIKE ?) 
     OR (EQUIP_LOC LIKE ? OR EQUIP_CMT LIKE ?)));"))) { 
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error; 
} 

而且我想只是LIKE IN取代LIKE。如何實現這一目標?

+0

你並不需要所有這些嵌套的括號。只是'AND(x像?或y像?或z像...?)' – Barmar

+0

你是什麼意思「如果關鍵字是在這些長字段之一」?它們是逗號分隔的列表嗎? – Barmar

+0

爲什麼你認爲你不能在準備好的聲明中做一個'JOIN'? – Barmar

回答

0

like要求wildcards具有寬鬆的匹配。

例如

select * from table where a like 'b' 

是一樣的:

select * from table where a = 'b' 

所以b記錄會被發現,但abc不會。

manual

有了這樣你可以在模式中使用以下兩種通配符:

匹配任何數目的字符,甚至零個字符。

_匹配一個字符。

因此,要找到abc你會使用:

select * from table where a like '%b%' 

準備語句通配符獲得附加到變量,或在綁定,而不是在查詢本身。 PDO手冊頁上的示例6顯示了這一點。 http://php.net/manual/en/pdo.prepared-statements.php#example-991(註釋// placeholder must be used in the place of the whole value後)