Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [html/php] Walidacja vs <meta http-equiv='Refresh' content='
Forum PHP.pl > Forum > Przedszkole
Jarod
Mam następujący problem. Potrzebuję w skrypcie przekierować użytkownika na jakąś stronę. Jeśli mogę to używam header.

Ale czasami potrzebuję przekierować po upływie np 3 sekund. W tym celu zastosowałem coś takiego:

Kod
<meta http-equiv='Refresh' content='3; url=index.php' />


Niestety walidator się pluje;
Cytat
Line 21 column 481: document type does not allow element "meta" here.

...='Refresh' content='3; url=index.php' />

The element named above was found in a context where it is not allowed. This could mean that you have incorrectly nested elements -- such as a "style" element in the "body" section instead of inside "head" -- or two elements that overlap (which is not allowed).

One common cause for this error is the use of XHTML syntax in HTML documents. Due to HTML's rules of implicitly closed elements, this error can create cascading effects. For instance, using XHTML's "self-closing" tags for "meta" and "link" in the "head" section of a HTML document may cause the parser to infer the end of the "head" section and the beginning of the "body" section (where "link" and "meta" are not allowed; hence the reported error).


Jak obejść ten problem?
siemakuba
Cytat
For instance, using XHTML's "self-closing" tags for "meta" and "link" in the "head" section of a HTML document may cause the parser to infer the end of the "head" section and the beginning of the "body" section (where "link" and "meta" are not allowed; hence the reported error).
A jaki masz DOCTYPE? Jeżeli HTML to powyższy cytat, który zresztą sam pokazałeś wszystko tłumaczy - napiszesz <meta> w HTML zamiast XHTML i będzie ok ( zamiast /> na końcu poprostu >). Jeżeli masz XHTML, to pokaż cały nagłówek HEAD dokumentu, ta jedna linika wydaje się być prawidłowa w takim kontekście.

pozdr.
Jarod
  1. <?php
  2. session_name('tb');
  3. include 'config.inc.php';
  4. ?>
  5.  
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl">
  8.  
  9. <head> 
  10. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  11. <meta http-equiv="Content-language" content="pl" />
  12. <meta name="Robots" content="all" />
  13. <meta name="Pragma" content="no-cache" />
  14. <meta name="Cache-Control" content="no-store, no-cache, must-revalidate" />
  15.  
  16.  
  17. <!-- dołączenie styli głównych -->
  18. <link rel="stylesheet" href="../css/autoryzacja.css" type="text/css" />
  19. </head>
  20. <body>
  21.  
  22. <?php
  23.  
  24. //$kontoId - numer ID użytkownika, któremu aktualizujemy hasło
  25. //$stareHaslo  - stare hasło, które użytkownik podał w formularzu
  26. //$noweHaslo, $noweHaslo2 - nowe hasła, które użytkownik podał w formularzu
  27. //$hasloBaza - dotychczasowe hasło użytkownika (pobrane z bazy)
  28.  
  29. //Połączenie z bazą danych
  30. $conn = mysql_connect($server, $identyfikator, $haslo)
  31. or die ('Nie udało się połączyć z bazą danych!');
  32. //Wybór bazy danych
  33. or die ('Nie udało się wybrać bazy!');
  34.  
  35. if ( ($_POST['hasloBaza'] == SHA1($_POST['stareHaslo'])) &&
  36.  ($_POST['noweHaslo'] == $_POST['noweHaslo2']) &&
  37.  ($_POST['noweHaslo'] != $_POST['stareHaslo']) &&
  38.  ( !empty($_POST['noweHaslo'])) )
  39. {
  40. //Zapytanie o dane użytkownika
  41. $query = 'UPDATE konto SET haslo=''.SHA1($_POST['noweHaslo']).'', waznosc=1 WHERE konto_id='.$_POST['kontoId'];
  42. $result = mysql_query($query)
  43. or die ('Zapytanie nieudane!');
  44. $query_data = mysql_fetch_row($result);
  45.  
  46. echo '<div class="ostrzezenie" style="margin: 160px auto; padding: 30px 0; font-size: 12px; font-weight: bold; color: #FF9C12; background-color: #FFFFFF; border: 1px #FF9C12 solid;">Hasło zostało zmienione...</div>';
  47. echo '<meta http-equiv="Refresh" content="3; url=index.php" />';
  48. }
  49. else
  50. {
  51. echo '<div id="log" style="padding: 10px; background-color: #FFFFFF; width: 550px; height: 85px;">';
  52. echo '<img style="float: left; margin: 0 0 0 30px;" src="../img/stop.gif" width="83px" height="83px" alt="Stop" name="Stop" border="0" />';
  53.  
  54. echo '<div class="ostrzezenie" style="margin: 25px 0 0 25px; padding: 10px; width: 380px; text-align: center; font-size: 11px; font-weight: bold; float: left;" >';
  55.  
  56. if ( $_POST['hasloBaza'] != SHA1($_POST['stareHaslo']) ) echo 'Stare hasło jest nieprawidłowe !';
  57. else if ( $_POST['noweHaslo'] != $_POST['noweHaslo2'] ) echo 'Wprowadzono dwa różne hasła !';
  58. else if ( $_POST['noweHaslo'] == $_POST['stareHaslo'] ) echo 'Nowe hasło nie może być takie samo jak stare !';
  59. else if ( empty($_POST['noweHaslo']) ) echo 'Nie wprowadziłeś nowego hasła !';
  60.  
  61. echo '</div>';
  62. echo '</div>';
  63. echo '<meta http-equiv="Refresh" content="3; url=index.php" />';
  64. }
  65. ?>
  66.  
  67. </body>
  68. </html>
  69.  
  70. <?php
  71. ?>
siemakuba
Linia 50 - robisz echo <meta... meta musi sie znajdować w sekcji HEAD, a ty wyświetlasz je w BODY. Nie tędy droga :)

pozdr.
Jarod
Cytat(siemakuba @ 18.06.2006, 21:54 ) *
Linia 50 - robisz echo <meta... meta musi sie znajdować w sekcji HEAD, a ty wyświetlasz je w BODY. Nie tędy droga smile.gif

pozdr.


Hehe smile.gif To ja wiem. Pytanie jak? Użyłbym headera ale nie ma opóźnienia czasowego tak jak w meta :/
siemakuba
delikatna podpowiedź: najpierw wykonaj wszystkie operacje które sprawdzają te historie z uzytkownikiem, a potem na podstawie ich wyniku decyduj co dalej robić - wyświetlać HTML czy przekierowywać.

Z taką zupą w kodzie z każdym dodaniem czegokolwiek będzie coraz gorzej... przemyśl reorganizację skryptów.

Delikatna podpowiedź nr2: zamiast robić wszędzie echo, zbieraj ten kod HTML do zmiennej, i wyświetlaj na koniec. To już sopro uprości, będziesz np. mógł zrobić przekierowanie w php za pomocą header w dowolnym miejscu nie martwiąc się o to czy już wysłałeś nagłówki czy nie.

Aha, co ma dać te opóźnienie czasowe? Że user będzie musiał sobie poczekać? Nie potrafię sobie tego jakoś wyobrazić...

pozdr.
Jarod
Cytat(siemakuba @ 18.06.2006, 22:43 ) *
Aha, co ma dać te opóźnienie czasowe? Że user będzie musiał sobie poczekać? Nie potrafię sobie tego jakoś wyobrazić...


To, że będzie mógł przeczytć komunikat błędu zanim zostanie przekierowany na stronę logowania
siemakuba
eee, a co jak np. po naciśnięciu przycisku zaloguj użytkownik spojrzy w okno bo za oknem z 11 piętra będzie spadał jakiś facet? Minie 3 sekundy, które dałeś mu na przeczytanie komunikatu i ponownie spoglądając na ekran zobaczy formularz logowania. I wtedy pomyśli: "Hmmm, coś nie działa, przecież się logowałem.. Ale nic zaloguje się jeszcze raz". Więc spróbuje ponownie, ale tym razem do pokoju wejdzie przełożony, i nasz biedny użytkownik znów nie zdąży przeczytać komunikatu o błędzie...

Do czego zmierzam - daj szanse na przeczytanie komunikatu! Uzytkownicy z reguły nie czytają komunikatów, a ty jeszcze im to utrudniasz. Niech po błędnym logowaniu poprostu ponownie wyświetli się formularz ze stosowną informacją. Tobie będzie prościej, i nasz użytkownik przeczyta na pewno co powinien przeczytać.

pozdr.
nospor
przeciez ty ten kod:
  1. <?php
  2. echo '<meta http-equiv="Refresh" content="3; url=index.php" />';
  3. ?>
wstawiasz zarowno w if jak i w else, czy za kazdym razem sie pojawi. walnij go wiec od razu do head bez zadnych warunkow. po co tak sie czaic?

@siemakuba
Cytat
eee, a co jak np. po naciśnięciu przycisku zaloguj użytkownik spojrzy w okno bo za oknem z 11 piętra będzie spadał jakiś facet? Minie 3 sekundy, które dałeś mu na przeczytanie komunikatu i ponownie spoglądając na ekran zobaczy formularz logowania.
Przyklad z zycia wziety? winksmiley.jpg
Jarod
Cytat(nospor @ 19.06.2006, 09:28 ) *
przeciez ty ten kod:
  1. <?php
  2. echo '<meta http-equiv="Refresh" content="3; url=index.php" />';
  3. ?>
wstawiasz zarowno w if jak i w else, czy za kazdym razem sie pojawi. walnij go wiec od razu do head bez zadnych warunkow. po co tak sie czaic?



Bo ma przekierować 3 sekundy po dodaniu użytkownika do bazy a nie 3 sekundy od załądowania skryptu winksmiley.jpg
nospor
Cytat
Bo ma przekierować 3 sekundy po dodaniu użytkownika do bazy a nie 3 sekundy od załądowania skryptu
nie, no faktycznie, przeciez prosta operacja na bazie trwa 10 sekund. zapomnialem.... winksmiley.jpg

A na powaznie. proponuje czytac co robią funkcje ktorych uzywasz:
http://pl.php.net/manual/pl/function.ob-start.php
siemakuba
Cytat(nospor @ 19.06.2006, 11:28 ) *
@siemakuba
Przyklad z zycia wziety? ;)

nie, mamy tylko 9 pięter w budynku :P

pozdr.
Jarod
Cytat(nospor @ 19.06.2006, 09:36 ) *
nie, no faktycznie, przeciez prosta operacja na bazie trwa 10 sekund. zapomnialem.... winksmiley.jpg


Nie ważne ile? Skąd wiesz jak bardzo będą w przyszłości skomplikowane zapytania?

Cytat(nospor @ 19.06.2006, 09:36 ) *
A na powaznie. proponuje czytac co robią funkcje ktorych uzywasz:
http://pl.php.net/manual/pl/function.ob-start.php


Teraz Ty mnie oświeć bo nie wiem o co Ci chodzi.. smile.gif
nospor
Zadam glupie pytanie. W jakim celu uzywasz ob_start() ? Bo kiedys u kogos to zobaczyles i pomyslales ze jest cool? winksmiley.jpg

Cytat
This function will turn output buffering on. While output buffering is active no output is sent from the script....To output what is stored in the internal buffer, use ob_end_flush().

Po polsku: dopoki nie wywolasz ob_end_flush nic ci do przegladarki nie poleci z kodu co generujesz

@siemakuba to bylo pytanie retoryczne tongue.gif
Jarod
Cytat(nospor @ 19.06.2006, 10:03 ) *
Zadam glupie pytanie. W jakim celu uzywasz ob_start() ? Bo kiedys u kogos to zobaczyles i pomyslales ze jest cool? winksmiley.jpg


Rozbrajasz mnie smile.gif Używam ponieważ konfiguracja niektórych serwerów nie pozwala na poprawne działanie skryptów. Nie chce mi się później tego poprawiać jak ktoś mi powie że mu nie działa.

Cytat(nospor @ 19.06.2006, 10:03 ) *
Po polsku: dopoki nie wywolasz ob_end_flush nic ci do przegladarki nie poleci z kodu co generujesz


Czyli wychodzi na to, że spokojnie mogę dać w head do meta?
nospor
Cytat
Rozbrajasz mnie Używam ponieważ konfiguracja niektórych serwerów nie pozwala na poprawne działanie skryptów.
Kto tu kogo rozbraja to juz nie powiem smile.gif
uzywa sie ob_start() gdyz ono hamuje wyslanie roznych rzeczy do przegladarki. A jest to konieczne, gdy niekore funkcje jak session_start, header i inne wymagaja, by nic nie poszlo do przegladarki przed ich wywolaniem. I wlasnie dlatego nalezy stosowac ob_start(). No ale to jest w manualu

Cytat
Czyli wychodzi na to, że spokojnie mogę dać w head do meta?
tak. a nastepnym zrob eskperyment. wstaw to do head, opoznij skrypt i zobacz keidy cie przekieruje

edit: przenosze. Na "po stronie przegladarki" to juz nie pasuje
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.