2015-03-30 79 views
0

我必須通過DB搜索像$string s。一個 '?'在參考字符串中表示任何字符,所以這個字符必須被忽略,但所有其他字符必須匹配。select * like with masked compare

參考$string ='abcd?efg'將匹配$stringb ='abcdXefg'$stringc = 'abcd1efg'。 mySQL「Select ...」是怎麼樣的?

$string = 'abcd?efg';  
$row = $mysqli->query("SELECT * FROM $table WHERE String LIKE '$string'"); 
$result = $row->fetch_assoc(); 
print_r(json_encode($result)); 
+1

你在尋找正則表達式嗎? – bloodyKnuckles 2015-03-30 21:13:37

+1

'$ string ='abcd_efg';'。 '_'是1個字符的通配符。我假設1個字符是你以後的。如果更多,請使用'%'。 – 2015-03-30 21:14:24

回答

0

你可以使用正則表達式是這樣的:

$string = 'abcde?efg'; 
$searchGroup = explode('?', $string);  
$row = $mysqli->query("SELECT * FROM $table WHERE String REGEXP '^" . $searchGroup[0].".".$searchGroup[1]."$'"); // starts with abcde and ends with efg and allows one character between the groups. 

這將讓兩組之間的一個角色,它可以是任何字符。從docs

「。」匹配任何單個字符。

+0

這將匹配'abcde'或'efg',它不會匹配'abcdeXefg'。 – Barmar 2015-03-30 21:49:47

+0

Ack,你是對的@Barmar。我非常專注於我忽略的起點和終點。更新。 – 2015-03-31 11:33:22

0

的1字符通配符在LIKE_,所以使用與str_replace_更換?

$like_string = str_replace('?', '_', $string); 
$stmt = $mysqli->prepare("SELECT * FROM $table WHERE String LIKE ?"); 
$stmt->bind_param("s", $like_string); 
$stmt->execute(); 
+0

它不能與Underscore一起使用。你能擴展一下你的代碼嗎?你將如何檢查$ result是否爲NULL?我做了如下:在DB上有引用字符串例如。 'abcd_efg'。與查詢我輸入字符串比較例如。 'abcd1efg'這個必須匹配。 – user2500308 2015-03-31 10:38:35

+0

我不確定爲什麼它不適用於您,請參閱此演示:http://www.sqlfiddle.com/#!9/67e92/1。要判斷查詢是否發現任何內容,請檢查'$ stmt-> num_rows' - 閱讀MySQLI文檔以獲取完整的詳細信息。 – Barmar 2015-03-31 17:27:40