Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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
Php 高级MySQL搜索帮助_Php_Mysql - Fatal编程技术网

Php 高级MySQL搜索帮助

Php 高级MySQL搜索帮助,php,mysql,Php,Mysql,我一直在想办法,但现在没用了。我的MySQL知识充其量只是初步的,因此我可以在以下方面使用一些指导: 我有两个表格“圣经”和“书”,我需要从中搜索。现在我正在用以下查询搜索“圣经”: SELECT * FROM bible WHERE text LIKE '%" . $query . "%' ORDER BY likes DESC LIMIT $start, 10 现在,我需要添加另一个部分来搜索一些非常高级的东西。以下是我想在伪代码中执行的操作,我知道它不起作用: S

我一直在想办法,但现在没用了。我的MySQL知识充其量只是初步的,因此我可以在以下方面使用一些指导:

我有两个表格“圣经”和“书”,我需要从中搜索。现在我正在用以下查询搜索“圣经”:

SELECT * 
  FROM bible 
 WHERE text LIKE '%" . $query . "%' 
 ORDER BY likes DESC 
    LIMIT $start, 10
现在,我需要添加另一个部分来搜索一些非常高级的东西。以下是我想在伪代码中执行的操作,我知道它不起作用:

SELECT * 
  FROM bible 
 WHERE books.book+' '+bible.chapter+':'+bible.verse = '$query'
$query相当于创世记1:2,创世记来自books.book,1来自bible.chapter,2来自bible.verse


非常感谢您在这方面提供的任何帮助/指导=

您需要首先用php将查询解析为书籍、章节和诗句

正则表达式应该可以工作:

preg_match("/(.+)([0-9]+):([0-9]+)/",$query,$matches);
$book    = trim(matches[1]); // use trim to remove extra spaces
$chapter = matches[2];
$verse   = matches[3];
然后,您的sql查询变成:

选择* 来自圣经 其中books.book='$book'和bible.chapter='$chapter'和bible.verse='$verse' -注意这里的sql注入!使用事先准备好的语句!
你很接近了。要连接字段,请使用CONCAT函数:

SELECT * FROM bible WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query'
您可以使用:


我不确定你的外键是什么将书籍链接到圣经,但这可能也需要规范。

我建议在你的应用程序代码中设计一种方法来分解该查询,以便你从关键字中分别搜索书籍、章节和诗句

这意味着您需要书籍、章节和诗篇的列与诗篇文本分开

您还应该使用,因为类似的通配符搜索是

下面是我如何使用PHP运行查询的:


我也希望在全文查询中使用一个参数,但MySQL不支持这一点。

请使用运行时得到的输出更新您的问题:DESC bible这应该是最后一个选项rtrimltrim$s=trim$s?我想,没有理由删减这场[0-9]+比赛:还有,这场比赛。在第一个模式中,子模式是贪婪的,所以它会吃掉所有东西。如果只需要字母,则可以执行\w+,或者。*?对于ungreedy匹配…贪婪在这里并不重要,因为第二个子模式将停止匹配。我已经测试过了。它起作用了。
SELECT * 
FROM bible JOIN books
WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query'
$quoted_query = $pdo->quote($query);
$sql = "SELECT * FROM bible 
        WHERE book = ? AND chapter = ? AND verse = ?
          AND MATCH(text) AGAINST ({$quoted_query})"
$stmt = $pdo->prepare($sql);
$stmt->execute(array($book, $chapter, $verse));