2010-02-18 95 views
1

我有四个搜索字段用于搜索数据库中的书籍ID:s,然后回显结果。根据您选择从sql查询中搜索的所选字段,您可以在下面的代码中看到。标题和isbn字段工作正常,但当我尝试使用作者或类别字段没有得到返回。相关数据库表格也可以在下面看到。也许有什么问题,我使用SQL函数LIKE?使用LIKE和通配符搜索数据库

数据库:

CREATE TABLE IF NOT EXISTS `bok` (
    `bokId` int(11) NOT NULL AUTO_INCREMENT, 
    `bokTitel` varchar(100) DEFAULT NULL, 
    `upplaga` varchar(100) DEFAULT NULL, 
    `ISBN` varchar(30) DEFAULT NULL, 
    PRIMARY KEY (`bokId`) 
) 

CREATE TABLE IF NOT EXISTS `skrivenav` (
    `bokId` int(11) DEFAULT NULL, 
    `fId` smallint(6) DEFAULT NULL 
) 

CREATE TABLE IF NOT EXISTS `forfattare` (
    `fId` smallint(6) NOT NULL, 
    `fNamn` varchar(80) DEFAULT NULL, 
    PRIMARY KEY (`fId`) 
) 

CREATE TABLE IF NOT EXISTS `bokkat` (
    `bokId` int(11) DEFAULT NULL, 
    `katId` smallint(6) DEFAULT NULL 
) 

CREATE TABLE IF NOT EXISTS `kategori` (
    `katId` smallint(6) NOT NULL, 
    `katNamn` varchar(80) DEFAULT NULL, 
    PRIMARY KEY (`katId`) 
) 

PHP代码:

<?php  
$q = "SELECT DISTINCT bokId FROM "; 
if($_GET['search_title']!=""||$_GET['search_ISBN']!=""){ 
    $q = $q."(SELECT * FROM bok WHERE "; 
    if($_GET['search_title']!="") 
     $q = $q."bokTitel LIKE '%$_GET[search_title]%' "; 
    if($_GET['search_title']!="" && $_GET['search_ISBN']!="") 
     $q = $q."AND "; 
    if($_GET['search_ISBN']!="")  
     $q = $q."ISBN LIKE '%$_GET[search_ISBN]%' "; 
    $q = $q.") AS F"; 
} 
else $q = $q."bok";       
if($_GET['search_author']!=""){ 
    $author = explode(",", $_GET['search_author']); 
    $auth = ""; 
    foreach ($author as $value){ 
     $auth = $auth . "%" . $value . "%', '"; 
    } 
    $auth = trim($auth, ", '"); 
    $q = $q." NATURAL JOIN (SELECT * FROM skrivenav NATURAL JOIN forfattare WHERE fNamn LIKE ('$auth')) AS S "; 
} 
if($_GET['search_category']!="") { 
    $category = explode(",", $_GET['search_category']); 
    $cat = "'"; 
    foreach ($category as $value){ 
     $cat = $cat . "%" . $value . "%', '"; 
    } 
    $cat = trim($cat, ", '"); 
    $q = $q." NATURAL JOIN (SELECT * FROM bokkat NATURAL JOIN kategori WHERE katNamn LIKE ('$cat')) AS K "; 
} 
$rs = mysql_query($q); 
confirm_query($rs);  
while($row = mysql_fetch_row($rs)){ 
    echo $row[0]."<br />"; 
} 
?> 

与作者字段进行搜索时生成的查询: SELECT DISTINCT bokId FROM书 自然连接(SELECT * FROM skrivenav NATURAL JOIN for fattare 其中fNamn LIKE('%Jonas%','%Alex%'))作为S

从anthares答案快速解决方案,它的工作,所以谢谢你!

如果($ _ GET [ 'search_author'] = “”!){

$author = explode(",", $_GET['search_author']); 

$auth = ""; 

$q = $q. " NATURAL JOIN (SELECT * FROM skrivenav NATURAL JOIN forfattare WHERE fNamn LIKE "; 

foreach ($author as $value){ 

    $auth = $auth . "%" . $value . "%'"; 

    $q = $q. "'$auth OR "; 

    $auth = ""; 

} 

$q = trim($q, " OR"); 

$q = $q. ") AS A"; 

}

+0

请发布导致错误结果的生成查询。这将使它更容易帮助。 – 2010-02-18 10:50:33

回答

1

我觉得这一段代码:

foreach ($author as $value){ 

    $auth = $auth . "%" . $value . "%', '"; 

} 
$auth = trim($auth, ", '"); 

$q = $q." NATURAL JOIN (SELECT * FROM skrivenav NATURAL JOIN forfattare WHERE fNamn LIKE ('$auth')) AS S "; 

会返回一个结果只有当您按照写入的确切顺序作为真实作者的值子集传递时才是如此。所以这个查询不检查乱码作者的名字。

与类别相同的东西。

您应该在过滤器中的每个类别或作者的where子句中添加一个“或”,并为每个类别或作者分别创建一个表达式。