Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Pobranie zmiennej, wczytanie ciasteczek
Forum PHP.pl > Forum > Przedszkole
slawo
Witam, przerzuciłem stronę na nowy serwer home.pl i nie działa mi zmiana wielkości czcionki i kontrast. (górny panel, prawa strona)

WEBD.pl www.hlg.zpodziemia.pl DZIAŁA
HOME.pl www.hlg.com.pl NIE DZIAŁA

Zrobiłem to tak, że po kliknięciu w kontrast. Tworzy ciastko i nazwa stylu CSS z kontrastem i dodaje je na samą gorę.

  1. <link rel="stylesheet" type="text/css" href="../../css/<?php echo $_COOKIE['kontrast'];?>">
  2. <link rel="stylesheet" type="text/css" href="../../css/<?php echo $_COOKIE['czcionka'];?>">


  1. <?php
  2.  
  3. $poprzednia = $_SERVER['HTTP_REFERER'];
  4. $kontrast = addslashes(strip_tags($_GET['kontrast']));
  5.  
  6. if ($kontrast=='on') {
  7. setcookie("kontrast", "kontrast.css", time()+3600, "/");
  8. header("refresh: 0; url=$poprzednia");
  9. }
  10.  
  11. if ($kontrast=='off') {
  12. setcookie("kontrast", "", time(), "/");
  13. header("refresh: 0; url=$poprzednia");
  14. }
  15.  
  16. if ($_COOKIE['kontrast']=="kontrast.css") {
  17. ?>
  18. <a href="?kontrast=off"><div id="kontrast">
  19. <img src="../../images/kontrast.png" width="20" height="20" border="0" title="kontrast">
  20. </div></a>
  21. <?php
  22. }
  23. else {
  24. ?>
  25. <a href="?kontrast=on"><div id="kontrast">
  26. <img src="../../images/kontrast.png" width="20" height="20" border="0" title="kontrast">
  27. </div></a>
  28. <?php
  29. }
  30.  
  31. $word = addslashes(strip_tags($_GET['word']));
  32.  
  33. if ($word=='1') {
  34. setcookie("czcionka", "word1.css", time()+3600, "/");
  35. header("refresh: 0; url=$poprzednia");
  36. }
  37.  
  38. if ($word=='2') {
  39. setcookie("czcionka", "word2.css", time()+3600, "/");
  40. header("refresh: 0; url=$poprzednia");
  41. }
  42.  
  43. if ($word=='3') {
  44. setcookie("czcionka", "word3.css", time()+3600, "/");
  45. header("refresh: 0; url=$poprzednia");
  46. }
  47.  
  48. ?>



Kontrast:
Warning: Cannot modify header information - headers already sent by (output started at /nowa_hlg/index.php:14) in /nowa_hlg/index.php on line 38
Warning: Cannot modify header information - headers already sent by (output started at /nowa_hlg/index.php:14) in /nowa_hlg/index.php on line 39

Wygląda na to, że nie pobiera zmiennej i nie przeładowuje strony. Proszę o pomoc.



viking
Nagłówki muszą być wysłane jako pierwsze. Nie może być żadnej innej treści.
slawo
Rozjaśnij. To znaczy, że pobranie zmiennej plus kod z dodaniem ciasteczka musi być na samej górze? Błąd wywala bo jest niewłaściwy link ../css/(pusty) ? Dlaczego mi nie przeładowuje strony? Dlaczego nie dodaje ciasteczka?
Tomplus
@Slawo
Stosując header() w kodzie PHP musisz uważać na to gdzie go umieszczasz i jak wcześniej przygotowany jest kod:

Przykład:
  1. <?php
  2. header('Content-Type: application/pdf'); //Informujesz ze to jest plik PHP i dalsza zawartość będzie jego kodem
  3. echo "test";
  4. ?>

Przykład 2.
  1. <?php
  2. echo "test";
  3. header('Content-Type: application/pdf'); //j.w. tylko zwróci ci błąd, bo wysłałeś coś przed nagłówkiem.
  4. ?>

W przykładzie drugim nagłówek ma błędną zawartość i zwraca błąd.

Więc najlepszym rozwiązaniem jest albo Przykład 1 i uważne stosowanie header, lub użycie buforowania:

  1. <?php
  2. echo "test";
  3. header('Content-Type: application/pdf');
  4. ?>


Tutaj treść najpierw buforuje się, a dopiero we wskazanym miejscu się drukuje, wcześniej bezpiecznie wykonują się wszelkie polecenia w nagłówku strony. W manualu też są te podpowiedzi: http://php.net/manual/en/function.header.php

Uwaga w przykładach 1 i 2 czasem są błędy gdy mamy stronę zapisaną w UTF8 with BOM, pliki wysyłają te 3 znaki w nagłówku i powodują błąd nagłówka, więc należy zapisywać je jako UTF8 without BOM
slawo
Jeśli tylko o ten header w kodzie się rozchodzi, który przeładowuje stronę to nie lepiej go wyrzucić i innym kodem przeładować?
Tomplus
Albo tak jak mówię, użyj buforowania.
slawo
  1.  
  2. <?php
  3.  
  4.  
  5. $poprzednia = $_SERVER['HTTP_REFERER'];
  6. $kontrast = addslashes(strip_tags($_GET['kontrast']));
  7.  
  8. if ($kontrast=='on') {
  9. setcookie("kontrast", "kontrast.css", time()+3600, "/");
  10. header("refresh: 0; url=$poprzednia");
  11. }
  12.  
  13. if ($kontrast=='off') {
  14. setcookie("kontrast", "", time(), "/");
  15. header("refresh: 0; url=$poprzednia");
  16. }
  17.  
  18. if ($_COOKIE['kontrast']=="kontrast.css") {
  19. ?>
  20. <a href="?kontrast=off"><div id="kontrast">
  21. <img src="../../images/kontrast.png" width="20" height="20" border="0" title="kontrast">
  22. </div></a>
  23. <?php
  24. }
  25. else {
  26. ?>
  27. <a href="?kontrast=on"><div id="kontrast">
  28. <img src="../../images/kontrast.png" width="20" height="20" border="0" title="kontrast">
  29. </div></a>
  30. <?php
  31. }
  32.  
  33. $word = addslashes(strip_tags($_GET['word']));
  34.  
  35. if ($word=='1') {
  36. setcookie("czcionka", "word1.css", time()+3600, "/");
  37. header("refresh: 0; url=$poprzednia");
  38. }
  39.  
  40. if ($word=='2') {
  41. setcookie("czcionka", "word2.css", time()+3600, "/");
  42. header("refresh: 0; url=$poprzednia");
  43. }
  44.  
  45. if ($word=='3') {
  46. setcookie("czcionka", "word3.css", time()+3600, "/");
  47. header("refresh: 0; url=$poprzednia");
  48. }
  49.  
  50.  
  51. ?>
  52.  


W ten sposób wystarczy? Czy przed każym headerem trzeba?
Tomplus
Bufory możesz stosować ile chcesz. Np. możesz dzięki temu wyłapywać Notice/Warningi lub zagubione echo/print'y i wrzucać do własnych logów, zamiast pokazywać użytkownikom.

Ale samo stosowanie wystarczy tak jak zrobiłeś. Acz mam nadzieję że przed <?php nie masz żadnego entera lub spacji, czy innego znaku.

slawo
Buforowanie nie działa. Zastąpiłem header kodem:

  1. echo "<META HTTP-EQUIV=Refresh CONTENT=0;URL=$poprzednia>";


Dalej nie działa, nie chce dodać ciastka :/
viking
Setcookie to nic innego jak wraper na header i dokładnie ta sama zasada działania. Poczytaj trochę podstaw i opisz co konkretnie "nie działa".
slawo
kod setcookie nie dodaje ciastka o nazwie kontrast.css
viking
Bo błąd headers already sent. Tak?
slawo
  1. Warning: Cannot modify header information - headers already sent by (output started at /nowa_hlg/index.php:14) in /nowa_hlg/index.php on line 14


Tak, nie dodaje ciastka i nie wgrywa go w nagłówki

14 linijka:

  1. <link rel="stylesheet" type="text/css" href="../../css/<?php echo $_COOKIE['kontrast'];?>">
viking
No to posprzątaj ten bajzel. Wysłałeś treść w linii15. Ile razy można to samo tłumaczyć.
slawo
  1. setcookie("kontrast", "kontrast.css", time()+3600, "/");


tak?
viking
Buforowanie nie ma być na nagłówkach tylko na treści wysłanej przed nagłówkami. Po co te addslashes i strip_tags? Co w sytuacji pierwszej wizyty? Zrób porządną waliację tych np z zamianą na bool.
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.