2014-01-17 3 views
0

У меня есть база данных, где я есть названиеMultiple PHP поисковый запрос

Titles 
Celeste from the moon 
Sweet Dreams Tomorrow 
Time machine from past 

Теперь, когда я делаю запрос поиска для ключевого слова позволяет сказать «Celeste из», то она показывает мне, что я хочу, т.е. Celeste от луны. Однако, если я изменю свой запрос на «celeste the moon», то это не покажет мне никаких результатов.

Это мой сценарий запроса

 if(!empty($_REQUEST['string'])) 
{ 
     $search_string = " title LIKE %".mysql_real_escape_string($_REQUEST["string"])."%'"; 
     $query = mysql_query("SELECT * FROM products WHERE ".$search_string); 

     $row = mysql_num_rows($query) or die(mysql_error()); 

     $row = $row; 

     $cur_page = $_GET['page']; 
     $cur_page = ($cur_page < 1)? 1 : $cur_page; 
     $offset = ($cur_page-1)*$per_page;     

     $pages = ceil($row/$per_page);    

     $start = (($cur_page - $num_links) > 0) ? ($cur_page - ($num_links - 1)) : 1; 
     $end = (($cur_page + $num_links) < $pages) ? ($cur_page + $num_links) : $pages; 

     $res = mysql_query("SELECT * FROM products WHERE ".$search_string." ORDER BY title LIMIT ".$per_page." OFFSET ".$offset); 

     while($row=mysql_fetch_array($res)) 
     { 
     include ('include/form.php'); 
     } 

    } 

Я пробовал различные способы, но только не в состоянии получить желаемые результаты.

+0

Сначала начните использовать mysqli, чтобы узнать о функциях mysql, а затем поговорим. –

+0

совершенно новый для php. потребуется время для проверки mysqli – user3077454

ответ

1

Сначала вы разделить строку поиска

$words = explode(' ',$_REQUEST['string']); 

затем с помощью операции ИЛИ в выберите

$query='SELECT * FROM `products` WHERE `title` LIKE '; 
foreach($words as $key=> value){ 
    $query.='"%'.$value.'%" OR'; 
} 
$query=rtrim($string, "OR"); 
$query.='ORDER BY title LIMIT '.$per_page.' OFFSET '.$offset; 
include 'include/common.php'; 
while($row=mysql_fetch_array(mysql_query($query))) { 
      include ('include/form.php'); 
    } 

Nex время использования MySQLi вместо функций MySQL

0

Проблема заключается в том, что ваш запрос ищет точный текст, который вы вводите. Итак, если вы введете Celeste the moon, он ищет текст, содержащий именно эту фразу. WHERE x LIKE '%foo bar%' означает «найти строки, где x содержит ровно foo bar, но это нормально, если есть другие вещи до или после него.

Вам нужно разбить его, как предлагает Шидиль, но вам нужно избежать каждой части запроса . код Shidil имеет некоторые логические ошибки и небезопасным так, например (с изменениями, исправлениями и более безопасная версия кода Shidil в):

$words = explode(' ',$_REQUEST['string']); // split up the input 

$query='SELECT * FROM `products` WHERE '; // first part of the query 

foreach($words as $key=> value) { 

    /* Build the WHERE clause 
     Note that you need `title` LIKE for each term, and each term 
     needs to be run through mysql_real_escape_string() */ 
    $query.='`title` LIKE "%'.mysql_real_escape_string($value).'%" OR'; 
} 

// Strip the last "OR" 
$query=rtrim($string, "OR"); 

/* You don't show where $per_page or $offset came from. 
    If they are user input (even a drop-down or something), you MUST 
    validate them; otherwise, you will have a SQL injection vulnerability */ 
$query.=' ORDER BY title LIMIT '.$per_page.' OFFSET '.$offset; 

include 'include/common.php'; 

/* don't put mysql_query() in the while(); it will run the query over and over, 
    but you'll just keep getting the first row over and over */ 
$result = mysql_query($query); 

while($row=mysql_fetch_array($result)) { 
    include ('include/form.php'); 
} 

и как каждый указывал:. Don't use mysql_*, а mysql_* функции устарели , deprecated и небезопасны. Вместо этого используйте MySQLi или PDO.

+0

Я пробовал это, но он дает ошибку. Я также обновил код выше – user3077454

+0

Какая ошибка? «Это ошибка» не помогает никому говорить вам, что не так. –

Смежные вопросы