php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.03.2007, 12:15  
Benutzer
 
Registriert seit: 24.11.2005
Beiträge: 65
250Euro
Standard PHP Bug oder Programmfehler

Hi, ich hab ien Problem mit meinem ErrorHandler.
Ich bekomme immer, egal ob ein Fehler auftriit und der Error Handler benutzt wird opder nicht, die Fehlermeldung:
Code:
Fatal error: Class declarations may not be nested in /home/www/kunden/matthes-enderlein-gymnasium.de/klassen/errorhandle.class.php on line 15
In Zeile 15 steht nur
Code:
 class errorHandle {
Irgendwie weis ich nich weiter. http://bugs.php.net/bug.php?id=35634 <- hier steht, irgendwie was von nem Bug der irgendwie keiner is sondern n Programmfehler. Ich hab aber keine Ahnung ob dies einer is. Ich hab auch schon paar mal getestet und da kam auch keine Fehler im Skript.

Bitte helft mir mal.

Hier ist der Code:
PHP-Code:
<?php
class errorHandle {
  
/**
  * Fehler Level
  * @var int
  * @access private
  */
  
private $errorLevel;
  
  
/** 
  * Fehlermeldung
  * @var string
  * @access private
  */
  
private $errorMsg;
  
  
/**
  * Datei in der der Fehler aufgetreten ist
  * @var string
  * @access private
  */
  
private $errorFile;
  
  
/**
  * Zeile in der der Fehler aufgetreten ist
  * @var int
  * @access private
  */
  
private $errorLine;
  
  
/**
  * Pfad der Logdatei
  * @var string
  * @access private
  */
  
private $logFile 'test.txt';
  
  
/**
  * Gibt an ob einen E-Mail versendet werden soll oder nicht
  * @var boolean
  * @access private
  */
  
private $email false
  
  
/**
  * E-Mail Adresse an die der Fehler Report geschickt wird
  * @var string
  * @access private
  */
  
private $emailAddress 'egal@web.de';
  
  
/**
  * Gibt an ob die Fehlermeldung ausgegeben wird oder nicht
  * @var boolean
  * @access private
  */
  
private $dispErrors true;
  
  
/**
  * Fehlermeldung wenn ein Fehler beim ausfuehren dieser Klasse auftritt
  * @var string
  * @access private
  */
  
private $totalErrorMsg 'Es ist ein Fehler bei der Fehlerbehandlung aufgetreten.';
    
  
/**
  * Konstruktor
  * @param int $errorLevel Fehler Level
  * @param string $errorMsg Fehlermeldung
  * @param string $errorFile Datei in der der Fehler aufgetreten ist
  * @param int $errorLine Zeile in der der Fehler aufgetreten ist
  * @param strig $logFile Pfad der Logdatei
  * @param boolean $email Gibt an ob einen E-Mail versendet werden soll oder nicht
  * @param string $emailAddress Optional, E-Mail Adresse an die die Mail versendet wird
  * @param boolean $diplayErrors Optional, gibt an ob die konkreten Fehlermeldungen angezeigt werden sollen
  * @return void
  * @access public
  */
  
public function __construct($errorLevel$errorMsg$errorFile$errorLine){    
    
$this->errorLevel $errorLevel;
    
$this->errorMsg $errorMsg;
    
$this->errorFile $errorFile;
    
$this->errorLine $errorLine;
    
    
$this->checkLogFile();    
    if(
$email$this->sendMail();
    
$this->displayError(); 
  }
  
  
/**
  * Prueft ob der Fehler schon gelogt ist
  * @return boolean
  * @access private
  */
  
private function checkLogFile() {
    
$content $this->readLogFile();

    
$ex explode('###END ERROR###'$content);
    
$size count($ex)-1;
    
    for(
$i 0$i $size$i++) {
      
$levelEx explode('Level:'$ex[$i]);
      
$dateiEx explode('Datei:'$levelEx[1]);
      
$zeilenEx explode('Zeile:'$dateiEx[1]);
      
$datumEx explode('Datum:'$zeilenEx[1]);     
      
$msgEx explode('Nachricht:'$datumEx[1]);

      if(
trim($msgEx[1]) == $this->errorMsg && 
         
trim($dateiEx[0]) == $this->errorLevel &&
         
trim($zeilenEx[0]) == $this->errorFile &&
         
trim($datumEx[0]) == $this->errorLine) {
        return;
      }
    }
    
$this->logError();
  }
  
  
/**
  * Oeffnet die Logdatei
  * @return resource
  * @access private
  */
  
private function openLogFile() {
    if(!
is_readable($this->logFile)) {
      echo 
$this->totalErrorMsg;
      exit();    
    }    
    if(!
$fp fopen($this->logFile'ab+')) {
      echo 
$this->totalErrorMsg;
      exit();     
    }
    return 
$fp;  
  }
  
  
/**
  * Liest die Logdatei
  * @access mixed: bei Erfolg string(Inhalt der Logdatei)
  *                bei Fehlschlag false
  * @return string
  */
  
private function readLogFile() {
    if(
filesize($this->logFile) == 0)
      
$filesize 1;
    else 
      
$filesize filesize($this->logFile);
   
    return 
fread($this->openLogFile(), $filesize);
  }
  
  
/**
  * Logt den Fehler
  * @return boolean
  * @access private
  */
  
private function logError() {
    if(!
$fp $this->openLogFile()) {
      return 
false;
    }
    
    
$date date('d.m.y; H:i');
    
$err = <<<MSG
###START ERROR###
Level: 
{$this->errorLevel}
Datei: 
{$this->errorFile}
Zeile: 
{$this->errorLine}
Datum: 
{$date}
Nachricht: 
{$this->errorMsg}
###END ERROR###

MSG;
    if(
fwrite($fp$err)) {
      return 
true;
    } else {
      echo 
$this->totalErrorMsg;
      exit();
    }
  }
  
  
/**
  * Versemdet die E-Mail
  * @access private
  * @return boolean
  */
  
private function sendMail() {
    require_once
'phpmailer.class.php';
    
$mailer = new PHPMailer();
    
    
$mailer->FromName 'MEG-Bugreport';
    
$mailer->From 'bug_report@meg.de';
    
$mailer->AddAddress($this->emailAddress);
    
$mailer->Subject 'Es ist ein Fehler aufgetreten';
    
$date date('d.m.y; H:i');
    
$mailer->Body = <<<MSG
###START ERROR###
Level: 
{$this->errorLevel}
Datei: 
{$this->errorFile}
Zeile: 
{$this->errorLine}
Datum: 
{$date}
Nachricht: 
{$this->errorMsg}
###END ERROR###
MSG;
    if(
$mailer->send()) {
      return 
true;
    } else {
      echo 
$this->totalErrorMsg;
      exit();
    }
  }
  
  
/**
  * Gibt die Felhlermeldung aus
  * @return void
  * @access private
  */
  
private function displayError() {
    require_once
'smarty/Smarty.class.php';
    
$smarty = new smarty();
    
    
$smarty->compile_dir 'templates_c/standart';
    
$smarty->template_dir 'templates/standart';
    
    
$msg 'Es ist ein interner Fehler aufgetreten.';
    if(
$this->dispErrors === true) {
      
$date date('d.m.y; H:i');
      
$msg .= <<<MSG

[b]Fehler Report[/b]

Level: 
{$this->errorLevel}

Datei: 
{$this->errorFile}

Zeile: 
{$this->errorLine}

Datum: 
{$date}

Nachricht: 
{$this->errorMsg}

MSG;
    }
    if(
$this->errorLevel == '256' || $this->errorLevel == '512' ||
       
$this->errorLevel == 'E_USER_ERROR' || $this->errorLevel == 'E_USER_WARNING') {
      
ob_clean();
      
$smarty->assign('error_msg'$msg);
      
$smarty->assign('title''System-Fehler');
      
$smarty->display('system_error.tpl');
      
ob_end_flush();
      exit();
    } else {
      
$smarty->assign('error_msg'$msg);
      
$smarty->display('error.tpl');
    }
  }  
}
?>
250Euro ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.03.2007, 12:21  
Benutzer
 
Registriert seit: 24.11.2005
Beiträge: 65
250Euro
Standard

ich benutze PHP Version 5.1.2
250Euro ist offline  
Alt 01.03.2007, 12:48  
CIX88
Gast
 
Beiträge: n/a
Standard

Mit PHP-Highlicht würde man das besser erkennen.

Zitat:
$date = date('d.m.y; H:i');
$date = date('d.m.y H:i');

EDIT:

Hatte jedenfalls einige parse_error

$msg .= <<<MSG <- dahinter Leerzeichen weg machen
MSG; <- dahinter Leerzeichen weg machen
 
Alt 01.03.2007, 14:35  
Benutzer
 
Registriert seit: 24.11.2005
Beiträge: 65
250Euro
Standard

Hi,
mh erstmal danke für deine Antwort. Ich habe jetz das Semikolon weggemacht und bei den heredocs waren eigentlich keine leerzeichen(sonst hätte php schon lange gemeckert^^). Das blöde daran is es funktioniert trotzdem nich.

MfG 250
250Euro ist offline  
Alt 01.03.2007, 15:00  
CIX88
Gast
 
Beiträge: n/a
Standard

Bei mir sind dann keine Fehler mehr gekommen.
Immer noch die selbe Fehlermeldung bei dir ?
 
Alt 01.03.2007, 15:01  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich denke der fehler liegt in der datei die die klasse einbinded oder?
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 01.03.2007, 15:06  
Benutzer
 
Registriert seit: 24.11.2005
Beiträge: 65
250Euro
Standard

Jo, es ist immernoch der selbe Fehler;
PHP-Code:
set_error_handler('errorHandler');

/**
* Error-Handler
* @param int $errLvl Fehlerstufe
* @param string $errMsg Fehlermeldung
* @param string $errFile Skript das den Fehler ausgel&ouml;st hat
* @param int $errLine Zeile in der der Fehler ausgel&ouml;st wurde
*/
function errorHandler($errLvl$errMsg$errFile$errLine) {
  require_once 
'klassen/errorhandle.class.php';
  new 
errorHandle($errLvl$errMsg$errFile$errLine);

So wird die Sache eingebunden.
Das Problem is bei mir zu Hause funzt das auch einwandfrei, blos auf dem Server eben nich.

MfG 250
250Euro ist offline  
Alt 01.03.2007, 15:09  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

vll weil der server set_error_handler(); verbietet?
schreib doch mal ne abfrage dazu
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 01.03.2007, 15:13  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von 250Euro
Jo, es ist immernoch der selbe Fehler;
PHP-Code:
set_error_handler('errorHandler');

/**
* Error-Handler
* @param int $errLvl Fehlerstufe
* @param string $errMsg Fehlermeldung
* @param string $errFile Skript das den Fehler ausgel&ouml;st hat
* @param int $errLine Zeile in der der Fehler ausgel&ouml;st wurde
*/
function errorHandler($errLvl$errMsg$errFile$errLine) {
  require_once 
'klassen/errorhandle.class.php';
  new 
errorHandle($errLvl$errMsg$errFile$errLine);

So wird die Sache eingebunden.
Das Problem is bei mir zu Hause funzt das auch einwandfrei, blos auf dem Server eben nich.
Bist du dir sicher, dass das bei dir zuhause läuft? (und nichtnur einfach die Fehlermeldung unterdrückt wird?)

Kommt mir spanisch vor eine Klassendefinition in eine Funktion zu setzen....
__________________
Today you...Tomorrow me.
agrajag ist offline  
Alt 01.03.2007, 15:21  
Benutzer
 
Registriert seit: 24.11.2005
Beiträge: 65
250Euro
Standard

also ich hab das jetz mal so getest:
PHP-Code:
if(set_error_handler('errorHandler') === false) {
  echo 
'nein';
} else {
  echo 
'ja';
}
function 
errorHandler($errLvl$errMsg$errFile$errLine) {
  echo 
'error';

und mich dabei auf den satz aus dem manual bezogen:
Zitat:
Die Funktion gibt die zuvor benutzte Fehlerbehandlungsroutine (falls eine definiert wurde) zurück oder FALSE, falls ein Fehler auftrat
set_error_handler() ist demnach gängig. Es wäre doch eigenltich auch komisch, wenn die Funktion nicht erlaubt wäre. Dann käme da bestimmt ne andre Fehlermeldung.,

mfg
250Euro ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Programmfehler PHP Tipps 2004 21 06.06.2004 22:38

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
\errorlevel 512\

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.