Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: header
Forum PHP.pl > Forum > Przedszkole
hmmm
mam skrypt obslugujacy formularz.
to jest fragment (wczesniej mam tylko polaczenie z baza i stworzenie funkcji escape_data):
  1. <?php
  2. if (isset($_POST['submit'])) {
  3. $message = NULL;
  4. //jesli cookie nie istnieje
  5. if (!isset($_COOKIE['admin'])) {
  6. if ((strlen($_POST['nick']) == 0) OR (in_array($_POST['nick'], $donotuse))) {
  7. $nick1 = FALSE;
  8. $message .= &#092;"podaj imie lub nick;<br />n nie mozesz uzyc: \" . implode(', ', $donotuse) . \".<br />n\";
  9. } else {
  10. $nick1 = escape_data($_POST['nick']);
  11. }
  12. if (strlen($_POST['email']) == 0) {
  13. $email1 = TRUE;
  14. } else {
  15. $email1 = escape_data($_POST['email']);
  16. }
  17. //jezeli cookie istnieje
  18. } else {
  19. $nick1 = &#092;"niewazne86\";
  20. $email1 = &#092;"niewazne86@o2.pl\";
  21. }
  22. if (strlen($_POST['content']) == 0) {
  23. $content1 = FALSE;
  24. $message .= &#092;"podaj tresc wpisu.<br />n\";
  25. } else {
  26. $content1 = escape_data($_POST['content']);
  27. }
  28. if ($nick1 && $email1 && $content1) {
  29. $query = &#092;"INSERT INTO book (nick, datetime, email, content) VALUES ('$nick1', NOW(), '$email1', '$content1')\";
  30. $result = @mysql_query($query);
  31. if ($result) {
  32. header (&#092;"Location: http://\" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . \"/book.php?link=0\");
  33. exit();
  34. }
  35. }
  36. }
  37. ?>

skrypt ten znajduje sie w pliku bookaddcheck.inc, ktory jest includowany do book.php. sam formularz rowniez jest includowany - z pliku bookadd.inc do tego samego pliku.

problem polega na tym, ze po kliknieciu na 'dodaj wpis' rekordy sa dodawane do bazy danych, ale zamiast przeniesc na book.php?link=0 (pierwsza strona ksiegi gosci) w naglowku dalej zostaje book.php?link=bookadd.

prosze o pomoc i z gory dziekuje :)
uli
Moze jestem poczatkujacy, ale co tam robi ta @ w wierszu 32? Przeciez php potraktuje ja jak cos zbednego i wykona query, ale za to nigdy nie bedziesz miec spelnionego warunku w 33.
hmmm
@ oznacza brak zwracania bledow ;)

no ale, wie ktos moze dlaczego header nie przenosci mnie pod wskazany adres?
crash
Skrypt nie zwraca niczego przed wywołaniem header? Sprawdź czy w ogóle dochodzi do tego miejsca, daj na przykład zaraz przed header: echo 'tutaj';
hmmm
  1. <?php
  2. if ($result) {
  3. echo 'tutaj';
  4. header (&#092;"Location: http://\" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . \"/book.php?link=0\");
  5. exit();
  6. }
  7. ?>

dopisalem echo i zwraca mi :/ nie rozumiem. poza tym wpisy sa dodawane do bazy danych, a zamiast przeniesc mnie w naglowku pozostaje dalej book.php?link=bookadd
crash
Hmm a nie jest tu może problemem dirname? Bo pod Winda to zwraca \ które nie mogą występować w URL'ach.
hmmm
czyli jak? sam powinienem wpisac adres?

wczesniej dirname dobrze mi dzialal w innej ksiedze, no ale sprawdze :)

UPDATE
---------
zmienilem na:
  1. <?php
  2. header (&#092;"Location: http://localhost/babeblog/book.php?link=0\");
  3. ?>
ale dalej to samo - nie dziala :/

myslalem moze, ze to bledy w IE, ale pod FF tak samo :|
xardas
Na początku strony z kodem php (na SAMYM początku)
  1. <?php ob_start(); ?>
crash
Hmm dziwne dziwne, a error_reporting(E_ALL) coś konkretnego podaje?
hmmm
dodalem error_reporting(E_ALL) w tym miejscu:
  1. <?php
  2. if ($nick1 && $email1 && $content1) {
  3. $query = &#092;"INSERT INTO book (nick, datetime, email, content) VALUES ('$nick1', NOW(), '$email1', '$content1')\";
  4. $result = @mysql_query($query);
  5. if ($result) {
  6. header (&#092;"Location: http://\" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . \"/book.php?link=0\");
  7. exit();
  8. }
  9. }
  10. ?>

i zwrocilo mi:

Warning: Cannot modify header information - headers already sent by (output started at c:\inetpub\wwwroot\babeblog\book.php:1) in c:\inetpub\wwwroot\babeblog\inc\bookaddcheck.inc on line 54

a rekord mimo to zostal dodany
crash
Cytat
output started at c:\inetpub\wwwroot\babeblog\book.php:1

Musisz mieć pustą linię na początku pliku...
hmmm
przestudiowalem caly skrypt, przeczytalem artykul ... ale nie znalazlem :|

plik z skryptem jest includowany do book.php, a na samym poczatku book.php mam cos takiego:
  1. <?php
  2. if (isset($_GET['link'])) {
  3. if ($_GET['link'] == 'bookadd') {
  4. @include('inc/bookaddcheck.inc');
  5. }
  6. }
  7.  
  8. include('inc/head.inc');
  9. ?>
  10.  
  11. <!-- dalej kod html -->

z kolei bookaddcheck.inc to (caly kod):
  1. <?php
  2. //polacz z baza
  3. include('connect.inc');
  4. $db = mysql_connect($host, $user, $pass) or die (&#092;"blad w polaczeniu z hostem:<br />n\" . mysql_error() . \"n\");
  5. mysql_select_db($name, $db) or die (&#092;"blad w wybieraniu bazy:<br />n\" . mysql_error() . \"n\");
  6.  
  7. //funkcja poprzedzajaca znakiem odwrotnego ukosnika wszystkie problematyczne znaki
  8. function escape_data ($data) {
  9. //jezeli dane zostaly juz przepuszczone przez magic quotes
  10. //usun wprowadzone ukosniki przed znakami specjalnymi
  11. if (ini_get('magic_quotes_gpc')) {
  12. $data = stripslashes($data);
  13. }
  14. //dodaj odwrotne ukosniki przed znakami specjalnymi
  15. //usun niepotrzebne odstepy
  16. }
  17.  
  18. //includuj plik z nickami ktore moze uzywac wylacznie administrator
  19. include('inc/donotuse.inc');
  20.  
  21. if (isset($_POST['submit'])) {
  22. $message = NULL;
  23. //jesli cookie nie istnieje
  24. if (!isset($_COOKIE['admin'])) {
  25. if ((strlen($_POST['nick']) == 0) OR (in_array($_POST['nick'], $donotuse))) {
  26. $nick1 = FALSE;
  27. $message .= &#092;"podaj imie lub nick;<br />n nie mozesz uzyc: \" . implode(', ', $donotuse) . \".<br /><br />n\";
  28. } else {
  29. $nick1 = escape_data($_POST['nick']);
  30. }
  31. if (strlen($_POST['email']) == 0) {
  32. $email1 = TRUE;
  33. } else {
  34. $email1 = escape_data($_POST['email']);
  35. }
  36.  
  37. //jezeli cookie istnieje
  38. } else {
  39. $nick1 = &#092;"niewazne86\";
  40. $email1 = &#092;"niewazne86@o2.pl\";
  41. }
  42. if (strlen($_POST['content']) == 0) {
  43. $content1 = FALSE;
  44. $message .= &#092;"podaj tresc wpisu.<br />n\";
  45. } else {
  46. $content1 = escape_data($_POST['content']);
  47. }
  48. if ($nick1 && $email1 && $content1) {
  49. $query = &#092;"INSERT INTO book (nick, datetime, email, content) VALUES ('$nick1', NOW(), '$email1', '$content1')\";
  50. $result = @mysql_query($query);
  51. if ($result) {
  52. header (&#092;"Location: http://\" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . \"/book.php?link=0\");
  53. exit();
  54. }
  55. }
  56. }
  57.  
  58. //zamknij polaczenie z baza
  59. ?>
Ociu
Jeśli to twój cały kod, to odpowiedź masz we fragmencie artykułu.
Cytat
Warning: Cannot modify header information - headers already sent by (output started at plik.php:10) in plik.php on line n

Oznacza to, że już jakieś informacje zostały wysłane do przeglądarki (echo, print, czy nawet spacja przed <?php ). Rozwiązaniem problemu jest skasowanie wszystkiego przed <?php, lub wpisanie na początku pliku funkcji uruchamiającej buforowanie: ob_start(). Gdy chcemy opróżnić bufor wywołujemy funkcję ob_flush() (bez kończenia buforowania), lub ob_end_flush() (kończy buforowanie)

pozdrawiam

edit:
oczywiście polecam ten drugi sposób.
hmmm
przeciez napisalem, ze czytalem ...
wiem, ze zadne dane nie powinny zostac wyslane do przegladarki i tu twki moj problem, bo w ktorym miejscu w moim kodzie takie dane zostaly wyslane?
nie umieszczalbym kodu, jezeli sam bym do tego doszedl, ale nie znalazlem dlatego tak bardzo mnie zastanawia, dlaczego nie dziala ...
crash
Przecież błąd, który się pojawia jasno wskazuje gdzie pojawiają się te niechciane dane, sprawdź po prostu co tam masz i popraw.
hmmm
moze glupie pytanie, ale ... jak mam liczyc?
<?php - to jest pierwsza linijka? czy dopiero od nastepnej ... i jeszcze jedno - jak kod jest dlugi i zostanie zawiniety, to czesc kodu wtracona do nastepnej linii tez liczyc? chyba nie, co?


UPDATA
----------
policzylem <?php jako pierwsza linie i blad jest w lini 64, a to:
  1. <?php
  2. header (&#092;"Location: http://\" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . \"/book.php?link=0\");
  3. ?>
crash
Nie ta linia, błąd w przypadku header podaje jeszcze gdzie pojawiają się dane, zobacz dokładniej...
hmmm
Warning: Cannot modify header information - headers already sent by (output started at c:\inetpub\wwwroot\babeblog\book.php:1) in c:\inetpub\wwwroot\babeblog\inc\bookaddcheck.inc on line 64

  1. <?php
  2. //linia 59
  3. if ($nick1 && $email1 && $content1) {
  4. $query = &#092;"INSERT INTO book (nick, datetime, email, content) VALUES ('$nick1', NOW(), '$email1', '$content1')\";
  5. $result = @mysql_query($query);
  6. if ($result) {
  7. header (&#092;"Location: http://\" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . \"/book.php?link=0\");
  8. exit();
  9. }
  10. }
  11. }
  12.  
  13. //zamknij polaczenie z baza
  14. ?>

czyli niby w ktorej linii bo nie rozumiem :/


EDIT
------
dodam tylko, ze kod tego pliku konczy sie na tym, co tu wkleilem - dalej nic nie ma.
i jeszcze jedno ... jak na poczatku kodu w pliku bookaddcheck.inc dalem funkcje ob_start(); to mimo to zwracalo mi blad, ze 'headers already sent ...'
Ociu
A dałeś ob_end_flush(); ?
crash
Masz błąd w pliku c:\inetpub\wwwroot\babeblog\book.php w linii: 1 zobacz co tam masz? html? spacje?
hmmm
heh ... to raczej niemozliwe :P
wlasciwie, to nie wiem, dlaczego sie smieje :| bo juz zaczyna mnie to irytowac.

tak wyglada poczatek kodu book.php
  1. <?php
  2. if (isset($_GET['link'])) {
  3. if ($_GET['link'] == 'bookadd') {
  4. include('inc/bookaddcheck.inc');
  5. }
  6. }
  7.  
  8. include('inc/head.inc');
  9. ?>
  10. <body>
  11.  
  12. <!-- dalsza czesc kodu html -->
  13. <!-- i kodu php -->
po domknieciach klamr i sredniku nie ma zadnych spacji ... nigdzie nie ma zadnych spacji ...

tresc head.inc chyba nie musze wklejac, bo w koncu jest wykonywane pozniej ...
aleksander
no wlasnie. Jeżeli PRZED header masz html (a widze to po kodzie) to nic dziwnego, że Ci nie działa. Wywal html smile.gif
hmmm
jak to przed header?
przeciez header mam w pliku bookaddcheck.inc, ktory jest includowany przed plikiem head.inc, w ktorym dopiero sa pierwsze znaczniki html

tak wyglada head.inc chociaz to chyba zbedne ...
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>- kuba's blog</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  6. <link rel="stylesheet" type="text/css" href="styles.css" />
  7. </head>

wiec problem chyba dalej nie rozwiazany ... :)

EDIT
------
aaaa ... juz wiem, o co ci chodzilo @olo.
zmylilo cie, ze mam ten kod przed <body> i pomyslales, ze wyzej mam <head> :>
aleksander
więc proponuje wszystkie include itp wkleić do głównego pliku.
hmmm
nie wiem, jaki mial byc tego efekt ...
wkleilem oba pliki dotyczace formularza (obslugujacy i wyswietlajacy) i nawet plik z poczatkiem kodu html. efekt?
ten sam, tylko ze teraz w dalszej czesci informacji o bledzie jest wyswietlona inna linia z bledem ... ale ciagle zwraca mi to samo:

Warning: Cannot modify header information - headers already sent by (output started at c:\inetpub\wwwroot\babeblog\book.php:1) in c:\inetpub\wwwroot\babeblog\book.php on line 67

jezeli jest taka potrzeba, to moge te pliki zapisac w formacie txt i wrzucic na serwer, bo serwera obslugujacego php + mysql jeszcze sobie nie znalazlem :P


EDIT
------
ale naklnalem ... jej.
po pierwsze to chcialbym was przeprosic i jednoczesnie podziekowac za proby znalezienia bledow ...
tak sobie pomyslalem o kodowaniu i znalazlem :| . wszystkie pliki *.inc i w deklaracji xhtml mam iso, a pliki *.php mialem zapisane nie jako ansi tylko utf-8.
siem troche wkurzylem, tymbardziej ze juz kiedys mialem taki blad i dopiero teraz o tym pomyslalem :/
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.