Поиск в базе данных с использованием LIKE и групповых символов - PullRequest
1 голос
/ 18 февраля 2010

У меня есть четыре поля поиска, которые используются для поиска в базе данных по идентификаторам книг, а затем выводят результат. В зависимости от того, какое поле вы выбираете для поиска, SQL-запрос создается, как вы можете видеть в приведенном ниже коде. Поле title и isbn работают нормально, но когда я пытаюсь использовать поле автора или категорию, ничего не возвращается. Соответствующие таблицы базы данных также можно увидеть ниже. Может быть, что-то не так с тем, как я использую функцию sql 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 />";
}
?>

Сгенерированный запрос при поиске по автору: ВЫБЕРИТЕ DISTINCT bokId С бок ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ СКРИВЕНАВ ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ forfattare ГДЕ fNamn LIKE («% Jonas%», «% Alex%»)) AS 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";
* *} Тысяча двадцать-один

1 Ответ

1 голос
/ 18 февраля 2010

Я думаю, что этот кусок кода:

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 для каждой категории или автора в вашем фильтре и сделать отдельное выражение для каждой из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...