За последние 24 часа нас посетил 18831 программист и 1644 робота. Сейчас ищут 872 программиста ...

Не удается сделать запрет кеширования страницы.

Тема в разделе "PHP для новичков", создана пользователем heee, 7 авг 2008.

  1. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Вощем, проблема такая: есть два файла profile.php и edit.php. Profile.php отображает страницу личных данных пользователя (данные берутся из базы). Пользователь меняет что-то. Cкрипт edit.php делает изменение в базе и переадресует на страницу profile.php. Profile.php берет новые данные из базы, но из-за кеширования на странице все остается без изменений. Если нажать "Обновить", то будут видны новые данные. Но так дело не пойдет. На форуме есть уже такая тема - там написано, то нужно сделать для запрета кеширования - вставить в начало документа(кот. нельзя кешировать) такие строки:

    Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    Header("Cache-Control: no-cache, must-revalidate");
    Header("Pragma: no-cache");
    Header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");

    или же тоже самое на HTML в тегах <META>

    Но ни то ни другое не помогает. Все равно приходится нажимать "Обновить". Еще видел такие варианты заголовков:
    Header("Expires: 0");
    Header("Cache-Control: no-store, no-cache, must-revalidate");
    Header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

    И везде пишут, что не будет кешировать, но у меня не работает НИКАКОЙ вариант.

    HELP PLEASE!!!! :(
     
  2. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Значит не берет. Кэширование тут не причем
     
  3. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Благодарен за такое пристальное внимание, НО. Еще раз повторюсь. При нажатии "Обновить" все изменения видны на странице. Если и это не убеждает вас в неверности вашего высказывания, то тогда могу еще вот что сказать - в PHPMyAdmin в соответствующей таблице все изменения видны... Так что это тут не причем, а кеширование как раз причем
     
  4. Anonymous

    Anonymous Guest

    Не. Не берет. Я тоже знаю, в чем дело. Кеширование тут непричем... А вот мух от котлет надо отделять.
     
  5. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Ну и в чем дело если знаете? Очень нужно узнать
     
  6. Anonymous

    Anonymous Guest

    Код покажи.
     
  7. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Этот кусок берет и показывает:
    Код (Text):
    1.  
    2. $mytname = $_GET['tn'];
    3. $myid = $_GET['nid'];
    4. $myname = $_GET['nname'];
    5. $myname = UrlDecode($myname);
    6. $mymail = $_GET['nmail'];
    7.  
    8. $mr2 = mysql_query("SELECT * FROM `$mytname` WHERE f_id = \"$myid\" and f_name = \"$myname\" and f_email = \"$mymail\"");
    9. $f2 = mysql_fetch_array($mr2);
    10.  
    11. $www = str_replace("http://", "", "$f2[f_www]");
    12.  
    13. echo "<tr><td>Наименование:</td><td> </td><td><input type='text' name='name' value=\"$f2[f_name]\" size='50' maxlength='50'></td></tr>";
    14.  
    15. echo "<tr><td>Город:</td><td> </td><td><input type='text' name='city' value=\"$f2[f_city]\" size='50' maxlength='50'></td></tr>";
    16.  
    17. echo "<tr><td>Адрес:</td><td> </td><td><input type='text' name='address' value=\"$f2[f_address]\" size='50' maxlength='50'></td></tr>";
    18.  
    19. echo "<tr><td>Код - Телефон:</td><td> </td><td><input type='text' name='phone' value=\"$f2[f_phone]\" size='50' maxlength='50'></td></tr>";
    20.  
    21. echo "<tr><td>Факс:</td><td> </td><td><input type='text' name='fax' value=\"$f2[f_fax]\" size='50' maxlength='50'></td></tr>";
    22.  
    23. echo "<tr><td>Адрес в интернете:</td><td> </td><td><input type='text' value='http://' size='5' readonly><input type='text' name='www' value=\"$www\" size='42' maxlength='50'></td></tr>";
    24.  
    25. echo "<tr><td>Информация:</td><td> </td><td><TEXTAREA name='info' cols='37' rows='5' wrap='virtual'>$f2[f_info]</TEXTAREA></td></tr>";
    26.  
    27. echo "<input type='hidden' name='hid' value=\"$f2[f_id]\">";
    28. echo "<input type='hidden' name='htname' value=\"$mytname\">";
    Этот изменяет:
    Код (Text):
    1.  
    2. $empty[0] = "Нет данных";
    3. $empty[1] = "Нет информации";
    4. $http = "http://";
    5. $tablename = $_POST['htname'];
    6. $myid = $_POST['hid'];
    7.  
    8. /* Эти поля никогда не будут пустыми */
    9. $toparse_name = HtmlSpecialChars($_POST['name']);
    10. $toparse_city = HtmlSpecialChars($_POST['city']);
    11. $toparse_phone = HtmlSpecialChars($_POST['phone']);
    12.  
    13. /* Эти поля могут быть пустыми */
    14. if ($_POST['address'] == "") { $toparse_address = $empty[0]; }
    15. else { $toparse_address = HtmlSpecialChars($_POST['address']); }
    16.  
    17. if ($_POST['fax'] == "") { $toparse_fax = $empty[0]; }
    18. else { $toparse_fax = HtmlSpecialChars($_POST['fax']); }
    19.  
    20. if ($_POST['www'] == "") { $toparse_www = $empty[0]; }
    21. else { $toparse_www = HtmlSpecialChars($http.$_POST['www']); }
    22.  
    23. if ($_POST['info'] == "")   { $toparse_info = $empty[1]; }
    24. else { $toparse_info = HtmlSpecialChars($_POST['info']); }
    25.  
    26. $lock = mysql_query("LOCK TABLES `$tablename` WRITE");
    27. $q = mysql_query("UPDATE `$tablename` SET f_name = \"$toparse_name\", f_city = \"$toparse_city\", f_address = \"$toparse_address\", f_phone = \"$toparse_phone\", f_fax = \"$toparse_fax\", f_www = \"$toparse_www\", f_info = \"$toparse_info\" WHERE f_id = \"$myid\"");
    28. $lock = mysql_query("UNLOCK TABLES");
     
  8. Anonymous

    Anonymous Guest

    Угу. А в каком порядке они исполняются?
     
  9. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Пользователь попал на страницу, содержащую верхний кусок(называется profile.html).
    Если нажал кнопку формы "применить", то выполняется нижний кусок.

    Вот это еще для верхнего куска:
    Код (Text):
    1.  
    2. echo "<input type='hidden' name='hmail' value=\"$f2[f_email]\">";
    А это для нижнего куска:
    Код (Text):
    1.  
    2. $mymail = $_POST['hmail'];
    В нижнем куске переадресация подразумевалась:
    Код (Text):
    1.  
    2. $toparse_name = UrlEncode($toparse_name);
    3. $adr = "http://".getenv("SERVER_NAME")."/profile.html?nid=$myid&nname=$toparse_name&nmail=$mymail&tn=$tablename";
    4. echo "<SCRIPT>document.location.href='$adr'</SCRIPT>";
     
  10. Anonymous

    Anonymous Guest

    Ну о чем и мы. Если ты ему сначала ПОКАЗАЛ (исполнился верхний кусок) профиль, а потом ОБНОВИЛ(исполнился нижний кусок), естественно, что изменения он увидит уже после рефреша.
     
  11. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Верхний кусок исполняется первый раз. Юзер нажал кнопку применить. Выполнился нижний скрипт, это значит:
    1. что изменения в базе сделаны;
    2. пользователь переадресован снова на профиль(значит верхний кусок выполнился еще раз), в начале которого данные (новые они или старые) берутся из базы.

    Так? По-мойму - так. Вобщем, как тогда нужно сделать чтобы, отображались новые данные?
     
  12. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Ответа в чем дело так и не последовало. Доказать что это НЕ из-за кэширования страниц браузером тоже никто не доказал. Решение никто не подсказал ну и не надо, сам додумался: +1 строчка кода и теперь у меня все работает. Кому надо - в личке скажу как.

    P.S. И причина все-таки в НЁМ.
     
  13. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    heee, давай в общую. Не верю что это кэширование. Если ты насильно обновляешь страницу это не решение, а костыли. Где-то в алгоритме у тебя нарушена последовательность: видимо ты отображаешь данные, а потом их изменяешь. Вероятнее всего тебе уже об этом говорили (нет времени прочитать топик целиком). Внимательно разложи на блоки, даже построй на бумаге блок-схему. И ты найдешь где косяк
     
  14. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Была такая тупая идея - насильно обновить. Но дальше идеи это никуда не пошло. А пошло то, что когда выполнился скрипт изменения данных (нижний кусок), то он переадресует на страницу profile.html не с такими параметрами

    Код (Text):
    1. $adr = "http://".getenv("SERVER_NAME")."/profile.html?nid=$myid&nname=$toparse_name&nmail=$mymail&tn=$tablename";
    а с добавлением, например, time() в URL, т.е. как бы перекидывая пользователя всегда на новую страницу. В этом то и штука - так работает, а без дополнительного параметра(который как бы говорит браузеру, что такой страницы еще не было) в URL работает только после обновления.

    Так что, как было в начале поста мое мнение, что все проблемы из-за кэша, так оно и осталось. Разве это не подтверждение ^^?
     
  15. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    heee, да ну не так ты понимаешь кеширование. Вот, например, была у тебя картинка на страничке в качестве бекраунда или файлик со стилями подключается, но легче на картинке будет показать. Так вот. Картинку ты изменяешь, но имя файла с картинкой остается неизменным. Вот тогда-то и могут появиться косяки.
    А так, браузер показывает те и только те данные которые ты ему сервером выкидываешь. И если ты выкидываешь "Вася", а тебя появляется "Петя", то это значит ты где-то промазал.
    Верно я размышляю, великие гуру? :)
     
  16. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Я попрежнему убежден в своей правоте т.к., например, ради эксперимента брал простейший скрипт, выводящий время (ЧЧ:ММ:СС), запустил один раз - нормально, запустил другой раз - и как ты думаешь что там было? Было время, которое показалось при первом запуске...
     
  17. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Код (Text):
    1. <?php
    2.  echo rand(1,10);
    3. ?>
    У тебя выдает постоянно то же число? О_о. Ну тогда можешь застрелиться :) Не хотел нагрубить, просто жить дальше нет смысла. :):)
     
  18. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    Ухаха, иди лучше ты свой мозг расстреляй, кроме излишней остроты хоть один бы дельный совет выдал.
     
  19. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    heee, мало того что руки карявые, так еще и слепой.
    Считаешь, что все правильно сделал и тебе тут херню советуют, - уёбуй нахер, а не ори "я тут самый правильный а вы все нихера не понимаете". Ппц, от куда такие самородки приходят.
     
  20. heee

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

    С нами с:
    7 авг 2008
    Сообщения:
    28
    Симпатии:
    0
    У тебя параноя?? Не могу помочь. Я и не говорил ничего подобного. Протри зрачки.

    Ты походу и правда тупой, я же сказал - не одного совета не было, и это правда.