[OOP] Fehlermeldungen an der richtigen stelle Anzeigen!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [OOP] Fehlermeldungen an der richtigen stelle Anzeigen!

    Hi Leutz,
    habe folgendes Problem:

    Ich baue gerade an einer Seite die die aus drei Spalten besteht, links Linkmenu, mitte Inhalt und rechts je nach Status Login oder Usermanager.

    Zum Login verwende ich eine Datei Login.php die auf eine Login-classe zugreift und überprüft, ob der Login korrekt ist. Dabei werden innerhalb der Login-classe Fehlermeldungen zugewiesen und an die login.php übergeben! Entsteht also ein Fehler beim Login wird einfach meine login.php neu geladen und die entstandene Fehlermeldung über meinem Login-formular angezeigt!

    Diese Fehlermeldung möchte ich jedoch nicht im rechten Teil meiner Seite, sondern in der Mitte im Content ausgeben!

    Also hab ich mir überlegt, statt den Fehler direkt per echo auszugeben, ihn per header in die Mitte zu übergeben an eine datei error.php

    Das ganze funzt jedoch net, weil nach Ausführen des headers der Inhalt der Fehlermeldung irgentwie weg ist... bzw weiß ich nicht wie ich in der error.php noch an diese Fehlermeldung kommen soll. Rufe ich die memberclasse nochmal auf und frage die fehler ab, so sind diese leer....

    ich hoffe jemand versteht was ich meine... is ziemlich kompliziert!

    Hat jemand ne idee wie ich das lösen kann? Bzw ne Seite wo sowas erklärt wird?

    Mfg deschmiddi

    EDIT:
    Bei meinem Loginsystem handelt es sich um das von Ryback aus dem Codeschnipselforum... dort steht die Classe!
    Geht net gibts net...

  • #2
    wie übergibst du den fehler an die error.php??? (Code)
    mfg
    Günni


    Praxis: Jeder kann´s, aber keiner weiß wie´s geht...
    Theorie: Jeder weiß wie´s geht, aber keiner kann´s ...
    Microsoft vereint Praxis und Theorie: Nix geht und keiner weiß warum
    City-Tiger - Online durch die Straßen tigern...

    Kommentar


    • #3
      PHP-Code:
      login.php
      <?php
      error_reporting
      (E_ALL);
      include_once(
      "inc/display_functions.php");
      if(!isset(
      $_POST['username']) || !isset($_POST['password'])){
              
          
      display_LoginForm();
      }
      else{
          
      $Member = new member();
          
      $Member->member_open();
          
      $User_OK $Member->check_user($_POST['username'],$_POST['password']);
          if(
      "OK" == $User_OK){
              
      $Member->login();
              
      $Member->member_close();
                      unset(
      $Member);
                      
      header("location:index.php?mod=usrmrg&section=change&".SID."");
              die;
          }
              else{
              
      $Member->kill_session();
              
      header("location:index.php?mod=checkin&section=error&".SID."");
          }
          
      }
      ?>
      hier die Umleitung zur error.php ganz unten im header.

      login_class.php
      PHP-Code:
      <?php
      class member{
          
          var 
      $dbcnx;
          var 
      $try_max 4;
          var 
      $blocking_time 21600;
          var 
      $user_data;
              var 
      $_login_error;
          
          function 
      member(){
          }

          function 
      member_open(){
              
      $this->dbcnx db_connect();
              
      db_select_db($this->dbcnx);
          }
          
      /*
          */
          
      function get_dbcnx(){
              return 
      $this->dbcnx;
          }
          
      /*
              check_user wird sofort nach dem Login aufgerufen um zu sehen ob der Benutzer ein gültiger Benutzer ist
          */
          
      function check_user($UserName,$PassWord){
              
      //Eingegebene Daten formatieren
              /*
                  Ruft format_for_db auf :
                  function format_for_db($text){
                      return addslashes(mysql_escape_string(trim($text)));
                  }
              */
              
      $UserName format_for_db($UserName);
              
      $PassWord format_for_db($PassWord);
              
      //Testen ob irgendwas eingegeben wurde
              
      if("" == $UserName) return $this->_login_error "Einen Benutzernamen brauchen wir schon ...";
              if(
      "" == $PassWord) return $this->_login_error "Ein Passwort brauchen wir schon ...";
              
      //Prüfen ob ein user mit dem angegebenen Benutzernamen bereits existiert 
              
      $sql_query "SELECT * FROM oberstufe_user WHERE username = '$UserName' LIMIT 1";
              
      $dbsth mysql_query($sql_query,$this->dbcnx);
              if(
      != mysql_affected_rows($this->dbcnx)) return $this->_login_error "Es konnte kein g&uml;ltiges Benutzerkonnte gefunden werden !<br>";
              
      $this->user_data mysql_fetch_array($dbsth);
              
      mysql_free_result($dbsth);
              
      //Testen ob das Benutzerkonto bereits aktiviert ist
              
      if(== $this->user_data['activ']) return $this->_login_error "Ihr Benutzerkonto mu&szlig; noch &uuml;ber E-Mail aktiviert werden bevor sie es nutzen k&ouml;nnen.";
              
      //Testen ob der Benutzer geblock ist
              
      $timestamp time() + 3600;
              if((
      "0" != $this->user_data['block_stamp']) && ($this->user_data['block_stamp'] > $timestamp)){
                  
      $block_date gmdate("d.m.Y",$this->user_data['block_stamp']);
                  
      $block_time gmdate("H:i:s",$this->user_data['block_stamp']);
                  
      $err_msg "Sie sind noch bis zum $block_date um $block_time gesperrt (GMT-Zeit) !<br>";
                  
      $err_msg .= "(Ein Benutzerkonto wird jeweils dann f&uuml;r eine gewisse Zeit gesperrt,<br>";
                  
      $err_msg .= "wenn sie ihr Passwort $this->try_max mal hintereinander falsch eingeben.)";
                  return 
      $err_msg;
              }
              
      //Testen ob das Passwort korrekt ist und das Benutzerkonto blocken oder Zahl der Loginversuche speichern wenn nötig
              
      $PassWord md5($PassWord);
              if(
      $PassWord != $this->user_data['password']){
                  
      $try_act $this->user_data['log_attempts'];
                  
      $try_act++;
                  if(
      $try_act >= $this->try_max){
                      
      $block_stamp time() + $this->blocking_time 3600;
                      
      $theId $this->user_data['userid'];
                      
      $sql_query "UPDATE oberstufe_user SET block_stamp = '$block_stamp', log_attempts = 0 WHERE userid = $theId";
                      
      $block_date gmdate("d.m.Y",$block_stamp);
                      
      $block_time gmdate("H:i:s",$block_stamp);
                      
      $err_msg "Sie haben die maximale Anzahl von $this->try_max Anmeldeversuchen &uuml;berschritten !<br>";
                      
      $err_msg .= "Ihr Benutzerkonto wurde bis zum $block_date um $block_time gesperrt.";
                  }else{
                      
      $theId $this->user_data['userid'];
                      
      $sql_query "UPDATE oberstufe_user SET log_attempts = $try_act WHERE userid = $theId";
                      
      $try_left $this->try_max $try_act;
                      
      $err_msg "Das Passwort das sie eingegeben haben ist falsch.<br>";
                      
      $err_msg .= "Sie haben noch $try_left Versuche &uuml;brig.";
                  }
                  
      mysql_query($sql_query,$this->dbcnx);
                  return 
      $err_msg;
              }
              return 
      "OK";
          }
          
      /*
              Wenn check_user funktionniert hat, muß diese Methode aufgerufen werden
          */
          
      function login(){
              
      $theId $this->user_data['userid']; 
              
      $sql_query "UPDATE oberstufe_user SET UserSession = '".session_id()."', block_stamp = '0', log_attempts = 0, last_log = now() WHERE userid = $theId";
              
      mysql_query($sql_query,$this->dbcnx);
              
      session_register('userid');
              
      session_register('check_str');
              
      session_register('net');
              
      session_register('user_agent');
              
      session_register('username');
              
      session_register('logDate');
              
      $_SESSION['userid'] = $this->user_data['userid'];
              
      $_SESSION['check_str'] = $this->user_data['check_str'];
              
      $_SESSION['net'] = $this->_mk_net();
              
      $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
              
      $_SESSION['username'] = $this->user_data['username'];
              
      $_SESSION['logDate'] = $this->user_data['last_log'];
          }
          
      /*
              Teil der IP nehmen, die das Netz des Benutzers identifiziert
          */
          
      function _mk_net(){
              
      $ip $_SERVER['REMOTE_ADDR'];
              
      $ip_ar explode('.',$ip);
              
      $first_byte $ip_ar[0];
              
      $num_hosts_bytes 1;
              if((
      $first_byte 0) && ($first_byte 128)){
                  
      $num_hosts_bytes 3;
              }elseif((
      $first_byte 127) && ($first_byte 192)){
                  
      $num_hosts_bytes 2;
              }elseif((
      $first_byte 191) && ($first_byte 224)){
                  
      $num_hosts_bytes 1;
              }
              for(
      $i=1;$i<=$num_hosts_bytes;$i++){
                  
      array_pop($ip_ar);
              }
              return 
      implode('.',$ip_ar);
          }
          
      /*
              einfach nur Fehlermeldungen
          */
          
      function getError() {
                  
      $error_str "Fehler:\n".$this->_login_error."\n";
                  return 
      $error_str;
              }
          
      /*
              Diese Methode wird nach erfolgreichem Login bei jedem Aufruf einer Seite des Benutzerkontos aufgerufen
              (Testet ob ein Benutzer korrekt eingeloggt ist)
          */
          
      function login_OK(){
              if(!
      session_is_registered('userid') || !session_is_registered('check_str') || !session_is_registered('net') || !session_is_registered('user_agent')) return false;
              if(
      "" == $_SESSION['userid'] || !is_numeric($_SESSION['userid'])) return false;
              
      $sql_query "SELECT UserSession,check_str FROM oberstufe_user WHERE userid = $_SESSION[userid]";
              
      $dbsth mysql_query($sql_query,$this->dbcnx);
              if(
      != mysql_affected_rows($this->dbcnx)) return false;
              
      $data mysql_fetch_array($dbsth);
              
      mysql_free_result($dbsth);
              if(
      $data['UserSession'] != session_id()) return false;
              if(
      $data['check_str'] != $_SESSION['check_str']) return false;
              if(
      $_SESSION['net'] != $this->_mk_net()) return false;
              if(
      $_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) return false;
              return 
      true;
          }
          
      /*
              Loggt einen Benutzer aus. (Zerstört auch die Session)
          */
          
      function logout(){
              if((!isset(
      $_SESSION['userid'])) || ("" == $_SESSION['userid'])){
                  echo(
      "Es ist ein Fehler aufgetreten !");
                  die();
              }
              
      $sql_query "UPDATE oberstufe_user SET UserSession = NULL WHERE userid = $_SESSION[userid] AND UserSession = '".session_id()."'";
              
      mysql_query($sql_query,$this->dbcnx) OR die(mysql_error());
              if(
      mysql_affected_rows($this->dbcnx) < 1) {
                          
      $err "Fehler logout";
                          return 
      $err;
                      }
              
      $this->kill_session();
              return 
      true;
          }
          
      /*
              Zerstört die Session
          */
          
      function kill_session(){
              
      $session_id session_id();
              unset(
      $_SESSION);
              
      session_destroy();
              if(
      strtolower('files' == session_module_name())){
                  
      $os substr(PHP_OS,0,3);
                  if(
      'WIN' == $os){
                      
      $sep '//';
                      
      $path str_replace(chr(92),$sep,session_save_path());
                  }else{
                      
      $sep '/';
                      
      $path session_save_path();
                  }
                  @
      unlink($path.$sep.'sess_'.$session_id);
              }
          }

          function 
      member_close(){
              
      mysql_close($this->dbcnx);
          }
      }
      ?>
      error.php
      PHP-Code:
      $error = new member();
          
      $error->member_open();
          
      $erg $error->getError();
          echo 
      $erg
      funzt aber net weil die classe ja neu aufgerufen wird... weiß net wie ich das realisieren könnte... hab schon viel über OOP nachgeschlagen und hier gesucht aber das prob hatte wohl noch keiner ...
      Geht net gibts net...

      Kommentar


      • #4
        gut erkannt. Wirf den Fehler doch in die Session ...
        Beantworte nie Threads mit mehr als 15 followups...
        Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

        Kommentar


        • #5
          Hab ich schon versucht innerhalb der login.php
          undzwar vor dem header etwa so:

          PHP-Code:
          $_SESSION['error'] = $this->_login_error;
          header("location:index.php?mod=usrmrg&section=error&".SID.""); 
          und in der error.php

          PHP-Code:

          echo $_SESSION['error']; 
          geht aber auch net
          Notice: Undefined index: error in d:\htdocs\oberstufe\error.php on line 2


          müsste ich diese Session schon in der classe anmelden?

          EDIT:
          Korrigiert
          Zuletzt geändert von deschmiddi; 19.12.2003, 17:04.
          Geht net gibts net...

          Kommentar


          • #6
            was soll denn SIS sein?
            Beantworte nie Threads mit mehr als 15 followups...
            Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

            Kommentar


            • #7
              Sorry, vertippt.

              Sollte SID heißen, also session_id().
              In meinem script stehts aber richtig. Daran hängts net.

              Gruß deschmiddi
              Geht net gibts net...

              Kommentar


              • #8
                schade... hat keiner ne idee?
                ich knaup jetzt schon seit stunne und hab auch nochmal fleißig hier gesucht aber ich find die Lösung net!

                Abraxax i need you
                Geht net gibts net...

                Kommentar


                • #9
                  Original geschrieben von deschmiddi
                  Abraxax i need you
                  jetzt nicht...

                  ich habe mich schon bewusst aus dem thread rausgehalten...
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Hab das prob immernoch net gelöst!

                    Bitte dringend um Hilfe!
                    Danke.
                    Geht net gibts net...

                    Kommentar


                    • #11
                      oh mann. hat dir bisher keiner helfen können? das finde ich nicht so gut.

                      naja... dann will ich mal nicht so sein und versuche dein glück


                      wenn ich dich richtig verstanden habe, willst du einfach die fehlermeldung weiterreichen. richtig?

                      vorschlag 1 - session:

                      die session ist ja eh schon gestartet.

                      in der login.php an der passenden stelle ....
                      PHP-Code:
                      $_SESSION['loginerr'] = 'hier dann deine fehlermeldung';
                      header('Location: error.php'); 
                      und dann in der error.php einfach zum ausgeben....
                      PHP-Code:
                      if (isset($_SESSION['loginerr']))
                          echo 
                      $_SESSION['loginerr'];
                          unset(
                      $_SESSION['loginerr']);

                      vorschlag 2 - parameter:

                      in der login.php an der passenden stelle ....
                      PHP-Code:
                      $loginerr 'hier dann deine fehlermeldung';
                      header('Location: error.php?errormsg='.rawurlencode($loginerr)); 
                      und dann in der error.php einfach zum ausgeben....
                      PHP-Code:
                      echo isset($_GET['errormsg']) ? rawurldecode($_GET['errormsg']) : ''

                      natürlich wie immer ohne gewähr und ungetestet.
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar


                      • #12
                        Danke dir Abraxax,

                        du hast mein Problem fast richtig verstann. Das haarige an der Sache ist dass in der Login-classe unterschiedliche Fehler enstehen können. Sobald einer ensteht bricht er ab. den gibt er dann an die login.php zurück. Von dort aus soll er weitergereicht werden wie du richtig erkannt hast...
                        aber so ungefähr wie dus geschrieben hast söllte es glaub gehen.

                        werds gleich mal ausprobieren... sobald ich meinen blöden Fehler:

                        Warning: Cannot modify header information - headers already sent by (output started at d:\htdocs\oberstufe\index.php:10) in d:\htdocs\oberstufe\checkin2.php on line 16

                        weghabe. Der is seit gestern plötzlich da obwohl mein session_start(); an vorderster stelle in der index.php steht naja ich werd den Fehler schon noch finne...

                        Also wenn dein Vorschlag oben net funzt meld ich mich nommo!

                        Mfg deschmiddi
                        Zuletzt geändert von deschmiddi; 28.12.2003, 20:31.
                        Geht net gibts net...

                        Kommentar


                        • #13
                          headers already sent by (output started at d:\htdocs\oberstufe\index.php:10) in d:\htdocs\oberstufe\checkin2.php on line 16

                          steht doch genau da wo Du suchen musst
                          output started in zeile 10 und Du willst einen header senden in zeile 16
                          Beantworte nie Threads mit mehr als 15 followups...
                          Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                          Kommentar


                          • #14
                            Ja das weiß ich... hab ich auch nachgeguckt aber der session_start steht trotzdem in index.php zeile 1 wo er hingehört... es steht ja nix davor was sonst noch was senden könnte oder geibts noch was anderes was solch ne fehlermeldung verursacht... warte ich post mal zeile 10 der index... dann siehst dus!

                            Zeile 10:
                            PHP-Code:
                            echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
                            so und in der checkin2.php steht folgendes in Zeile 16:
                            PHP-Code:
                            header("location:index.php?mod=usrmrg&section=details&".SID.""); 
                            so und da doch session_start ganz oben steht ohne leerzeichen oder sonstige s vornedran... komisch... vor 2 Wochen hatte ich den Fehler schonmal plötzlich aber mit nem Rechnerneustart gings dann und der Fehler war weg... das geht jetzt aber auch nimmer? Muss ich vielleicht was in der php.ini ändern?

                            Gruß deschmiddi
                            Geht net gibts net...

                            Kommentar


                            • #15
                              du musst nichts an der php.ini ändern. nur dein output aus der zeile 10ff (bis zeile 15) NACH die zeile 16 schreiben.
                              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                              Kommentar

                              Lädt...
                              X