[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск с постраничным выходом
Александр.
Доброго времени суток, помогите разобраться ни как не воткну где ошибка
имеем форму
 <form action="../search.php" method="post" name="search">
<input
name="search" type="text" value="search">
<br>
<input
name="submit" type="submit" value="submit">

</form>


допустим имеем в sql базе 10 записей, вводим в поле search слово красивая , которое допустим содержится в 5 записях.

 

$search = isset($_POST['search'])?$_POST['search']:NULL;

if (empty ($search)) {exit ("<p>Вы не ввели слова для поиска, вернитесь назад и введите слова.</p><br>
<input
name='back' align='center' type='button' value='Вернуться назад' onclick='javascript:self.back();'><br>");}
$search = trim($search);
$search = stripslashes($search);
$search = htmlspecialchars($search);
$nums = 5;

if (isset($_GET['page']))
{
$page = intval($_GET['page']);
}
else
{
$page = 1;
}

$query = "SELECT COUNT(*) AS `counter`
FROM `data`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$elements = $row['counter'];
$pages = ceil($elements/$nums);

if ($page < 1)
{
$page = 1;
}
elseif ($page > $pages)
{
$page = $pages;
}

$start = ($page-1)*$nums;


if ($start < 0) $start = 0;

$query = "SELECT *
FROM `data` WHERE MATCH (text) AGAINST ('$search')
LIMIT {$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($sql) > 0) {
while ($row = mysql_fetch_assoc($sql)) {echo '<table border="0">'.'<tr>'.'<td width="100"></td>'.
'<td class="country_title" width="275">'.'<a href = ../count/?id='.($row['id']).
'
>'.($row['title']).'</a>'.'</td>'.'</tr>'.'<tr>'.'<td class="country_img" width="100">'.'<a href = ../count/?id='.($row['id']).
'
>'.'<img align="left" width="100" height="100" src='.($row['mini_img']).'>'.'</a>'.
'</td>'.'<td valign="top" class="country_description" width="275">'.'<a href = ../count/?id='.($row['id']).
'
>';?><?=substr($row['text'],0,380);?><?php echo '...'.'</a>'.'</td>'.'</tr>'.'<tr>'.
'<td width="100">'.'</td>'.'<td class="view_country" width="275">'.
'Просмотров:'.($row['view']).'</td>'.'</tr>'.'</table>';}} else {echo 'пустота'; exit();}?>



<table
border="0" cellspacing="0" cellpadding="0">
<tr>
<td
width="750" ><div align="center" class="paginator">
<?php

$neighbours = 6;
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;

$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;

if ($page > 1) {
echo ' <a href="http://домен/country/?page=1">начало</a> ... <a href="http://домен/country/?page=' . ($page-1) . '"><назад</a> ';
}

for ($i=$left_neighbour; $i<=$right_neighbour; $i++) {
if ($i != $page) {
echo ' <a href="http://домен/country/?page=' . $i . '">' . $i . '</a> ';
}
else {

echo ' <b>' . $i . '</b> ';
}
}


if ($page < $pages) {
echo ' <a href="http://домен/country/?page=' . ($page+1) . '">вперед></a> ... <a href="http://домен/country/?page=' . $pages . '">конец</a> ';
} ?></div>


если ввести слово которое встречается в 1 записи все работает и выводится, а вот больше 1 нет..., извиняюсь за неряшливый код я только учусь и многих вещей до конца еще не доделываю-( .





Спустя 1 час, 40 минут, 50 секунд (8.04.2010 - 17:40) ИНСИ написал(а):
Александр. дааа..... код у тебя не очень smile.gif лучше пока учишься, учись делать красиво и понятно код. Приучайся уже сейчас...

по вопросу, кажется вот это:
$query = "SELECT COUNT(*) AS `counter`FROM `data`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$elements = $row['counter'];

тебе надо заменить на:
$sql = mysql_query("SELECT COUNT(*) AS `counter` FROM `data`");
$row = mysql_fetch_array($sql);
$elements = $row[0];

Спустя 17 минут, 56 секунд (8.04.2010 - 17:57) twin написал(а):
Не надо. Плохая привычка - mysql_fetch_array() без флага. А единственное значение лучше выбирать так:

$res = mysql_query("SELECT COUNT(*) AS `counter` FROM `data`");
$elements = mysql_result($res, 0);

Спустя 51 минута, 49 секунд (8.04.2010 - 18:49) ИНСИ написал(а):
Цитата
Не надо. Плохая привычка - mysql_fetch_array() без флага.

ты так любишь всегда преувеличивать. Мой код, нормально работает и без флага smile.gif

или покажи документацию, где написано что так нельзя или плохо делать? как я сделал. ты просто другой вариант реализации дал...

Спустя 15 минут, 24 секунды (8.04.2010 - 19:05) twin написал(а):
Цитата
или покажи документацию, где написано что так нельзя или плохо делать?

Вот и вот
Это что касаемо документации. У парня правильно стояла функция, а ты рассуждаешь:
Цитата
Мой код, нормально работает и без флага

то есть работает и ладно. Хоть трава не расти.
Потому что совершенно не понимаешь, что за флаг, что он дает и вообще, что делает функция mysql_fetch_array()

Сам ты можешь писать как угодно, но другим чушь советовать не надо.
По этому ничего я не преувеличиваю, а просто поправляю.

Спустя 11 часов, 46 минут, 48 секунд (9.04.2010 - 06:51) Александр. написал(а):
не работает... выполняется
 else {echo 'пустота'; exit();} 
напомню, нужно чтобы выводились все записи где встречается искомое слово, в данном положение дел выводится, иначе.. если искомое слово содержится в нескольких записях.

Спустя 36 минут, 29 секунд (9.04.2010 - 07:28) twin написал(а):
Если нужно все, то тогда зачем MATCH... AGAINST? Это же "интелектуальный" поиск, который отсеивает часто повторяющшиеся слова. У тебя слово встречается как раз в половине записей, вот и не видит.
Используй LIKE тогда уж.

Спустя 28 минут, 49 секунд (9.04.2010 - 07:57) Александр. написал(а):
Новые знания), увы я это не знал теперь знаю) а сам запрос как будет выглядеть?
А все , спасибо без пинка не разобрался) додумался сам.
Возникла другая трудность ohmy.gif
он ищет если искомое слово стоит 1 в тексте а если слово где то в глубине поиска нет(

 $query = "SELECT *
FROM `data` WHERE text LIKE '$search"."%'
LIMIT {$start}, {$nums}";

Спустя 19 минут, 43 секунды (9.04.2010 - 08:16) twin написал(а):
А точно разобрался? LIKE тоже по разному можно использовать.

Спустя 1 минута, 11 секунд (9.04.2010 - 08:18) twin написал(а):
 $query = "SELECT *
FROM `data` WHERE text LIKE '%"
. $search ."%'
LIMIT
{$start}, {$nums}";

Спустя 6 минут, 1 секунда (9.04.2010 - 08:24) Александр. написал(а):
да вот походу поторопился) сижу читаю доки

Спустя 1 час, 24 минуты, 9 секунд (9.04.2010 - 09:48) Александр. написал(а):
еще вопросик, выводится все правильно но при переходе на след страницу теряется $search т.е. выводит
 if (empty ($search)) {exit ("<p>Вы не ввели слова для поиска, вернитесь назад и введите слова.</p><br>
<input
name='back' align='center' type='button' value='Вернуться назад' onclick='javascript:self.back();'><br>");}
как передать $search на след , страницу если вверху мы ее получили через POST . ? GET-ом но как?)

Спустя 12 минут, 35 секунд (9.04.2010 - 10:00) twin написал(а):
Прилепить к ссылке, как же еще)))
'<a href="http://домен/country/?page=' . ($page-1) .'&search='.$search.'"><назад</a>

Спустя 10 минут, 39 секунд (9.04.2010 - 10:11) Александр. написал(а):
да спасибо) заработало
 $search = isset($_POST['search'])?$_POST['search']:NULL; 
это еще добавил)

Спустя 15 минут, 12 секунд (9.04.2010 - 10:26) Александр. написал(а):
sad.gif работает в переделах циркулируемого слова, при введение нового слова поиска нет, я так понимаю это из за $_GET -а, добавлять условие
 if isset($_GET['search']) {$search = $search($_GET['search']);} 
не получилось...

Спустя 35 минут, 11 секунд (9.04.2010 - 11:01) Александр. написал(а):
собственными силами получил такую схему

 
<?php

if (!isset($_GET['search'])) {

$search = isset($_POST['search'])?$_POST['search']:NULL;



<?php

if (empty ($search)) {exit ("<p>Вы не ввели слова для поиска, вернитесь назад и введите слова.</p><br>
<input name='back' align='center' type='button' value='Вернуться назад' onclick='javascript:self.back();'><br>"
);}
$search = trim($search);
$search = stripslashes($search);
$search = htmlspecialchars($search);
$nums = 2;


if (isset($_GET['page']))
{
$page = intval($_GET['page']);
}
else
{
$page = 1;
}

$query = "SELECT COUNT(*) AS `counter`
FROM `data`"
;
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);

$elements = $row['counter'];
$pages = ceil($elements/$nums);

if ($page < 1)
{
$page = 1;
}
elseif ($page > $pages)
{
$page = $pages;
}

$start = ($page-1)*$nums;


if ($start < 0) $start = 0;

$query = "SELECT *
FROM `data` WHERE text LIKE '%"
. $search ."%'
LIMIT
{$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($sql) > 0) {
while ($row = mysql_fetch_assoc($sql)) {echo '<table border="0">'.'<tr>'.'<td width="100"></td>'.
'<td class="country_title" width="275">'.'<a href = ../count/?id='.($row['id']).
'>'.($row['title']).'</a>'.'</td>'.'</tr>'.'<tr>'.'<td class="country_img" width="100">'.'<a href = ../count/?id='.($row['id']).
'>'.'<img align="left" width="100" height="100" src='.($row['mini_img']).'>'.'</a>'.
'</td>'.'<td valign="top" class="country_description" width="275">'.'<a href = ../count/?id='.($row['id']).
'>';?><?=substr($row['text'],0,380);?><?php echo '...'.'</a>'.'</td>'.'</tr>'.'<tr>'.
'<td width="100">'.'</td>'.'<td class="view_country" width="275">'.
'Просмотров:'.($row['view']).'</td>'.'</tr>'.'</table>';}} else {echo 'пустота'; exit();}?>



<table
border="0" cellspacing="0" cellpadding="0">
<tr>
<td
width="750" ><div align="center" class="paginator">
<?php

$neighbours = 6;
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;

$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;

if ($page > 1) {
echo ' <a href="http://домен/search.php?page=">начало</a> ... <a href="http://домен/search.php?page=' . ($page-1) .'&search='.$search.'"><назад</a> ';
}

for ($i=$left_neighbour; $i<=$right_neighbour; $i++) {
if ($i != $page) {
echo ' <a href="http://домен/search.php?page=' . $i . '">' . $i . '</a> ';
}
else {

echo ' <b>' . $i . '</b> ';
}
}


if ($page < $pages) {
echo ' <a href="http://домен/search.php?page=' . ($page+1) .'&search='.$search.'">вперед></a> ... <a href="http://домен/search.php?page=' . $pages .'&search='.$search.'">конец</a> ';
} ?>
<?php
;}
else {

$search = isset($_GET['search'])?$_GET['search']:NULL;



if (empty ($search)) {exit ("<p>Вы не ввели слова для поиска, вернитесь назад и введите слова.</p><br>
<input name='back' align='center' type='button' value='Вернуться назад' onclick='javascript:self.back();'><br>"
);}
$search = trim($search);
$search = stripslashes($search);
$search = htmlspecialchars($search);
$nums = 2;


if (isset($_GET['page']))
{
$page = intval($_GET['page']);
}
else
{
$page = 1;
}

$query = "SELECT COUNT(*) AS `counter`
FROM `data`"
;
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);

$elements = $row['counter'];
$pages = ceil($elements/$nums);

if ($page < 1)
{
$page = 1;
}
elseif ($page > $pages)
{
$page = $pages;
}

$start = ($page-1)*$nums;


if ($start < 0) $start = 0;

$query = "SELECT *
FROM `data` WHERE text LIKE '%"
. $search ."%'
LIMIT
{$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($sql) > 0) {
while ($row = mysql_fetch_assoc($sql)) {echo '<table border="0">'.'<tr>'.'<td width="100"></td>'.
'<td class="country_title" width="275">'.'<a href = ../count/?id='.($row['id']).
'>'.($row['title']).'</a>'.'</td>'.'</tr>'.'<tr>'.'<td class="country_img" width="100">'.'<a href = ../count/?id='.($row['id']).
'>'.'<img align="left" width="100" height="100" src='.($row['mini_img']).'>'.'</a>'.
'</td>'.'<td valign="top" class="country_description" width="275">'.'<a href = ../count/?id='.($row['id']).
'>';?><?=substr($row['text'],0,380);?><?php echo '...'.'</a>'.'</td>'.'</tr>'.'<tr>'.
'<td width="100">'.'</td>'.'<td class="view_country" width="275">'.
'Просмотров:'.($row['view']).'</td>'.'</tr>'.'</table>';}} else {echo 'пустота'; exit();}?>



<table
border="0" cellspacing="0" cellpadding="0">
<tr>
<td
width="750" ><div align="center" class="paginator">
<?php

$neighbours = 6;
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;

$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;

if ($page > 1) {
echo ' <a href="http://домен/search.php?page=">начало</a> ... <a href="http://домен/search.php?page=' . ($page-1) .'&search='.$search.'"><назад</a> ';
}

for ($i=$left_neighbour; $i<=$right_neighbour; $i++) {
if ($i != $page) {
echo ' <a href="http://домен/search.php?page=' . $i . '">' . $i . '</a> ';
}
else {

echo ' <b>' . $i . '</b> ';
}
}


if ($page < $pages) {
echo ' <a href="http://домен/search.php?page=' . ($page+1) .'&search='.$search.'">вперед></a> ... <a href="http://домен/search.php?page=' . $pages .'&search='.$search.'">конец</a> ';
} ;} ?>



но как то это неправильно, кода многа да и работает криво когда искомое слово находится в 1 записи выводиться запись и ненужный пагинатор, запись то 1 ... , когда несколько все вроде нормально ,запутался окончательно)

Спустя 4 часа, 59 минут (9.04.2010 - 16:00) ИНСИ написал(а):
twin если быть точным, я сказал:
Цитата
или покажи документацию, где написано что так нельзя или плохо делать?

я НЕ ГОВОРИЛ, ПОКАЖИ МНЕ ДОКУМЕНТАЦИЮ по этой функции. Или ты английский не совсем хорошо знаешь?! Если нет, то вот коротко:

1. При использовании MYSQL_BOTH Вы получите ассоциативный массив и индексы числа.
2. Используя MYSQL_ASSOC, Вы только получаете ассоциативные индексы (как mysql_fetch_assoc () работы)
3. используя MYSQL_NUM, Вы только получаете индексы числа (как mysql_fetch_row () работы).

Я нигде не нашел инфу, что плохо, если не используешь "флаг".

Цитата
Потому что совершенно не понимаешь, что за флаг, что он дает и вообще, что делает функция mysql_fetch_array()


говори за себя! Не надо говорить за меня! именно этот вариант, мне дал один из экспертов, который знает php куда круче тебя!

Спустя 13 минут, 12 секунд (9.04.2010 - 16:14) twin написал(а):
О боже...
Цитата
Я нигде не нашел инфу, что плохо, если не используешь "флаг".

Если ты не нашел, это не значит, что её нет. Чего так орать, не разобравшись...
Цитата
именно этот вариант, мне дал один из экспертов, который знает php куда круче тебя!

Ну знает круче, молодец. Я разве против.

Только вот из той документации, что я тебе дал:
Цитата
mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )


И еще вот:
Цитата
By using MYSQL_BOTH (default), you'll get an array with both associative and number indices.

Переведи. Если не сможешь, обратись к своему протеже, а за одно спроси: на кой нужно вытаскивать два массива, захламляя оперативную память?
Цитата
говори за себя! Не надо говорить за меня!

Буду. biggrin.gif Потому что ты так и не понял своей ошибки.

Спустя 2 дня, 15 часов, 59 минут, 10 секунд (12.04.2010 - 08:13) Александр. написал(а):
twin , а в моем вопросе можно еще получить помощь?

Спустя 5 часов, 15 минут, 43 секунды (12.04.2010 - 13:29) twin написал(а):
А что я могу... только добавить к этому:
Цитата
но как то это неправильно, кода многа да и работает криво

что еще напрочь отсутствует читабельность.
Этот код по хорошему нужно выкинуть и написать новый. Следуя каким то правилам и соблюдая какой то стиль.
Даже если налепить на этот тришкин кафтан заплаток, пользы не будет ни автору, ни посетителям сайта.

Стоит все же поратить время и научиться делать это правильно. Это потом сторицей окупится.

Я сделал (и делаю) все, что в моих силах.

Ковыряться в такой каше нет никакого ни удовольствия ни желания.

Спустя 5 часов, 59 минут, 35 секунд (12.04.2010 - 19:28) twin написал(а):
Ну вот начало, пока курил
<?php 

if (!isset($_GET['search']))
{

$search = isset($_POST['search'])?$_POST['search']:NULL;

if (empty ($search))
{
// Команды остановки скрипта нельзя использовать для вывода сообщений пользователю
exit ("<p>Вы не ввели слова для поиска, вернитесь назад и введите слова.</p><br>
<input name='back' align='center' type='button' value='Вернуться назад' onclick='javascript:self.back();'><br>"
);
}

$search = trim($search);
//////////////////////////////////////////////
// Ужос. Тут нужно почитать http://phpforum.ru/index.php?showtopic=21213
$search = stripslashes($search);
$search = htmlspecialchars($search);
///////////////////////////////////////////////
$nums = 2;


if (isset($_GET['page']))
$page = intval($_GET['page']);
else
$page = 1;

// Не нужна здесь перезапись. И функция возвращает РЕЗУЛЬТАТ запроса, а не SQL
/* $query = "SELECT COUNT(*) AS `counter`
FROM `data`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);*/


$result = mysql_query("SELECT COUNT(*) AS `counter`
FROM `data`"
) or die(mysql_error());

$row = mysql_fetch_assoc($result);

$elements = $row['counter'];
$pages = ceil($elements/$nums);

if ($page < 1)
$page = 1;
elseif ($page > $pages)
$page = $pages;

$start = ($page - 1) * $nums;

if ($start < 0)
$start = 0;
// Не нужна здесь перезапись. И функция возвращает РЕЗУЛЬТАТ запроса, а не SQL
/*
$query = "SELECT *
FROM `data` WHERE text LIKE '%". $search ."%'
LIMIT {$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());
*/


$result = mysql_query("SELECT *
FROM `data` WHERE text LIKE '%"
. $search ."%'
LIMIT
{$start}, {$nums}") or die(mysql_error());


if (mysql_num_rows($result) > 0)
{
while ($row = mysql_fetch_assoc($result))
{

// Перед выводом данные нужно обработать
$row = array_map('htmlspecialchars', $row);

// Это зачем такая гремучая смесь?
/*
echo '<table border="0">'.'<tr>'.'<td width="100"></td>'.
'<td class="country_title" width="275">'.'<a href = ../count/?id='.($row['id']).
'>'.($row['title']).'</a>'.'</td>'.'</tr>'.'<tr>'.'<td class="country_img" width="100">'.'<a href = ../count/?id='.($row['id']).
'>'.'<img align="left" width="100" height="100" src='.($row['mini_img']).'>'.'</a>'.
'</td>'.'<td valign="top" class="country_description" width="275">'.'<a href = ../count/?id='.($row['id']).
'>';?><?=substr($row['text'],0,380);?><?php echo '...'.'</a>'.'</td>'.'</tr>'.'<tr>'.
'<td width="100">'.'</td>'.'<td class="view_country" width="275">'.
'Просмотров:'.($row['view']).'</td>'.'</tr>'.'</table>';}} else {echo 'пустота'; exit();}?>
*/

echo "<table border=\"0\"><tr><td width=\"100\"></td>\n"
."<td class=\"country_title\" width=\"275\"><a href = ../count/?id=". $row['id'] .">"
. $row['title'] ."</a>\n</td>\n</tr>\n<tr>\n<td class=\"country_img\" width=\"100\">"
."<a href = ../count/?id=". $row['id'] .">\n".
.
"<img align=\"left\" width=\"100\" height=\"100\" src=". $row['mini_img'] .">\n</a>"
."</td>\n<td valign=\"top\" class=\"country_description\" width=\"275\">"
."<a href = ../count/?id=". $row['id'] .">". substr($row['text'], 0, 380) ."...</a>\n"
."</td>\n</tr>\n<tr>\n<td width=\"100\"></td><td class=\"view_country\" width=\"275\">\n"
."Просмотров:". $row['view'] ."</td></tr></table>";
}
}

else
{
echo 'пустота'; //exit();
}
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.