За последние 24 часа нас посетили 17618 программистов и 1719 роботов. Сейчас ищут 1846 программистов ...

ПОСТРАНИЧНЫЙ ВЫВОД ИЗ БАЗЫ (голову сломала)

Тема в разделе "PHP и базы данных", создана пользователем oksana, 28 мар 2012.

  1. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Переменная $_POST['phone'], содержащая название искомой модели телефона - теряется.
    При переходе на другую страницу - это уже другой, отдельный запрос серверу. Обрабатывая его, он уже не знает, что там было передано в $_POST['phone'] при первом запросе на поиск. Это отдельный запуск скрипта, никак не связанный с предыдущим.
    Нужно либо как-то запоминать модель телефона (возможно, в сессии или куки), либо передавать этот параметр (модель телефона) в ссылках на другие страницы.
    Также можно, например, выполнить поиск и найти все записи, удовлетворяющие условиям поиска и сохранить их id куда-либо, а потом в скрипте вывода получать список этих id и в зависимости от номера страницы получать те или иные записи...
     
  2. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    я новичок в пхп и возможно что то не понимаю, но как сохранить id если одна страница poisc и как потом id будет меняться когда будет происходить переход на page2 или page3?

    у меня сайт типа доски объвлений на странице фильтр по категориям выводится все объявления и внизу просто переходы страниц 1.2.3.4.5...67
    на странице переходы работают =)

    если выбрать категорию (к примеру туфли) в фильтре, появляется стр. poisc и в ней выводятся объявления по этой категории 1.2.3.4.5...14
    но переход на другие страницы не происходит выдает ошибку
    мне не понятно почему page1 в стр. poisc выдает нормально а нажимаешь page2 ошибка пропали объявл.

    ребята мне если честно не важно в чем проблема если кто то найдет в чем проблема я буду очень рада =) а если нет то всеровно всем спасибо за помошь, но если у кого то есть скрипт под мою нужду скиньте пожалуйста ОЧЕНЬ нужно уже какой день мучаюсь=(
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    никак не сохранить. просто добавить ко всем ссылкам на другие страницы которые там у тебя в списке страниц
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    oksana,
    в предыдущем своём комментарии я написал тебе в чём проблема. И дал наводку как исправить. Но, судя по всему - ты хочешь готовый код... Попробую, опираясь на тот код, который ты здесь показала.
    Ссылки на страницы у тебя генерируются в функции link_page(), которая находится в файле f_poisk.php. Эта функция выводит ссылки вида script.php?page=N, где N - номер страницы. При этом всё, что получает сервер при переходе на другую страницу - это номер страницы. Он не получает параметры для поиска - просто потому, что в ссылке их нет. Тебе нужно сделать так, чтобы ссылки на страницы были следующего вида: script.php?page=N&phone=XXX, где ХХХ - искомая модель телефона. При таком подходе, в скрипте script.php (в твоём случае - это poisk.php) нужно, чтобы сервер принимал запрошенные данные не только из массива $_POST, но и из $_GET (те данные, которые ты приписываешь к ссылкам находятся в $_GET). Для упрощения можешь получать модель телефона из $_REQUEST, так как в него складываются как данные из POST-запросов, так и из GET-запросов.
    Вот на примере. В скрипте poisk.php у тебя есть строка, принимающая модель телефона:
    Код (PHP):
    1. $one = $_POST["phone"]; 
    Замени её на
    Код (PHP):
    1. $one = $_REQUEST["phone"]; 
    Теперь в переменной $one у тебя будет запрошенная модель телефона, не зависимо от того, запросили её методом POST или GET.
    Теперь тебе надо, чтобы к ссылкам приписывалось значение этой переменной. Для этого, во-первых, при вызове функции link_page() передавай ей значение этой переменной:
    Код (PHP):
    1. link_page($page, $count, $pages_count, 7, $one); 
    Теперь нужно переписать саму функцию link_page так, чтобы она принимала это значение и подставляла его в ссылки. Вот так нужно сделать, чтобы функция принимала это значение:
    Код (Text):
    1. function link_page($page, $count, $pages_count, $show_link, $phone = '') {
    Теперь внутри функции в переменной $phone будет запрошенная модель телефона. Поскольку функция может использоваться и в каких-то других местах, где модель телефона не нужна и передаваться в функцию не будет - мы делаем этот параметр не обязательным и ставим ему значение по-умолчанию пустую строку ( = '').
    Дальше, во всех тех местах, где функция выводит ссылки, нам нужно проверить, было ли передано в функцию это дополнительное значение (модель телефона) и если да - то его нужно приписать к ссылкам. Я не буду сейчас тебе полностью переписывать код всей функции, а покажу лишь в одном месте как нужно исправить, предполагая, что немного подумав, ты сможешь сама исправить остальные места, где функция выводит ссылки.
    Вот смотри, у тебя есть такой код:

    Код (PHP):
    1. echo ' <a style="color: #000000; text-decoration:none;" href='.$_SERVER['PHP_SELF'].'?page='.$i.'><strong style="font-family:Verdana, Geneva, sans-serif; font-size:12px;">'.$i.'</strong></a> '; 
    Он отвечает за отображение ссылок с циферками. Вот этот фрагмент:
    Код (Text):
    1. href='.$_SERVER['PHP_SELF'].'?page='.$i.'
    отвечает за адреса ссылок. И именно сюда тебе нужно добавить передаваемый параметр phone. Нужно сделать так:
    Код (Text):
    1. href='.$_SERVER['PHP_SELF'].'?page='.$i. (empty($phone) ? '' : '&phone=' . $phone) . '
    Если всё равно ничего не получится - спрашивай, конечно, попробуем объяснить более популярно... Хотя более популярно уже сложно :)
     
  5. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    все работает =) только одно но =( не работает поиск в странице poisc

    <?
    $db = mysql_connect("localhost", "php", "12345");
    mysql_select_db("www", $db);
    $one = $_REQUEST["phone"];
    include("../test/f_poisc.php");
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <title>Документ без названия</title>
    </head>

    <body>
    <a href="add.php"><input type="submit" value="добавить"></a>
    <form action="poisc.php" method="post">
    поиск по телефону<select name="tel">
    <option>nokia</option>
    <option>iphone</option>
    <option>samsung</option>
    </select>
    <input type="submit" value="выбрать">
    </form><br>
    <?
    echo $count; // количество записей
    $res = mysql_query("SELECT * FROM tes WHERE tel = '$one' ORDER BY id DESC LIMIT ".$start_pos.", ".$perpage);

    while($mas = mysql_fetch_array($res)){
    echo '<p>'.$mas["name"].' - '.$mas["tel"].'</p>';
    echo "<hr />";
    }
    link_page($page, $count, $pages_count, 7, $one);
    ?>
    </body>
    </html>

    вот исправила include("../test/f_poisc.php");
    Код (Text):
    1. <?
    2. function link_page($page, $count, $pages_count, $show_link, $phone = ''){
    3.  
    4. if ($pages_count == 1) {return false;};
    5.     $sperator = '<strong>|</strong>';
    6.     $style = 'style="color: #800000; text-decoration: none;"';
    7.     $begin = $page - intval($show_link / 2);
    8.     unset($show_dots); // На всякий случай :)
    9.  
    10. // Если количество отображ. ссылок больше кол. страниц
    11.     if ($pages_count <= $show_link + 1) {$show_dots = "no";};
    12. // Вывод ссылки на первую страницу
    13.     if (($begin > 2) && ($pages_count - $show_link > 2)) {
    14.     echo '<a style="color: #000000; text-decoration:none; font-size:12px;" href="'.$_SERVER["PHP_SELF"].'?page=1'.(empty($phone)?'': '&phone='.$phone).'">1</a> ';
    15.     }
    16. // Основный цикл вывода ссылок
    17.     for ($j = 0; $j <= $show_link; $j++)
    18.     {
    19.     $i = $begin + $j; // Номер ссылки
    20.  
    21. // Если страница рядом с началом, то увеличить цикл для того, чтобы количество ссылок было постоянным
    22.     if ($i < 1) continue;
    23. // Подобное находится в верхнем цикле
    24.     if (!isset($show_dots) && $begin > 1) {
    25.     echo '<a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page='.($i-1).(empty($phone)?'': '&phone='.$phone).'"><b>...</b></a> ';
    26.     $show_dots = "no";
    27.     }
    28. // Номер ссылки перевалил за возможное количество страниц
    29.     if ($i > $pages_count) {break;};
    30.     if ($i == $page) {
    31.     echo ' <a style="color: #800000; text-decoration:none;" href='.$_SERVER['PHP_SELF'].'?page='.$i.(empty($phone)?'': '&phone='.$phone).'><strong style="font-family:Verdana, Geneva, sans-serif; font-size:12px;">'.$i.'</strong></b></a> ';
    32.     }
    33.     else {
    34.     echo ' <a style="color: #000000; text-decoration:none;" href='.$_SERVER['PHP_SELF'].'?page='.$i.(empty($phone)?'': '&phone='.$phone).'><strong style="font-family:Verdana, Geneva, sans-serif; font-size:12px;">'.$i.'</strong></a> ';
    35.    }
    36. // Если номер ссылки не равен кол. страниц и это не последняя ссылка
    37.     if (($i != $pages_count) && ($j != $show_link)) {echo $sperator;};
    38. // Вывод "..." в конце
    39.     if (($j == $show_link) && ($i < $pages_count)) {
    40.     echo ' <a '.$style.' href="'.$_SERVER['PHP_SELF'].'?page='.($i+1).(empty($phone)?'': '&phone='.$phone).'">><b>...</b></a> ';
    41.     }
    42.     }
    43. // Вывод ссылки на последнюю страницу
    44.    if ($begin + $show_link + 1 < $pages_count) {
    45.    echo ' <a style="color: #000000; text-decoration:none; font-size:12px;" href="'.$_SERVER['PHP_SELF'].'?page='.$pages_count.(empty($phone)?'': '&phone='.$phone).'"><strong style="font-family:Verdana, Geneva, sans-serif; font-size:12px;">'.$pages_count.'</strong></a>';
    46.    }
    47.    return true;
    48. } // Конец функции
    49.  
    50. // Подготовка к постраничному выводу
    51. $perpage = 3; // Количество отображаемых данных из БД
    52. if (empty($_GET['page']) || ($_GET['page'] <= 0)) {
    53. $page = 1;
    54. } else {
    55. $page = (int) $_GET['page']; // Считывание текущей страницы
    56. }
    57. // Общее количество информации
    58. $count = mysql_num_rows(mysql_query("SELECT * FROM tes WHERE tel = '$one'")) or die ("=(");
    59. $pages_count = ceil($count / $perpage); // Количество страниц
    60. // Если номер страницы оказался больше количества страниц
    61. if ($page > $pages_count) $page = $pages_count;
    62. $start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД
    63. ?>
    захожу на первую стр. все работает, делаю поиск nokia тоже работает, теперь и по ссылкам переходит =), но когда в стр. poisc выбираю ipone или же nokia
    выдает =( mysql_num_rows(mysql_query("SELECT * FROM tes WHERE tel = '$one'")) or die ("=(");

    Страннно?

    Добавлено спустя 5 минут 30 секунд:
    и еще скиньте пожалуйста номер вашего мобильного в личку я перед вами в долгу =) (я конечно не дочь нефтяника но хотя бы сделаю знак благодарности)
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Потому, что скрипт ожидает переменную phone, а на странице poisk.php у тебя в форме не phone, а tel. Измени здесь

    Код (Text):
    1. поиск по телефону<select name="tel">
    tel на phone
     
  7. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    наконецто я думала это никогда не закончится =) спасибо вам sobachnic а вы кажется забыли свой номер отправить вроде в личном разделе нету можно в принципе и сюда отправить я хочу вас отблагодарить =)

    Добавлено спустя 2 минуты 44 секунды:
    и всем остальным тоже БОЛЬШОЕ СПАСИБО это самый лучший форум, серьезно в другом форуме админ написал ишите ошибку и закрыл мою тему =(
     
  8. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    Похоже на игру "Убей БД" :)
    Серьёзно?
    Вы выбираете все записи что бы посчитать из количество? А когда база станет размером пару сотен метров и настройки хостинга позволят делать запрос результат которого меньше размера таблицы - всё перестанет работать.
    Да и вообще, какой смысл выбрать все! записи, посчитать сколько их, а потом опять выбрать но уже с лимитом?
    Зачем два раза выбирать одни и те же записи? Вы же первый раз выбрали их, ну тогда просто выводите ту часть которая нужна без нового запроса к бд.

    Если не понятно о чём я, то представьте, перед вами 100 вёдер воды.
    Что бы посчитать сколько их, вы не просто считаете 1, 2, 3...
    А все вёдра поднимаете, и не опускаете пока не досчитаете до 100.

    Есть такие чудесные функции как COUNT(), FOUND_ROWS(), SQL_CALC_FOUND_ROWS().
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Да Оксана скачала откуда-то эту хрень... :) И приняла как факт, что раз там так написана - значит так и надо, скорее всего :)
     
  10. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    Да вот и беда, сейчас посмотрел вот эту тему viewtopic.php?f=13&t=7193
    Там больше половины примеров так написаны :)
    По всему интернету наверное то же самое, говорят виной всему всё тот же "Великий учитель всех новичков" :)
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Попов страшный человек. Нечестный. Нехороший. Если вдруг кто набьет ему морду - наверное даже не каждый его осудит. Мне снился сон, как я отрезал Попову яйца.
     
  12. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    у всех прошу прошения, но есть еще один вопрос =)

    когда в select вместо nokia ставлю нокия
    то в адресной строке появляется page=2&phone=F2% и т.д
    в базе тоже поменяла nokia на нокия всеровно не работает?
     
  13. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    как наиболее вероятное предположение: в базе кодировка cp1251
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    var_dump($_GET['phone']);

    что покажет?
     
  15. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    string(12) "нокиа" и выводит else { нет записей }
    ну у меня там немного другой пример шас напишу

    $id = $_GET["id"];
    $res = mysql_query("SELECT phone FROM type_org WHERE id = '$id'", $db);
    $row = mysql_fetch_array($res); и переменную $row вставляю в скрипт постраничного вывода

    Добавлено спустя 1 минуту 11 секунд:
    да кстати кодировка на самом деле 1251, ut8 лучше?
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да пофик. четвертый раз говорю о том что у вас в коде ДЫРА =)

    пока вы ее не исправите, о кодировке можно не париться - сайт все равно не жилец
     
  17. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    поменяла кодировку на 8, каракули ?

    Добавлено спустя 1 минуту 51 секунду:
    а где именно дырка =) ?
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тут.
    $id = $_GET["id"];
    $res = mysql_query("SELECT phone FROM type_org WHERE id = '$id'", $db);

    нельзя бездумно писать в запрос то что прислали. нужно пользоваться http://www.php.ru/manual/function.mysql-real-escape-string.html


    а кодировка утф очень удобна, да.
     
  19. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  20. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    mysql_real_escape_string я вставила просто тут написала без него чтоб легче код просматривать =)

    может помните мое самое первое сообщение там вы мне сделали замечание =) про mysql_real_escape_string

    Добавлено спустя 5 минут 22 секунды:
    а что еще посоветуете когда в select русское значение?
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это не в случае ресского значения. это всегда надо делать.

    вы кодировку победили?
     
  22. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    поменяла на 8 каракули, оставила 1251

    Добавлено спустя 50 секунд:
    нет select я имела виду постраничный вывод =)
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну так вы далеко не уедите =)

    побеждайте кодировку
     
  24. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    все исправила теперь ищет, если в select русское значение, но как всегда у меня опять проблема =(

    если в select (слово без пробелов) например сумка то все отлично работает

    а если в select (слово с пробелами) например спортивная куртка то page1 в адресной строке выводит полное название а page2 выводит только спортивная

    вначале вместо пробела вставила _ спортивная_куртка все работает но внешне не смотрится

    потом сделала проверку if ($cat == "спортивная") { $cat = "спортивная куртка"; }; думала проблема решена =)

    но если будет категория спортивная обувь то он выдает спортивная куртка

    как сделать чтобы переходя на вторую страницу, слово после пробела не проподала?
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вам надо учиться дебагать самостоятельно.
    вы точно передаете на вторую страницу слово "сумка"?