Php 选择*like with masked compare

Php 选择*like with masked compare,php,mysqli,Php,Mysqli,我必须通过数据库搜索类似的$字符串。引用字符串中的“?”表示任何字符,因此必须忽略此字符,但所有其他字符必须匹配 引用$string='abcd?efg'将与$stringb='abcdXefg'或$stringc='abcd1efg'匹配。mySQL如何选择。。。看起来像 $string = 'abcd?efg'; $row = $mysqli->query("SELECT * FROM $table WHERE String LIKE '$string'"); $result

我必须通过数据库搜索类似的$字符串。引用字符串中的“?”表示任何字符,因此必须忽略此字符,但所有其他字符必须匹配

引用$string='abcd?efg'将与$stringb='abcdXefg'或$stringc='abcd1efg'匹配。mySQL如何选择。。。看起来像

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

您可以像这样使用正则表达式:

$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.
这将在两个组之间获得一个字符,可以是任何字符。从:

“.”匹配任何单个字符


LIKE中的1字符通配符是u,因此使用str_replace替换?与uu


您正在寻找正则表达式吗?$string='abcd_efg';。_u是1个字符的通配符。我想你想要的是一个角色。如果更多,请使用%.这将匹配abcde或efg,但与abcdeXefg.Ack不匹配,您是对的@Barmar。我太专注于起点和终点了,所以跳过了。已更新。无法使用下划线。你能把你的代码扩展一点吗。如何检查$result是否为NULL?我是这样做的:在数据库上有一个引用字符串,例如“abcd\u efg”。在查询中,我输入要比较的字符串,例如“abcd1efg”,这必须匹配。我不确定为什么它对您不起作用,请参阅此演示:。要知道查询是否找到了任何内容,请检查$stmt->num_rows-阅读MySQLI文档以了解完整的详细信息。
$like_string = str_replace('?', '_', $string);
$stmt = $mysqli->prepare("SELECT * FROM $table WHERE String LIKE ?");
$stmt->bind_param("s", $like_string);
$stmt->execute();