2017-01-09 77 views
1

我们已经创建了一个搜索字段,您可以在其中搜索配料并查找配方。 现在你只能输入1种成分:如何创建多个单词搜索? SQL

if (isset($_POST['search'])) { 
$searchquery = $_POST['search']; 


$query = mysql_query("SELECT * FROM opskrifter WHERE id IN 
(SELECT opskrifterid FROM ingredienser WHERE ing_name IN ('$searchquery'))") or die("search failed"); 

我们希望能够通过与“”或这样的事情,分离该成分,以搜索多个成分相同的搜索领域。

有没有简单的方法来实现这一点?

编辑: 我们试图使用爆炸这样没有成功。

$searchTerms = explode(' ', $searchquery); 
$searchTermBits = array(); 
foreach ($searchTerms as $term) { 
if (!empty($term)) { 
    $searchTermBits[] = "ing_name '$term'"; 
}} 

... 
$result = mysql_query("SELECT * FROM opskrifter WHERE id IN (SELECT * FROM WHERE ".implode(' AND ', $searchTermBits))); 

谢谢! :)

+0

尝试爆炸你$ searchquery并进行多个查询。 –

+0

你能举个例子吗?我们试图使用爆炸,但是我们根本没有得到任何结果.. @ t-n-y –

+0

不要使用'mysql_ *'。出于充分的理由,它们在版本7中被删除。 – apokryfos

回答

1

你可以简单地让用户键入他的值逗号分隔,输入将几乎在正确的查询语法。您只需在值的周围添加分号,因为您在表中搜索字符串。

您可以使用PHP的str_replace() - 功能:

$vals = $_POST['search']; 
$valsFormatted = "'" . str_replace(",", "','", $vals) . "'"; 

在这段代码中,你替换在orderto逗号加分号之前和他们背后的输入的所有逗号包装用分号输入的所有值。您还必须在字符串的开头和结尾添加一个。将上述函数中的第一个逗号替换为您希望用户使用的值分隔的字符。

之后,您可以将您的查询简单地更改为以下:

$query = "SELECT * FROM opskrifter WHERE id IN 
(SELECT opskrifterid FROM ingredienser WHERE ing_name IN ('$valsFormatted'))"; 

请也被告知,你的代码像这样很容易为SQL Injections!查看this链接了解如何防止此问题。

+0

不要在你输入逗号分隔值时不工作... 也许还有别的东西我们错过了? –

+0

我更新了答案,我认为它是缺少的分号......是不是答案,请向我们展示您的表格布局(您可以使用'DESC opskrifter;'在您的数据库shell中执行此操作)。 – Andy

+0

谢谢你! <3现在作品 –

1

像这样的简单的声明将工作:

$array = implode("','",explode($_POST['search'], ",")); 
$query = mysql_query("SELECT * FROM opskrifter WHERE id IN (SELECT opskrifterid FROM ingredienser WHERE ing_name IN ({$array}))") or die("search failed"); 

首先炸掉你的搜索,然后爆它(甚至可能不需要这么做)。之后确保数组被用作'in'运算符作为字符串/数组。

有关它的更多信息,你可以看这个问题:PHP/MySQL using an array in WHERE clause


从我的本地机器的工作拷贝是这样的;

$_POST['search'] = "0, 1, 2"; 

$array = implode ("','", explode (",", $_POST['search'])); 
$query = mysql_query("SELECT * FROM users WHERE id IN ('$array')") or die(mysql_error()); 
var_dump ($array); 
var_dump ($query); 
var_dump ("SELECT * FROM users WHERE id IN ('$array')"); 
var_dump (mysql_fetch_array ($query)); 

实际上没有回报用户,所以如果我们想借此例子,它改变了代码,这将是(查询,至少):

$query = mysql_query("SELECT * FROM opskrifter WHERE id IN (SELECT opskrifterid FROM ingredienser WHERE ing_name IN ('$array'))") or die(mysql_error()); 

待办事项注意的也改变了$ array变量。

+0

当我们使用这个时,我们仍然得到“搜索失败”.. –

+0

奇怪..可能想改变内爆到这样的事情; implode(“%','%”,explode(“,”,$ _POST ['search']))。注意我如何改变爆炸的顺序,也会更新问题。 – Tosfera

+0

当我们使用mysql_error()时,我们得到错误消息“未知列”。 它解释我们的搜索词是一列... –

1

首先,你需要从搜索字段来阵列将文本转换:

$string = $_POST['search']; 
$array = explode('"' , $string); 

所以,如果你把搜索:test"hello"hi

阵列将是:

1 => test, 
2 => hello, 
3 => hi 

之后,您需要使用SQL格式:

WHERE column_name IN (value1,value2,...) 

所以,你需要改变,我们已经创建了这个格式的字符串数组:

$string = implode(',',$array); 

所以$串的回音是:

test,hello,hi 

和SQL将是:

WHERE column_name IN ($string)