2015-03-30 74 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