Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] SESSION
Forum PHP.pl > Forum > Przedszkole
zulik
cześć wszystkim smile.gif
mam pewien problem
wrzucilem sobie swoją stronkę na serwer do kolegi - i wszystko ładnie działa
na localhoście natomiast - gdy chce się zalogować - naciskam enter - przekierowuje mnie na główną stronę - i musze jeszcze raz się logować! sad.gif
na zdalnym wszystko jest ok!

zdebugowałem projekt - gdzieś w momencie wczytywania (a raczej chyba kończenia) wczytywania pliku stopka.php gubi mi zmienną!
naglowek.php
  1. <?php
  2. require("konfiguracja.php");
  3. $db = mysql_connect($dbhost, $dbuser, $dbpassword);
  4. mysql_select_db($dbdatabase, $db);
  5. mysql_query("SET NAMES 'utf8'");
  6. ?>
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml" />
  9. <head>
  10. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  11. <title><?php echo $config_blogname; ?></title>
  12. <link rel="stylesheet" href="arkusz_stylow.css" type="text/css" />
  13. </head>
  14. <body>
  15. <div id="header">
  16. <h1><?php echo $config_blogname; ?></h1>
  17. </div> <!-- end header -->
  18. <div id="menu">
  19. <a href="index.php">Główna strona</a>
  20. <a href="wyswietlanie_kategorii.php">Kategorie</a>
  21. <?php
  22. if(isset($_SESSION['USERNAME']) == TRUE){
  23. echo "<a href='wylogowywanie.php'>Wylogowywanie</a>";}
  24. else
  25. echo "<a href='logowanie.php'>Logowanie</a>";
  26. if(isset($_SESSION['USERNAME']) == TRUE) {
  27. echo " - ";
  28. echo "[<a href='dodawanie_wpisu.php'>Dodaj wpis</a>]";
  29. echo "[<a href='dodawanie_kategorii.php'>Dodaj kategorię</a>]";
  30. } ?>
  31. </div> <!-- end menu -->
  32. <div id="container">
  33. <div id="main">


index.php
  1. <?php
  2. require("naglowek.php");
  3. $sql = "SELECT wpisy.*, kategorie.kat FROM wpisy, kategorie WHERE wpisy.id_kat = kategorie.id ORDER BY data_wpisu DESC LIMIT 1;";
  4. $result = mysql_query($sql);
  5. $row = mysql_fetch_assoc($result);
  6. echo "<h2><a href='wyswietlanie_wpisu.php?id=" . $row['id'] . "'>" . $row['temat'] . "</a></h2>";
  7. echo "<i>W <a href='wyswietlanie_kategorii.php?id=" . $row['id_kat'] . "'>" . $row['kat']
  8. . "</a> - data zamieszczenia: " . date("D jS F Y g:iA", strtotime($row['data_wpisu']))."</i>";
  9. if(isset($_SESSION['USERNAME']) == TRUE){
  10. echo " [<a href='aktualizacja_wpisu.php?id=".$row['id']."'>Edytuj</a>]";
  11. }
  12. echo "<p><br />";
  13. echo nl2br($row['tresc']);
  14. echo "</p>";
  15. echo "<p id=komentarze>";
  16. $commsql = "SELECT nazwa FROM komentarze WHERE id_blogu = " . $row['id']
  17. ." ORDER BY data_wpisu;";
  18. $commresult = mysql_query($commsql);
  19. $numrows_comm = mysql_num_rows($commresult);
  20. echo "<br />";
  21. if ($numrows_comm == 0)
  22. echo "<p id=komentarze>Brak komentarzy.</p>";
  23. else { //#1
  24. echo "(<strong>" . $numrows_comm . "</strong>) komentarzy : ";
  25. $i = 1;
  26. while($commrow = mysql_fetch_assoc($commresult)) {
  27. echo "<a href='wyswietlanie_wpisu.php?id".$row['id']."#komenatrz" . $i . "'>" . $commrow['nazwa']."</a> ";
  28. $i++;
  29. }
  30. } //else #1
  31. echo "</p>";
  32. $prevsql = "SELECT wpisy.*, kategorie.kat FROM wpisy, kategorie
  33. WHERE wpisy.id_kat = kategorie.id
  34. ORDER BY data_wpisu DESC
  35. LIMIT 1,5;";
  36. $prevresult = mysql_query($prevsql);
  37. $numrows_prev = mysql_num_rows($prevresult);
  38. if($numrows_prev == 0)
  39. echo "<p>Brak wcześniejszych wpisów.</p>";
  40. else {
  41. echo "<ul>";
  42. while($prevrow = mysql_fetch_assoc($prevresult)) {
  43. echo "<li><a href='wyswietlanie_wpisu.php?id=" . $prevrow['id'] .
  44. "'>" . $prevrow['temat'] . "</a></li>";
  45. }
  46. }
  47. echo "</ul>";
  48. require("stopka.php");
  49. ?>



  1. <?php
  2. require("konfiguracja.php");
  3. $db = mysql_connect($dbhost, $dbuser, $dbpassword);
  4. mysql_select_db($dbdatabase, $db);
  5. mysql_query("SET NAMES 'utf8'");
  6. if($_POST['submit']){ //#if_1
  7. $sql = "SELECT * FROM loginy WHERE nazwa_uzytkownika = '".$_POST['nazwa_uzytkownika']."' AND haslo = '" . $_POST['haslo']. "';";
  8. $result = mysql_query($sql);
  9. $numrows = mysql_num_rows($result);
  10. if($numrows == 1){ //#if_2
  11. $row = mysql_fetch_assoc($result);
  12. session_register("USERNAME");
  13. session_register("USERID");
  14. $_SESSION['USERNAME'] = $row['nazwa_uzytkownika'];
  15. $_SESSION['USERID'] = $row['id'];
  16. header("Location: ".$config_basedir);
  17. } //#if_2
  18. else
  19. header("Location: ".$config_basedir ."/logowanie.php?error=1");
  20. } //#if_1
  21. else { //gdy przycisk nie zostanie nacisniety
  22. require("naglowek.php");
  23. if($_GET['error'])
  24. echo "Nieudana operacja logowania. Proszę spróbować ponownie!";
  25. }
  26. ?>
  27. <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
  28. <table>
  29. <tr>
  30. <td>Nazwa użytkownika</td>
  31. <td><input type="text" name="nazwa_uzytkownika"></td>
  32. </tr>
  33. <tr>
  34. <td>Hasło</td>
  35. <td><input type="password" name="haslo"></td>
  36. </tr>
  37. <tr>
  38. <td></td>
  39. <td><input type="submit" name="submit" value="Zaloguj"></td>
  40. </tr>
  41. </table>
  42. </form>
  43. <?php
  44. require("stopka.php");
  45. ?>



pozdrawiam
Przemysław Maćkowski
Neeke
I co chcesz byśmy my szukali Tobie błędu?
Chyba sobie żarty stroisz
kielich
No chyba jednak sobie żartujesz smile.gif Moja sugestia analizuj po kawałku w warunkach wstaw jakąś inna akcję aż dojdziesz do setna .

Ps. troszkę ten kod tak jakby zaśmiecony smile.gif
Zyx
Neeke -> po części na tym polega idea forum smile.gif. Ja bym powiedział, że autor powinien raczej się spodziewać nakierowania na właściwy trop.

Jednak problem polega na tym, drogi zuliku, że przydałoby się jeszcze trochę danych od Ciebie. Piszesz, że zmienna jest gubiona w stopka.php, a nie załączyłeś tego pliku. Ponadto miło byłoby, gdybyś objaśnił takie zmienne, jak $config_basedir oraz napisał, skąd się one biorą. Zauważ, że w przypadku błędnego loginu/hasła wysyłasz parametr ?error=1, ale potem w ogóle go nie wykorzystujesz. Być może po prostu zapomniałeś wgrać użytkowników do lokalnej bazy danych?

Pomijam już fakt, że masz w kodzie burdel z gatunku kosmicznych. Weź sobie to popakuj w jakieś funkcje, podziel na wyświetlanie i na pobieranie danych, bo przy takiej budowie umrzesz szybko. Widzisz, nawet nie możesz nagłówka załadować, jeśli strona ma być dostępna jedynie dla zalogowanych. Zaś w logowaniu przy wyświetlaniu formularza dwukrotnie inicjujesz sesję...
zulik
dziękuje za krytykę - zawsze to konstruktywne...
Nie chodziło mi by ktoś za mnie szukał błędu - raczej by może ktoś znał ustawienia serwera, które są odpowiedzialne za sesje - i mógłby wskazać, które to... bo jak pisałem - na remotehoście jest OK.


Jest to przykład z książki, którą obecnie przerabiam - PHP i MySQL 8 komponentów dla kreatywnych webmasterów.

szukałem wczoraj w necie długo - i udało mi się znaleźć, że header - nie przenoszą zmiennych sesji.
Czy możecie dla mnie to potwierdzić ? (nie jestem pewien mego angielskiego smile.gif

Zauważ, że w przypadku błędnego loginu/hasła wysyłasz parametr ?error=1, ale potem w ogóle go nie wykorzystujesz. Być może po prostu zapomniałeś wgrać użytkowników do lokalnej bazy danych?

Jest to przykład z książki, w bazie znajduje się tylko jeden użytkownik.

Pomijam już fakt, że masz w kodzie burdel z gatunku kosmicznych. Weź sobie to popakuj w jakieś funkcje, podziel na wyświetlanie i na pobieranie danych, bo przy takiej budowie umrzesz szybko

Proszę sprostuj: czy miałeś na myśli zwykłe funkcje z zakresu języka proceduralnego, czy chodziło Ci o funkcje bardziej pod względem obiektowym...niestety coś mi nie idzie załapanie obiektówki sad.gif niby wszystko rozumiem, ale jednak nic smile.gif
Czy mógłbyś podać przykład takiej funkcji ?


nie umieściłem, bo wydawał mi się zbędny... faktycznie, źle założyłem...
stopka.php
  1. <?php
  2. ?>
  3. </div> <!-- end main -->
  4. </div> <!-- end container -->
  5. <div id="footer">
  6. <p>&copy; <?php echo $config_author; ?></p>
  7. </div> <!-- end footer -->
  8. </body>
  9. </html>




Zaś w logowaniu przy wyświetlaniu formularza dwukrotnie inicjujesz sesję...
Czy możesz mnie na to trochę naprowadzić questionmark.gif bo przecież w pliku logowanie.php mam tylko raz "session_start()"

  1. <?php
  2. $dbhost = "localhost";
  3. $dbuser = "root";
  4. $dbpassword = "";
  5. $dbdatabase = "blogtastic";
  6. $config_blogname = "Dziennik internetowy";
  7. $config_author = "Przemysław Maćkowski";
  8. $config_basedir = "http://127.0.0.1/blogtastic/";
  9. ?>



Przemysław Maćkowski - niestety już zdecydowanie oldboy smile.gif




Cytat(Zyx @ 27.07.2010, 22:41:17 ) *
Zaś w logowaniu przy wyświetlaniu formularza dwukrotnie inicjujesz sesję...


czy chodzi o:
<?php
session_start();

a następnie
else { //gdy przycisk nie zostanie nacisniety
require("naglowek.php");

naglowek.php
  1. <?php
  2. require("konfiguracja.php");
  3. $db = mysql_connect($dbhost, $dbuser, $dbpassword);
  4. mysql_select_db($dbdatabase, $db);
  5. mysql_query("SET NAMES 'utf8'");
  6. ?>
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml" />
  9. <head>
  10. ...
  11. ...


podpowiecie rozwiązanie - proszę

Przemysław Maćkowski
Zyx
Jak takiego pisania uczą w książce, to mam poważne wątpliwości co do kompetencji jej autora. Nawet podręcznik na Wikibooks ma bardziej przemyślane przykłady... smile.gif

Ad. 1 - dane sesji zostają na serwerze, za pomocą ciastek przesyłany jest tylko jej identyfikator.

Ad. 2 - tak, ale czy wgrałeś użytkownika do tej bazy?

Ad. 3 - tak, wystarczą nawet zwykłe funkcje. Wiem, że się uczysz i nie wymagam nie wiadomo czego. Logiczną organizację kodu można wprowadzić niezależnie od tego czy ktoś umie obiektówkę czy nie, czy zastosuje funkcje czy jeszcze coś innego. Jeśli teraz nie zaczniesz o to dbać, ciężko Ci będzie zrozumieć bardziej skomplikowane rzeczy w przyszłości i ciągle będziesz się zmagać z różnymi wynikającymi z tego problemami.

Ad. 4 - tak, chodzi dokładnie o to, że najpierw ją otwierasz ręcznie, a później ładujesz plik naglowek.php, który robi to po raz drugi. Wprawdzie dla działania sesji nic to specjalnie nie zmienia poza rzucaniem ostrzeżeń, ale jest to błąd w sztuce.

Doświadczenie mówi mi, że takie niedeterministyczne zachowanie wynika właśnie z chaosu w skrypcie smile.gif. Jeśli skrypt jest logicznie napisany, zazwyczaj także zachowuje się logicznie smile.gif.
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.