2012-08-25 46 views
0

我是Mysql Php的初学者。我想创建一个搜索框,它可以查找包含在mysql中搜索多个表的单词的行。我有一个脚本通过互联网,这是给出下面。当我键入多个单词时,它会显示具有最小搜索词的行。但我希望它只会显示搜索多个单词的行。请帮帮我。在Mysql中一次搜索多个单词php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd"> 
<html lang='en'> 
<head> 
<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=UTF-8'/> 
<title>Page title</title> 
<style type="text/css"> 
table { 
border-collapse: collapse; 
border: solid 1px black; 
} 
td { 
padding: 2px 6px; 
border: solid 1px black; 
} 
</style> 
</head> 
<body> 
<form action='<?php echo $_SERVER['PHP_SELF']; ?>' method='post'> 
<p>Search for: <input type='text' name='search' size='20' 
maxlength='64'></p> 
<p><input type='submit' value='Search'></p> 
</form> 
<?php 
if(isset($_POST['search'])) 
{ 
$connx = mysql_connect('localhost', '*****', '*****') or 
die("connx"); 
$db = mysql_select_db('test') or die(mysql_error()); 
# convert to upper case, trim it, and replace spaces with "|": 
$search = (ini_get('magic_quotes_gpc')) ? 
stripslashes($_POST['search']) : 
$_POST['search']; 
$search = mysql_real_escape_string($search); 
$search = strtoupper(preg_replace('/\s+/', '|', 
trim($_POST['search']))); 
# create a MySQL REGEXP for the search: 
$regexp = "REGEXP '[[:<:]]($search)[[:>:]]'"; 
$query = "SELECT * FROM `users` WHERE UPPER(`description`) $regexp 
OR ". 
"`name` $regexp"; 
$result = mysql_query($query) or die($query . " - " . 
mysql_error()); 
echo "<table>\n"; 
while($row = mysql_fetch_assoc($result)) 
{ 
echo "<tr>"; 
foreach($row as $key => $value) 
{ 
echo "<td>$value</td>"; 
} 
echo "</tr>\n"; 
} 
} 
?> 
</body> 
</html> 
+0

只是一个旁注,'mysql_' [将会过时](http://news.php.net/php.internals/53799)。替代品是'mysqli'和'PDO' – codingbiz

回答

3

这里有一个选项:

$search = explode(" ", $_POST['search']); 
$description = ""; 
$name = ""; 
foreach($search AS $s) 
{ 
    $description .= "`description` LIKE '%".mysql_real_escape_string($s)."%' AND "; 
    $name .= "`name` LIKE '%".mysql_real_escape_string($s)."%' AND "; 
} 

$description = substr($description, 0, -4); 
$name = substr($name, 0, -4); 

$query = "SELECT * FROM `users` WHERE ($description) OR ($name)"; 

如果您的搜索长期是像“医生约翰”你的查询看起来像这样:

SELECT * FROM `users` WHERE (`description` LIKE '%Doctor%' AND `description` LIKE '%John%') OR (`name` LIKE '%Doctor%' AND `name` LIKE '%John%') 

这明显使两个词在描述或名称字段中的要求。 这就像你在找什么?请参阅PDO library PHP。 mysql_函数太老了,不再被视为标准。他们会工作,但你应该升级。

+0

非常感谢你。 –

+0

当我点击搜索按钮与空白搜索框,它显示整个列完全。如何避免它? –

+0

把整个搜索处理放在一个if语句中... if(trim($ _ POST ['search'])!=''){...} –

0

我不是很确定你想要说些什么,但在这里,我想你想:

$words = explode(" ", $_POST["search"]); 
$sql = "SELECT * FROM `users` WHERE "; 
$where = array(); 
foreach ($words as $word) { 
    $where[] = "UPPER(`description`) LIKE '%".mysql_real_escape_string($word)."%'"; 
} 
$sql .= implode(" OR ", $where); 
$result = mysql_query($sql); 
+0

好帖子。我刚刚更改了$ sql。= implode(“AND”,$ where); –

+0

如何在此代码中使用LIMIT 0,20? –