Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL&;PHP:多关键字搜索_Php_Mysql - Fatal编程技术网

MySQL&;PHP:多关键字搜索

MySQL&;PHP:多关键字搜索,php,mysql,Php,Mysql,我有一个包含逗号分隔关键字的字符串。例如: $keywords = 'keyword1, keyword2, keyword3'; 我的表模式名为tbl\u address,如下所示(简化): 假设我必须在PHP中使用MySQLi(而不是PDO) 以下是我目前的做法: $result = array(); $keyword_tokens = explode(',', $keywords); foreach($keyword_tokens as $keyword) { $keyword =

我有一个包含逗号分隔关键字的字符串。例如:

$keywords = 'keyword1, keyword2, keyword3';
我的表模式名为
tbl\u address
,如下所示(简化):

假设我必须在PHP中使用
MySQLi
(而不是
PDO

以下是我目前的做法:

$result = array();
$keyword_tokens = explode(',', $keywords);
foreach($keyword_tokens as $keyword) {
  $keyword = mysqli_real_escape_string(trim($keyword));
  $sql = "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%'";
  // query and collect the result to $result
  // before inserting to $result, check if the id exists in $result.
  // if yes, skip.
}
return $result;
这种方法有效,但性能低下。如果有很多关键字,它会进行很多查询


我的问题是,有没有更好的方法来实现同样的目标?i、 e.返回包含任何关键字的地址的所有记录的最简单方法是什么?

最好的方法是使用全文搜索

如果您不想使用全文,您可以使用或在您的WHERE条件下使用

SELECT * FROM tbl_address WHERE address LIKE '%$keyword%' OR adress LIKE '%$keyword2%'

最好的方法就是创建搜索字符串WHERE子句,将其附加到查询中并运行一次

$result = array();
$keyword_tokens = explode(',', $keywords);
$where = '';$i=0
foreach($keyword_tokens as $keyword) {
  $where.= " address LIKE'%".mysqli_real_escape_string(trim($keyword))."%' OR ";
}
  // trim last OR with substr_replace
  substr_replace($where, "OR", -1, 1);
  $sql = "SELECT * FROM tbl_address WHERE $where";

return $result;

Hi使用union创建查询并在循环结束时执行

$result = array();
$keyword_tokens = explode(',', $keywords);
$sql = '';
foreach($keyword_tokens as $keyword) {
  $keyword = mysqli_real_escape_string(trim($keyword));
  if (!empty($sql)) $sql .= " UNION "; 
  $sql .= "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%'";
  // query and collect the result to $result
  // before inserting to $result, check if the id exists in $result.
  // if yes, skip.
}

在这里执行查询。

您只需要一个“或”,其他什么都不需要

<?php

$result = array();
$keyword_tokens = explode(',', $keywords);
$keyword_tokens = array_map('mysqli_real_escape_string', $keyword_tokens);

$sql = "SELECT * FROM tbl_address WHERE address LIKE'%";
$sql .= implode("%' or address LIKE '%", $keyword_tokens) . "'";

// query and collect the result to $result
// before inserting to $result, check if the id exists in $result.
// if yes, skip.

return $result;
进行单个查询

$keywordary = explode(',', $keywords);
foreach($keywordary as $keyword) {
  $keys = trim($keyword);
    $other .=" or address like '%$keys%'";
}
$sql = "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%' $other";

execute query;
return $result;

一个简单的
REGEXP
可能就是你想要的。你必须检查它对你自己有多有效


从tbl_地址中选择*字段REGEXP'keyword1 | keyword2 | keyword3'

请尝试WHERE IN子句:

$keyword = (array)explode(',', $keywords);
for($i=0;$i=count($keyword);$i++){
   $keyword[$i]=mysqli_real_escape_string(trim($keyword[$i]),'\'" ');
}
//This is what I suggest.
$query='SELECT * FROM tbl_address WHERE address IN ("'.implode('","',$keyword).'")';

已在MySQL 5.1上成功测试。

这可以帮助您:将“LIKE”和“IN”结合起来:@Shivian说真的,您为什么不使用我的REGEXP单行程序?如果关键字包含正则表达式关键字,查询将失败,或生成意外结果,例如关键字=
“|=|=|”
当然可以,这是您的问题;)这种方法有两个警告。不能使用LIKE语法,也不修剪关键字…不过你错过了
$sql
后面的一个引号。+1,这正是我要找的,我还学习了一个新的
MySQL
字符串函数!回答得很好,这帮助我解决了一周的研究问题,并帮助我跳过了30%的问题:)这不是
$other.=“
而不是
$other=“
在你的循环中吗?否则,将取消每个循环中的
子句。
<?php

$result = array();
$keyword_tokens = explode(',', $keywords);
$keyword_tokens = array_map(
    function($keyword) {
        return mysqli_real_escape_string(trim($keyword));
    }, 
    $keyword_tokens
);

$sql = "SELECT * FROM tbl_address WHERE address LIKE'%";
$sql .= implode("%' OR address LIKE '%", $keyword_tokens) . "'";

// query and collect the result to $result
// before inserting to $result, check if the id exists in $result.
// if yes, skip.

return $result;
$keywordary = explode(',', $keywords);
foreach($keywordary as $keyword) {
  $keys = trim($keyword);
    $other .=" or address like '%$keys%'";
}
$sql = "SELECT * FROM tbl_address WHERE address LIKE'%$keyword%' $other";

execute query;
return $result;
$keyword = (array)explode(',', $keywords);
for($i=0;$i=count($keyword);$i++){
   $keyword[$i]=mysqli_real_escape_string(trim($keyword[$i]),'\'" ');
}
//This is what I suggest.
$query='SELECT * FROM tbl_address WHERE address IN ("'.implode('","',$keyword).'")';