Php 如何扩大类似MySQL的查询的范围?
我正在基于本教程构建一个简单的实时搜索: 对于类似这样的查询,它只需一个词: 或者对于包含单词的一部分的查询: 或者对于两个单词或部分单词同时出现在搜索结果中的查询: 但如果我搜索两个不相邻的单词,查询将失败: 如何修改查询,以便搜索结果中任何位置出现的任意数量的关键字 例如,如果我的数据库有一条记录,例如:Php 如何扩大类似MySQL的查询的范围?,php,mysql,Php,Mysql,我正在基于本教程构建一个简单的实时搜索: 对于类似这样的查询,它只需一个词: 或者对于包含单词的一部分的查询: 或者对于两个单词或部分单词同时出现在搜索结果中的查询: 但如果我搜索两个不相邻的单词,查询将失败: 如何修改查询,以便搜索结果中任何位置出现的任意数量的关键字 例如,如果我的数据库有一条记录,例如:敏捷的棕色狐狸跳过了懒狗 如果我搜索:quick jumps dog或dog over而不仅仅是quick brown或fox jumps等等,我希望返回一个结果 我在想,如果我的查询中有多
敏捷的棕色狐狸跳过了懒狗
如果我搜索:quick jumps dog
或dog over
而不仅仅是quick brown
或fox jumps
等等,我希望返回一个结果
我在想,如果我的查询中有多个单词,就将其分解,然后将我的$search\u string
放入一个关键字数组,以便MySQL
进行查询,但我不知道这是否是最好的方法
查询:
// Get Search
$search_string = preg_replace("/[^A-Za-z0-9]+[.]/", " ", $_POST['query']);
$search_string = $tutorial_db->real_escape_string($search_string);
// Check Length More Than One Character
if (strlen($search_string) >= 1 && $search_string !== ' ') {
// Build Query
$query = 'SELECT * FROM search WHERE subsection LIKE "%'.$search_string.'%" OR def LIKE "%'.$search_string.'%" OR exception LIKE "%'.$search_string.'%" ORDER BY subsection ASC';
完整代码:
<?php
/************************************************
The Search PHP File
************************************************/
/************************************************
MySQL Connect
************************************************/
// Credentials
$dbhost = "localhost";
$dbname = "livesearch";
$dbuser = "live";
$dbpass = "search";
// Connection
global $tutorial_db;
$tutorial_db = new mysqli();
$tutorial_db->connect($dbhost, $dbuser, $dbpass, $dbname);
$tutorial_db->set_charset("utf8");
// Check Connection
if ($tutorial_db->connect_errno) {
printf("Connect failed: %s\n", $tutorial_db->connect_error);
exit();
}
/************************************************
Search Functionality
************************************************/
// Define Output HTML Formating
$html = '';
$html .= '<li class="result">';
$html .= '<a target="_blank" href="urlString">';
$html .= '<h2><b> codeString - yearString - chapterString - sectionString - SUBHERE</b></h1>';
$html .= '<h3>defString</h3>';
//try to add exception string
$html .= '</br><h3>exceptionString</h3>';
$html .= '</a>';
$html .= '</li>';
// Get Search
$search_string = preg_replace("/[^A-Za-z0-9]+[.]/", " ", $_POST['query']);
$search_string = $tutorial_db->real_escape_string($search_string);
// Check Length More Than One Character
if (strlen($search_string) >= 1 && $search_string !== ' ') {
// Build Query
//$query = 'SELECT * FROM search WHERE function LIKE "%'.$search_string.'%" OR name LIKE "%'.$search_string.'%"';
$query = 'SELECT * FROM search WHERE subsection LIKE "%'.$search_string.'%" OR def LIKE "%'.$search_string.'%" OR exception LIKE "%'.$search_string.'%" ORDER BY subsection ASC';
// Do Search
$result = $tutorial_db->query($query);
while($results = $result->fetch_array()) {
$result_array[] = $results;
}
// Check If We Have Results
if (isset($result_array)) {
foreach ($result_array as $result) {
// Format Output Strings And Hightlight Matches
//$display_function = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['function']);
//$display_name = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['name']);
//$display_url = 'http://php.net/manual-lookup.php?pattern='.urlencode($result['function']).'&lang=en';
// Format Output Strings And Hightlight Matches
//Format code - ex IBC
$display_code = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['code']);
//Format year - ex 2012
$display_year = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['year']);
//Format Chapter - ex Means Of Egress
$display_chapter = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['chapter']);
//Format Section - ex Stairs
$display_section = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['section']);
//Format sub Section - ex 1009.4 width
$display_sub = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['subsection']);
//$display_subsection = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['subsection']);
$display_def = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['def']);
$display_exception = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['exception']);
$display_url = 'http://php.net/manual-lookup.php?pattern='.urlencode($result['code']).'&lang=en';
// Insert Name
$output = str_replace('nameString', $display_name, $html);
//Insert Code
$output = str_replace('codeString', $display_code, $output);
//Insert Year
$output = str_replace('yearString', $display_year, $output);
//Insert Chapter
$output = str_replace('chapterString', $display_chapter, $output);
// Insert Section
$output = str_replace('sectionString', $display_section, $output);
// Insert Sub Section
$output = str_replace('SUBHERE', $display_sub, $output);
// Insert Defenition
$output = str_replace('defString', $display_def, $output);
// Insert exceptions
$output = str_replace('exceptionString', $display_exception, $output);
// Insert URL
$output = str_replace('urlString', $display_url, $output);
// Output
echo($output);
}
}else{
// Format No Results Output
$output = str_replace('urlString', 'javascript:void(0);', $html);
$output = str_replace('nameString', '<b>No Results Found.</b>', $output);
$output = str_replace('functionString', 'Sorry :(', $output);
// Output
echo($output);
}
}
?>
对WHERE语句使用括号表示2个以上的参数
$query = 'SELECT * FROM search WHERE (subsection LIKE "%'.$search_string.'%" OR def LIKE "%'.$search_string.'%" OR exception LIKE "%'.$search_string.'%") ORDER BY subsection ASC';
对于每个单词,都有@iamde\u coder建议的LIKE%word%或LIKE%word2%
etc结构
按照@fred ii的建议使用
使用专门的搜索服务器,根据语言分割单词,去除停止词等。例如或
正如其他人所指出的,您需要为搜索中的每个单词使用LIKE
条件
因此,作为解决问题的第一种方法,请按如下方式拆分您的输入:
$search_string = 'jump lazy dog';
$search_terms = explode(' ', $search_string);
$query = 'SELECT *
FROM search
WHERE ';
foreach($search_terms as $term) {
$query .= '(subsection LIKE "%'.$term.'%" OR def LIKE "%'.$term.'%" OR exception LIKE "%'.$term.'%") AND ';
}
$query = substr($query, 0, -4).'ORDER BY subsection ASC';
echo $query;
这将生成您需要的查询:
SELECT *
FROM search
WHERE (subsection LIKE "%jump%" OR def LIKE "%jump%" OR exception LIKE "%jump%")
AND (subsection LIKE "%lazy%" OR def LIKE "%lazy%" OR exception LIKE "%lazy%")
AND (subsection LIKE "%dog%" OR def LIKE "%dog%" OR exception LIKE "%dog%")
ORDER BY subsection ASC
(我添加了换行符和缩进,只是为了便于阅读。)
然而,这里有一个巨大的问题:由于SQL注入的风险,这是非常不安全的。您需要使用来防止这种情况。请参阅,以了解解决此问题的各种方法。您可能需要研究一下。全文搜索似乎不像那样返回部分匹配。如果我查询“代码> NIC < /代码>,我不会像<代码> Goo> 那样得到结果。考虑和使用<代码>,比如'%$SigCHYSHIGH字符串\ <代码>或<代码>,比如'$SalkChyStx%%'/Cuth>。我尝试了一下,但是它没有起到任何作用。这里的概念是什么?概念是它实际上使用了2个以上的参数,如果没有括号,它只会跟在前2个参数后面,不会更多。这只允许它使用您想要的所有参数@Artjom Kurapov给了我比我更多的选择。如果在数据库中有多个搜索按钮来搜索特定列,可能会更为有利。1是多少。应该起作用吗?我尝试了iamde_coder的示例,但是它给出了与我的查询相同的结果。谢谢,效果很好。我唯一的问题是什么时候会变慢或会变慢?在某个时候会变慢,但这取决于您拥有的数据量、搜索词的复杂性等。例如,即使是一个简单的数据库,a b c d e f
对于您正在进行的搜索类型来说,也是一个有点复杂的字符串。知道的唯一方法是测试它;如果它开始成为一个问题,您可能需要开始重新组织您的数据,进行一些复杂的缓存,或者以其他方式获得创造性。除非有很多行,否则99.9%的查询都不会有问题。