Я создаю поисковую систему, в которой пользователь вводит данные в текстовую область, а когда он нажимает 'enter', текст поиска отправляется в поисковый запрос php через javascript, чтобы страница не загружалась.
JavaScript:
<script type="text/javascript">
function search(str)
{
if (str=="")
{
document.getElementById("search").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{//IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{//IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("search").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","leaderboard.php?q="+str,true);
xmlhttp.send();
}
</script>
Ввод текста:
<form>
<input type="text" value="search for user" onfocus="if
(this.value==this.defaultValue) this.value='';" onblur="if (this.value!==this.defaultValue) this.value='search for user';" id="search" name="search" style="background-color: white; color: black; border: 1px solid black; font-family: verdana; font-size: 9px; height: 20px; text-align: center;" onchange="search(this.value)">
</form>
PHP:
<?php
$con = mysql_connect('localhost', 'refrigerator', 'XXX');
mysql_select_db('refrigerator');
if($q=$_GET["q"]){
$sql="SELECT * FROM users WHERE username = '".$q."'";
$result = mysql_query($sql);
$User = array(); $Count = array(); $t=0; $i=0;
while($row = mysql_fetch_array($result)){
$User[] = $row['username']; $Count[] = $row['count'];
$t=mysql_num_rows($sql);
}
echo '<tr><td>' .$a. '</td><td>'.$row['username'].'</td><td>'.$row['count'].'</td></tr>';
mysql_close($con);
}
if ($q=!$_GET["q"]){
$User = array(); $Count = array(); $t=0; $i=0;
while($row = mysql_fetch_array($result)){
$User[] = $row['username']; $Count[] = $row['count'];
$t=13;
}
$User[] = $row['username']; $Count[] = $row['count'];
while($i<$t) {
$a = $i + 1;
echo '<tr><td>' .$a. '</td><td>'.$User[$i].'</td><td>'.$Count[$i].'</td></tr>';
$i++;
}
}
?>
javascript определенно работает до предпоследней строки, потому что URL-адрес изменяется на "http://localhost/%5bclickphilia%5d/leaderboard.php? search = все, что было обыскано", но затем ничего не происходит.
Я очень новичок в этом, поэтому я мог бы сделать ослепительно очевидную ошибку, поэтому не исключаю эту возможность: D
Спасибо
EDIT:
Вот полный код таблицы, включая php:
<table border="0" cellspacing="15" padding="0" width="200">
<th><font color="#00FF00">Rank</font></th>
<th><font color="#00FF00">Username</font></th>
<th><font color="#00FF00">Score</font></th>
<?php
$con = mysql_connect('localhost', 'refrigerator', 'XXXX');
mysql_select_db('refrigerator');
if($q=$_GET["q"]){
$sql="SELECT * FROM users WHERE username = '".$q."'";
$result = mysql_query($sql);
$result=mysql_real_escape_string($result);
$User = array(); $Count = array(); $t=0; $i=0;
while($row = mysql_fetch_array($result)){
}
echo '<tr><td>' .$a. '</td><td>'.$row['username'].'</td><td>'.$row['count'].'</td></tr>';
mysql_close($con);
}
if ($q=!$_GET["q"]){
$User = array(); $Count = array(); $t=0; $i=0;
while($row = mysql_fetch_array($result)){
$User[] = $row['username']; $Count[] = $row['count'];
$t=13;
}
$User[] = $row['username']; $Count[] = $row['count'];
while($i<$t) {
$a = $i + 1;
echo '<tr><td>' .$a. '</td><td>'.$User[$i].'</td><td>'.$Count[$i].'</td></tr>';
$i++;
}
}
?>
</table>
Я уверен, что вставка php echo в таблицу работает, потому что событие if ($ q =! $_ GET [ "q" ]) отлично работает. Данные вводятся в таблицу в порядке.
Ну эта строка здесь:
document.getElementById("search").innerHTML=xmlhttp.responseText;
не имеет смысла для меня. Элементом "search" является поле <input>
. Установка свойства элемента "innerHTML" может вообще ничего не делать на странице, поскольку элементы ввода "текст" являются "пустыми" элементами и не содержат содержимого.
Может быть, у вас где-то есть таблица "search_results"? Если это так, у вас может возникнуть проблема с обновлением "середины" <table>
, как это, в IE по крайней мере. Попробуйте это, и вы должны быть в состоянии возиться с этим, чтобы что-то придумать.
edit — Я переформулирую, что я думаю, проблема: ваш PHP-код, кажется, объединяет ответ на поиск в какой-то форме таблицы; он создает элементы <tr>
и <td>
. Те, кто захотят войти в <table>
где-нибудь (фактически технически a <tbody>
, но что угодно). Точно как, или даже если вы хотите уточнить это, я не могу сказать. Однако вы можете попробовать добавить это на свою страницу:
<div id='search_results'>Results Go Here</div>
и поместите его где-нибудь, где он появится. Затем измените функцию поиска(), чтобы везде, где вы устанавливаете "innerHTML", измените "id", который вы ищете, на "search_results".
<div id='search_results'>Results Go Here</div>
должна быть таблицей, поскольку его PHP-код не генерирует теги <table>
или </table>
.
Я предполагаю, что вы хотите реализовать своего рода автозаполнение.
Я думаю, что эта строка:
document.getElementById("search").innerHTML=xmlhttp.responseText;
должен быть:
document.getElementById("search_result").value=xmlhttp.responseText;
Вам нужно иметь таблицу search_result
, как указал Pointy.
Если вы заинтересованы в переходе на маршрут jQuery, это будет ваш новый код:
function search(str){
if (str != "")
$.get("leaderboard.php", {q : str}, function(r){
$("#search_result").html(r);
});
}
Если вы хотите использовать клавишу Enter, я бы (снова) рекомендовал jQuery, потому что вы можете выполнить это с помощью нескольких строк кода, а не еще нескольких с использованием чистого JavaScript.
Ого. Трудно знать, с чего начать.
Думаю, вы получите дополнительную помощь, если вы дадите нам больше идеи о том, чего вы пытаетесь достичь. Я думаю, вы пытаетесь построить встроенный поиск?
Если ваш URL меняется, форма как-то подается. Поскольку вы используете AJAX, вероятно, не то, что вы хотите. Добавьте onSubmit="return false;"
в элемент формы. Это может решить вашу непосредственную проблему. (хотя я не уверен, что onChange
будет работать с перекрестным браузером. См. № 2)
Посмотрите jQuery для AJAX и для манипуляций с DOM. Это намного проще, чем то, что вы пытаетесь создать с помощью собственных инструментов.
Ваш запрос не будет работать, и это проблема безопасности. Прямо сейчас любой может отправлять команды SQL в ваш параметр q
и в зависимости от разрешений, вероятно, делает все, что захочет, с вашей базой данных. Посмотрите mysql_real_escape_string()
или еще лучше посмотрите на структуру базы данных, в которой используются владельцы мест, такие как PDO. Что касается самого запроса, вы только найдете людей с точным соответствием. Вероятно, вы хотите использовать LIKE
, а не равный.