имеем форму
<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) ИНСИ написал(а):
Александр. дааа..... код у тебя не очень лучше пока учишься, учись делать красиво и понятно код. Приучайся уже сейчас...
по вопросу, кажется вот это:
тебе надо заменить на:
по вопросу, кажется вот это:
$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() без флага. |
ты так любишь всегда преувеличивать. Мой код, нормально работает и без флага
или покажи документацию, где написано что так нельзя или плохо делать? как я сделал. ты просто другой вариант реализации дал...
Спустя 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 тогда уж.
Используй LIKE тогда уж.
Спустя 28 минут, 49 секунд (9.04.2010 - 07:57) Александр. написал(а):
Новые знания), увы я это не знал теперь знаю) а сам запрос как будет выглядеть?
А все , спасибо без пинка не разобрался) додумался сам.
Возникла другая трудность
он ищет если искомое слово стоит 1 в тексте а если слово где то в глубине поиска нет(
А все , спасибо без пинка не разобрался) додумался сам.
Возникла другая трудность
он ищет если искомое слово стоит 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>как передать $search на след , страницу если вверху мы ее получили через POST . ? GET-ом но как?)
<input name='back' align='center' type='button' value='Вернуться назад' onclick='javascript:self.back();'><br>");}
Спустя 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) Александр. написал(а):
работает в переделах циркулируемого слова, при введение нового слова поиска нет, я так понимаю это из за $_GET -а, добавлять условие
if isset($_GET['search']) {$search = $search($_GET['search']);}не получилось...
Спустя 35 минут, 11 секунд (9.04.2010 - 11:01) Александр. написал(а):
собственными силами получил такую схему
но как то это неправильно, кода многа да и работает криво когда искомое слово находится в 1 записи выводиться запись и ненужный пагинатор, запись то 1 ... , когда несколько все вроде нормально ,запутался окончательно)
<?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. |
Переведи. Если не сможешь, обратись к своему протеже, а за одно спроси: на кой нужно вытаскивать два массива, захламляя оперативную память?
Цитата |
говори за себя! Не надо говорить за меня! |
Буду. Потому что ты так и не понял своей ошибки.
Спустя 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();
}
?>