#php #jquery #ajax #pdo
#php #jquery #ajax #pdo
Вопрос:
Некоторое время назад я создал функцию поиска с помощью ajax и php. Вы можете заполнить текстовое поле текстом, и оно попытается найти совпадение среди всех стран, хранящихся в базе данных. Сейчас я уточняю код и делаю его PDO, но я что-то сломал, и я не могу выяснить, что.
это мой обычный HTML
<head>
<title>Ajax</title>
<link href="style/style.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="scripts/Javascript.js"></script>
</head>
<body>
<div id="main">
<h1 class="title">Enter your country please</h1>
<input type="text" id="search" autocomplete="off" onchange="">
<h4 id="results-text">Showing results for: <b id="search-string">Array</b></h4>
<ul id="results"></ul>
</div>
</body>
вот мой Jquery и javascript. обратите внимание, что я ничего не изменил ни в HTML, ни в javascript, поэтому это не может быть ошибкой типа.
$(document).ready(function() {
alert('asdf');
function search() {
var query_value = $('input#search').val();
$('b#search-string').html(query_value);
if(query_value !== ''){
$.ajax({
type: "POST",
url: "search.php",
data: { query: query_value },
cache: false,
success: function(html){
$("ul#results").html(html);
}
});
}
return false;
}
$("input#search").live("keyup", function(e) {
clearTimeout($.data(this, 'timer'));
var search_string = $(this).val();
if (search_string == '') {
$("ul#results").fadeOut();
$('h4#results-text').fadeOut();
}
else {
$("ul#results").fadeIn();
$('h4#results-text').fadeIn();
$(this).data('timer', setTimeout(search, 100));
};
});
});
И вот мой Search.PHP
<?php
class SearchEngine{
private $html;
public function __construct($conn){
$this->html = '<li class="result">
<h3>NameReplace</h3>
<a target="_blank" href="ULRReplace"></a>
</li>';
if (isset($_POST["query"])) {
$search_string = mysql_real_escape_string($search_string);
}
else{
$search_string = 'b';
}
if (strlen($search_string) >= 1 amp;amp; $search_string !== ' ') {
$query = 'SELECT * FROM country WHERE name LIKE "%' . $search_string . '%"';
$result = $conn->prepare($query);
$result->execute();
$result_array = $result->fetchAll();
foreach ($result_array as $result) {
$display_name = preg_replace("/" . $search_string . "/i", "<b>" . $search_string . "</b>", $result['name']);
$display_url = 'sadf';
$output = str_replace('NameReplace', $display_name, $this->html);
$output = str_replace('ULRReplace', $display_url, $output);
echo($output);
}
}
}
}
?>
Проблемы:
-
запрос Post никогда не создается, для этого я создал isset so на данный момент, когда Post-запрос не создан. Это создаст Post-запрос со значением «B».
-
Я думаю, что страница никогда не обновляется, но я не могу быть уверен на 100%, поскольку сообщение никогда не создается, поэтому запрос никогда не обновляется. И по какой-то причине результаты не помещаются в правильное место.
Любая помощь будет высоко оценена. Пожалуйста, будьте осторожны, я новичок в Ajax, и я скорее хочу понять, чем иметь решение. Спасибо
Комментарии:
1. если вы
var_dump($_POST);
— что-нибудь отображается? Что произойдет, если вы попытаетесь вручную перейти на страницу PHP, которая обновила SQL?2. Я не могу var_Dump post, потому что он никогда не создается. Я протестировал javascript.js и функции внутри вызываются, но не делают того, что они должны делать. и что вы имеете в виду под ручным переходом на страницу PHP?
3. @KrijnvanderBurg вам все еще нужна помощь с этим вопросом?
4. Я снова задал этот вопрос 10 минут, и он был решен. но теперь у меня другая проблема. что он возвращает HTML дважды. Но в вашем ответе есть несколько других недостатков, в которых упоминается мой код, поэтому я рассмотрю его.
Ответ №1:
Вы действительно отправляете свою строку поиска в класс PHP?
Это не так, как это работает, вам нужно создать экземпляр этого класса и использовать его.
Создайте отдельный php-файл для этого класса и включите его в search.php
У вас может быть простой класс, выглядящий следующим образом:
search_engine.php
<?php
class SearchEngine{
private $conn;
function __construct($conn){
$this->conn = $conn;
}
function get_search_results($search_string){
$query = 'SELECT * FROM country WHERE name LIKE :search';
$result = $this->conn->prepare($query);
$result->execute(array(':search'=>'%'.$search_string.'%'));
$result_array = $result->fetchAll();
return $result_array;
}
}
?>
search.php
if (isset($_POST["query"])) {
$search_string = $_POST["query"];
if(strlen($search_string) >= 1 amp;amp; $search_string !== ' ') {
include 'search_engine.php'
$engine = new SearchEngine($conn);
$results = $engine->get_search_results($search_string);
foreach($results as $result){
//do something
}
}
}