如何在 mysql 中搜索包含在 PHP 变量中的单词?
How to search in mysql for a word that contains in a PHP variable?
我有多个包含客户名称的变量,例如如下所示:
$customer = $row["customer_name"];
这将包含即:test Microsoft test test test
现在,在我的数据库中有 customer
列并且该列包含 Microsoft Netherlands Office
要查看数据库,我喜欢下面的内容,但没有给我任何结果:
$query="SELECT * FROM specific_req WHERE customer LIKE '%$customer%'";
我想在数据库 table 中搜索包含来自 $customer
.
的任何单词
您可以执行此操作的一种方法是将 $customer
变量拆分为一组搜索词,这样您就可以在 table.
中单独搜索每个词
$customer = "test Microsoft test test test";
$customers = explode(" ", trim($customer));
$queryString = "";
$customers = array_unique($customers);
foreach($customers as $c) {
$queryString .= "`customer` LIKE '%{$c}%' OR ";
}
$queryString = rtrim($queryString, " OR ");
$query = "SELECT * FROM specific_req WHERE {$queryString}";
echo $query;
这将使 $query
输出
SELECT * FROM specific_req WHERE `customer` LIKE '%test%' OR `customer` LIKE '%Microsoft%'
我们所做的只是使用 PHP 的 explode()
function, breaking your variable at every space character (After using trim()
to remove beginning and ending spaces to avoid searches like '%%'
). This gives us an array of values, which we then run through the foreach()
循环,构建 $queryString
以匹配所需的 SQL 语法。
警告:此解决方案可能容易受到SQL注入的攻击,这可以通过转义$c
循环内的变量。
您可以使用 fulltext search 即 MATCH AGAINST
。
$query="SELECT * FROM specific_req WHERE MATCH(customer) AGAINST ('$customer')";
要使全文正常工作,您必须在 customer
列上创建 FULLTEXT INDEX
。
ALTER TABLE specific_req ADD FULLTEXT KEY `idx_customer` (`customer`)
注意:消毒 $customer
以避免 sql 注入
在 PHP 和 运行 中构建替代匹配的正则表达式 SQL:
$customer = "(" . implode('|', array_unique(explode(' ', $customer))) . ")";
$sql = "SELECT * FROM specific_req WHERE customer REGEXP '{$customer}'";
我有多个包含客户名称的变量,例如如下所示:
$customer = $row["customer_name"];
这将包含即:test Microsoft test test test
现在,在我的数据库中有 customer
列并且该列包含 Microsoft Netherlands Office
要查看数据库,我喜欢下面的内容,但没有给我任何结果:
$query="SELECT * FROM specific_req WHERE customer LIKE '%$customer%'";
我想在数据库 table 中搜索包含来自 $customer
.
您可以执行此操作的一种方法是将 $customer
变量拆分为一组搜索词,这样您就可以在 table.
$customer = "test Microsoft test test test";
$customers = explode(" ", trim($customer));
$queryString = "";
$customers = array_unique($customers);
foreach($customers as $c) {
$queryString .= "`customer` LIKE '%{$c}%' OR ";
}
$queryString = rtrim($queryString, " OR ");
$query = "SELECT * FROM specific_req WHERE {$queryString}";
echo $query;
这将使 $query
输出
SELECT * FROM specific_req WHERE `customer` LIKE '%test%' OR `customer` LIKE '%Microsoft%'
我们所做的只是使用 PHP 的 explode()
function, breaking your variable at every space character (After using trim()
to remove beginning and ending spaces to avoid searches like '%%'
). This gives us an array of values, which we then run through the foreach()
循环,构建 $queryString
以匹配所需的 SQL 语法。
警告:此解决方案可能容易受到SQL注入的攻击,这可以通过转义$c
循环内的变量。
您可以使用 fulltext search 即 MATCH AGAINST
。
$query="SELECT * FROM specific_req WHERE MATCH(customer) AGAINST ('$customer')";
要使全文正常工作,您必须在 customer
列上创建 FULLTEXT INDEX
。
ALTER TABLE specific_req ADD FULLTEXT KEY `idx_customer` (`customer`)
注意:消毒 $customer
以避免 sql 注入
在 PHP 和 运行 中构建替代匹配的正则表达式 SQL:
$customer = "(" . implode('|', array_unique(explode(' ', $customer))) . ")";
$sql = "SELECT * FROM specific_req WHERE customer REGEXP '{$customer}'";