Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Błąd po logowaniu
Forum PHP.pl > Forum > Przedszkole
Uertff
Mam problem w czasie zalogowania. Gdy zrobię tak że jak zaloguję się na stronę i gdy z tej strony wejdę po prostu na plik odpowiadający za logowanie i z powrotem wrócę do tamtej poprzedniej strony to pojawia się błąd że Obiekt tej klasy nie mógł być przekonwertowany do łańcucha. Dokładnie w linii 6 w pliku tym co jest chroniony. Dokładnie komunikat wygląda tak: .

Kod
Catchable fatal error: Object of class __PHP_Incomplete_Class could not be converted to string in C:\Program Files\WebServ\httpd-users\test\news\protect.php on line 6


Powiem jeszcze, że jak usunę wyświetlanie $_SESSION['user'] to wszystko i jest w porządku to samo gdy zamiast klasy to samo, tylko że w wyjątku to też działa. Proszę o pomoc bo mi zależy żeby to rozwiązać a nie mogę tego rozwiązać, szukałem wszędzie i nic o tym nie znalazłem.

Kod:

  1. <?php
  2.  
  3.  
  4. class user {
  5.  
  6. public $user;
  7. private $pass;
  8.  
  9. public function checkuser() {
  10.  
  11. $pdo = new pdo ('mysql:host=localhost;dbname=oop','root','mentormiszcz1e');
  12. $row= $pdo-> query ("SELECT name,password FROM `trials` WHERE name= '".$_POST['user']."'");
  13.  
  14. while ($line= $row-> fetch()) {
  15.  
  16. $this-> user= $line['name'];
  17. $this-> pass= $line['password'];
  18.  
  19. if ($this->user== $_POST['user'] && $this-> pass== md5($_POST['pass'])) {
  20. $_SESSION['user']= $_POST['user'];
  21. header ("Location: protect.php");
  22. }
  23. else {
  24. header ("Location: log.html");
  25. }
  26.  
  27. } // end while
  28.  
  29. $row-> closeCursor();
  30.  
  31. } // end function
  32.  
  33. }
  34.  
  35. $user= new user;
  36. $user-> checkuser();
  37.  
  38. ?>


  1. <?php
  2.  
  3.  
  4. if (isset($_SESSION['user'])) {
  5. echo 'Yo, ' . $_SESSION['user'] . '<a href="logout.php">Sign out</a>';
  6. }
  7.  
  8. else {
  9. header ("Location: log.html");
  10. }
  11.  
  12. ?>


  1. <!DOCTYPE html
  2. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
  5. <title>Title</title>
  6. </head>
  7.  
  8. <form action="class.php" method="post">
  9. <div id="form">
  10. <input type="text" name="user" />
  11. <input type="password" name="pass" />
  12. <input type="submit" value="Sign in" />
  13. </div>
  14. </form>
  15.  
  16. </body>
  17. </html>
mike
Sprawa wygląda tak:
1. Masz klasę user
2. Wykonujesz jakąś logikę, jakieś operacje, ...
3. Zapisujesz do sesji obiekt klasy user. PHP wie jak go zapisać bo ma klasę wczytaną.

Później robisz tak:
1. Odpalasz sesję;
2. Wczytujesz z sesji obiekt klasy user.

I tu jest problem, PHP nie wie jak ta klasa wyglądała bo jej nie wczytałeś, dlatego wywala błąd Object of class __PHP_Incomplete_Class. Zanim wyciągniesz klasę user z sesji, musisz ją ponownie wczytać (lub zdefiniować) w skrypcie.
Uertff
Czyli po prostu do pliku tam gdzie jest echo 'Yo, ' . $_SESSION['user'] itd. dołączyć plik z klasą przez require() i co potem . Bo dołączyłem i teraz się pojawia taki błąd:
Kod
Object of class user could not be converted to string
. Teraz znowu coś z klasą user jest. Robić coś tu jeszcze oprócz dołączenia klasy przez require ?
mike
Z klasam wszystko jest OK, błedem jest teraz wyświetlanie obiektu.
Nie możesz sobie zrobić ot tak sobie echo obiekt;, skąd PHP ma wiedzieć jak go wyświetlić?

Dopisz sobie do klasy user:
  1. <?php
  2.  
  3. class user {
  4.  
  5. // ...
  6.  
  7. public function __toString() {
  8.  return $this->user;
  9. }
  10. }
  11.  
  12. ?>
I wszystko będzie OK.
Uertff
Dodałem to do klasy ale dalej nie działa. Co teraz zrobić? użyć gdzieś tej funkcji czy co? Kod tak wygląda teraz:

  1. <?php
  2.  
  3.  
  4.  
  5. class user {
  6.  
  7. public $user;
  8. private $pass;
  9.  
  10. public function checkuser() {
  11.  
  12. $pdo = new pdo ('mysql:host=localhost;dbname=oop','root','mentormiszcz1e');
  13. $row= $pdo-> query ("SELECT name,password FROM `trials` WHERE name= '".$_POST['user']."'");
  14.  
  15. while ($line= $row-> fetch()) {
  16.  
  17. $this-> user= $line['name'];
  18. $this-> pass= $line['password'];
  19.  
  20. if ($this->user== $_POST['user'] && $this-> pass== md5($_POST['pass'])) {
  21. $_SESSION['user']= $_POST['user'];
  22. header ("Location: protect.php");
  23. }
  24. else {
  25. header ("Location: log.html");
  26. }
  27.  
  28. } // end while
  29.  
  30. $row-> closeCursor();
  31.  
  32. } // end function
  33.  
  34. public function toString() {
  35.  return $this->user;
  36. }
  37.  
  38. }
  39.  
  40. $user= new user;
  41. $user-> checkuser();
  42.  
  43.  
  44. ?>
mike
Nie dodałeś funkcji, o której pisałem. Jak dodasz to idziemy dalej.
Funkcji tej się nie używa jawnie. "Sama" się wykonuje kiedy traktujesz obiekt jak stringa, na przykład kiedy wyśiwetlasz go za pomocą echo.
Uertff
Ok. Mam coś takiego. Teraz twoja funkcja będzie zwracała wartość, ale co teraz dalej. Muszę coś jeszcze dopisać w tym pliku z 'Yo, ' . $_SESSION['user'] ? Czy dołączyć tu tą klasę przez require czy co?

  1. <?php
  2.  
  3.  
  4. class user {
  5.  
  6. public $user;
  7. private $pass;
  8.  
  9. public function checkuser() {
  10.  
  11. $pdo = new pdo ('mysql:host=localhost;dbname=oop','root','mentormiszcz1e');
  12. $row= $pdo-> query ("SELECT name,password FROM `trials` WHERE name= '".$_POST['user']."'");
  13.  
  14. while ($line= $row-> fetch()) {
  15.  
  16. $this-> user= $line['name'];
  17. $this-> pass= $line['password'];
  18.  
  19. if ($this->user== $_POST['user'] && $this-> pass== md5($_POST['pass'])) {
  20. $_SESSION['user']= $_POST['user'];
  21. header ("Location: protect.php");
  22. }
  23. else {
  24. header ("Location: log.html");
  25. }
  26.  
  27. } // end while
  28.  
  29. $row-> closeCursor();
  30.  
  31. } // end function
  32.  
  33. public function __toString() {
  34.  return $this->user;
  35. }
  36.  
  37. }
  38.  
  39. $user= new user;
  40. $user-> checkuser();
  41.  
  42. ?>
mike
Klasę dołączasz bez zmian.
Uertff
Dobra. Dołączyłem klasę do tego pliku gdzie jest wyświetlane $_SESSION['user'], ale znowu napotyka błąd że musi zwrócić łańcuch.
Kod
Catchable fatal error: Method user::__toString() must return a string value in C:\Program Files\WebServ\httpd-users\test\news\protect.php on line 7


Teraz tak to wygląda:
  1. <?php
  2.  
  3. require ("class.php");
  4.  
  5. if (isset($_SESSION['user'])) {
  6. echo 'Yo, ' . $_SESSION['user'] . '<a href="logout.php">Sign out</a>';
  7. }
  8.  
  9. else {
  10. header ("Location: log.html");
  11. }
  12.  
  13. ?>
Uertff
Sorry, że piszę post pod postem ale nie mam możliwości edycji. Nie mogę dalej się z tym uporać. Do pliku z klasą jest dołączona funkcja mike'a
i w pliku z $_SESSION['user'] tym co wyświetla jest tak jak wyżej dołączona klasa, ale co teraz zrobić? Dalej pojawia się ten sam komunikat co wyżej.
Niby jest funkcja że zwraca wartość, ale tego nie robi jak widać wyżej.
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.