2013-12-17 2 views
1

Я пытаюсь реализовать функцию динамического поиска в html, jQuery, ajax и php. Проблема заключается в том, что функция поиска выполняет поиск только тогда, когда вы ввели 2-3 буквы. Например: при нажатии буквы «f» она должна возвращать каждую строку в базе данных, которая содержит букву «f». Возврат данные пуст. (Он должен вернуть 20 значений, я протестировал запрос) Теперь он возвращает результат только при записи «foo», возможно, это потому, что это единственная строка, которая имеет имя. На этот раз она возвращает структуру XML:PHP, ajax, xml, jQuery - динамический поиск возвращает только одно значение

<picture> 
    <picuser>CorrcetUser</picuser> 
    <picurl>CorrectURL</picurl> 
    <pictime>CorrectTime</pictime> 
    <picid>CorrectID</picid> 
    <comment> 
     <commenttime>Foo</commenttime> 
     <commentuser>Foo</commentuser> 
     <commenttext>Foo</commenttext> 
    </comment> 
    <description> 
     Foo bar 
    </description> 
</picture> 

Вот код прямо сейчас:

файла JavaScript

$(document).ready(function() { 

    $(".search").keyup(function() { 
     var searchbox = $(this).val(); // get the string in the searchbox 
     var dataString = 'searchword=' + searchbox; 
     if (searchbox == '') { 

     } else { 
     $.ajax({ 
      type : "POST", 
      url : "search.php", 
      data : dataString, 
      dataType : "xml", 
      async: false, 
      cache : false, 
      success : function(data, textStatus, jqXHR) { 
           //Data repsonse from server 
           console.log(data); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) 
         { 
       
         } 
     }); 
     } 
    }); 
}); 

Здесь представлен search.php

<?php 
include ('dbconnect.inc.php'); 

if ($_POST) { 
echo '<?xml version="1.0" standalone="no"?>'; 


$searchword = $_POST['searchword']; 
$sql = "SELECT * FROM picture WHERE description LIKE :searchword"; 
$query = $dbh -> prepare($sql); 
$query -> execute(array('searchword' => '%' . $searchword . '%')); 
$nr=0; 
$outputXML =""; 
$results = $query->fetchAll(PDO::FETCH_ASSOC); 

foreach($results as $row) { 

    $outputUser = $row['userName']; 
    $outputPicURL = $row['picURL']; 
    $outputTime = date('Y-m-d H:i', $row['time']); 
    $outputString = $row['description'];  
    $outputPicID = $row['pictureID']; 

    $outputXML.= "<picture> 
       <picuser>$outputUser</picuser> 
       <picurl>$outputPicURL</picurl> 
       <pictime>$outputTime</pictime> 
       <picid>$outputPicID</picid> 
       <comment> 
        <commenttime>Foo</commenttime> 
        <commentuser>Foo</commentuser> 
        <commenttext>Bar</commenttext> 
       </comment> 
      <description> 
       Foo bar 
      </description> 
     </picture>"; 

} 
echo $outputXML; 
} 


?> 

I подумал, что это легкое решение, но здесь я застрял. И интересно, почему данные пуст?

+0

'async: false,' почему ?? –

+0

Я думал, что это хорошая практика при получении из базы данных, это плохая идея? Он работает в любом случае. – user2553827

+0

Это для интрасети или интернет-сайта? Вероятно, это плохая идея, потому что это атака DOS, ожидающая своего появления. Представьте, что пользователь приходит на сайт и начинает снова запускать событие keyup вашего окна поиска, отправляя множество запросов на ваш сервер. Тогда представьте, что несколько пользователей делают то же самое. Если они используют стандартные браузеры (chrome, IE, firefox и т. Д.), То существует ограничение на количество запросов, которые могут быть сделаны, но если они используют настраиваемый браузер, предназначенный для таких атак, вы даете очень простое способ довести ваш сервер с помощью атаки DOS – elitechief21

ответ

0

Документы Xml нуждаются в одном корневом элементе. Вы должны выводить их:

if ($_POST) { 
    header('Content-type: application/xml'); 
    echo '<?xml version="1.0" standalone="no"?>'; 
    echo '<pictures>'; 
    ... 
    foreach($results as $row) { 
    $outputUser = htmlspecialchars($row['userName']); 
    ... 
    } 
    echo '</pictures>'; 
} 

Некоторые браузеры (например, Internet Explorer), будет только анализировать реакцию в DOM, если тип содержимого XML предусмотрен (header('Content-type: application/xml');).

Если вы выводите значения в xml с помощью строковой функции (например, echo), вам необходимо избежать значений (htmlspecialchars()). В противном случае символы, такие как < или &, могут сломать ваш xml.

Последнее, если вы получите XML как строку в Javascript, вы можете создать DOMParser и использовать его для его анализа.

+0

Спасибо, это сработало! – user2553827

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