anpera.net
https://anpera.dyndns.org/phpbb3/

Tutorial: Wie vermeide ich Notice-Fehler?
https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=2439
Seite 1 von 1

Autor:  Eliwood [ So 09 Apr, 2006 15:15 ]
Betreff des Beitrags:  Tutorial: Wie vermeide ich Notice-Fehler?

In der dbwrapper.php hat es eine Funktion, error_reporting(), die folgendes aussagt:
[php]error_reporting(E_ALL ^ E_NOTICE);[/php]
Zu Deutsch heisst diese Stelle: Zeige alle Errors, aber keine Notizen.
Nun, ändert man diese Stelle in:
[php]error_reporting(E_ALL);[/php]
Merkt man, was "Notizen" sind.

Beim nächsten Aufruf einer beliebigen Seit springen einem "mehrere" Fehler ins Auge, man muss einiges Scrollen, bis man zu der eigentlichen Ausgabe kommt.
Dabei handelt es sich meist um folgende Fehler:

$this->bbcode_second_pass_code('', 'Notice: Use of undefined constant user - assumed 'user' in C:\SERVER\xampp\htdocs\logd\common.php on line 102

Notice: Undefined variable: extra in C:\SERVER\xampp\htdocs\logd\lib\addnav.php on line 111')

Zuerst zur letzten Fehlermeldung. Diese Fehlermeldung tritt zum Beispiel bei folgendem Stück Code auf:
[php]for($i = 0;$i < 10;$++)
{
$blub .= 'Blub';
}[/php]
Hier wird die Fehlermeldung einmal kommen, und zwar aus folgendem Grund:
Wenn die Schlaufe das erste mal durchlaufen wird, gibt es die Variable nicht. Folglich müsste 'Blub' an nichts angehängt werden, was eigentlich nicht geht. PHP merzt dies aus, indem es jetzt die Variable setzt mit leerem Wert. Nebenher gibt PHP nen Notice aus, mit etwa dem Inhalt aus der letzten, oben genannten Fehlermeldung.
Auf den ersten Blick sieht es nicht kritisch aus, doch wenn man es ausserhalb von LoGD-Scripten, oder auf Seiten macht, bei denen man beliebige URL's eingeben kann ohne eine badnav zu erwarten, kann es zu einigen Lücken kommen.
Deshalb sollte das Stück Code so aussehen:
[php]$blub = '';
for($i = 0;$i < 10;$++)
{
$blub .= 'Blub';
}[/php]
Somit verschwindet wenigstens der Fehler, und wir haben nur noch den anderen Fehler zu bekämpfen. Der weitaus bösere, will ich meinen.

Dieser Fehler lässt sich nämlich auf folgendes zurück führen:
[php]print $session[user][gold];[/php]
So stehn gelassen passiert das gewünschte, das Gold des Spielers wird ausgegeben. Warum sollten wir uns also die Mühe machen, und user und gold als richtige Strings angeben?
Warum sollten wir PHP nicht machen lassen, was mir machen müssten?
Nun, das kann das folgende Beispiel erklären:
[php]$session['user'] = array( "gold" => 50, "gems" => 3);
print $session[user][gold]; // Gibt aus: 50
print $session['user']['gold']; // Gibt aus: 50

define('gold','gems');
print $session[user][gold]; // Gibt aus: 3!!!!
print $session['user']['gold']; // Gibt aus: 50!![/php]
Huch? Warum gibt einmal der Code 3 aus anstatt 50?
Leicht zu erklären. Folgendes ist passiert:
Es wurde eine Konstante "gold" mit dem Wert "gems" definiert. Konstanten sind ähnlich Variablen, nur dass sie für gewöhnlich Superglobal sind und kein '$' brauchen, mit $ ist es eine Variable und kan wiederum andere Werte haben!
Mit "print gold;" bekommen wir nun "gems" ausgegeben. Genau den Wert, den wir der Konstante "gold" auch zugewiesen haben.
Und da PHP zuerst annimmt, dass es sich in "$session[user][gold]" auch um 2 Konstanten handeln kann, wird "gold" nun nach dem definieren von "gold" in Wirklichkeit zu "gems".
Wenn es die Konstante nicht gibt, ist es nur die PHP-Fehlerkorrektur zu verdanken, dass die Konstante "gold" als String angenommen wird und zu zum richtigen Ergebnis führt.

Deshalb ist es wichtig, dass man Array-Schlüssel als richtige Strings angibt, und, auch wenn es mühsam ist, die Single-, bzw. Double-Quotes schreibt.

Mit freundlichen Grüssen und Hoffnung, dass nun diese Tendenz abnimmt,
Eliwood.

PS: Wer es nicht glauben kann sollte man folgendes in die common.php setzen:
[php]// Nach
$output = "";
// Füge hinzu:
define('user',"Es war einmal ein kleiner Fehler....");[/php]

Autor:  Talion [ Mo 10 Apr, 2006 08:15 ]
Betreff des Beitrags: 

Das ist mal ne Super-Idee!
Es stimmt wirklich, der LOGD-Code ist größtenteils eine einzige Katastrophe. Wem es nun zu viel Arbeit ist, seine Scripts von Hand anzupassen, für den haben wir ein feines, kleines Werkzeug: Den Code-Beautifier.

http://atrahor.de/code_beautifier/beautify.html

Zusätzlich zur (sehr guten) Standardversion haben wir einige Verbesserungen implementiert. U.a. werden alle HTTP_.. durch die neuen superglobalen Pendants ersetzt. Der von Eliwood oben beschriebene Fehler mit den nicht in Quotes eingefassten Array-Schlüsseln wird ebenfalls behoben.
Doch Vorsicht: Manchmal zickt das Teil ein bißchen rum (z.b. bei Einbindungen von Vars in Strings mittels {}), d.h. den Output nicht ungeprüft übernehmen, sondern vorher nochmal durchsehen! In der Regel geht die Sache aber zu 95% glatt und ist wesentlich weniger Arbeit, als alles händisch zu verschönern.

Autor:  Devilzimti [ Mo 10 Apr, 2006 11:09 ]
Betreff des Beitrags: 

Ahh das klingt interessant. Mir is das ganze schonmal aufgefallen, hatte aber keine Lust alle Fehler zu beheben ^_^

Autor:  Eliwood [ Mo 10 Apr, 2006 15:46 ]
Betreff des Beitrags: 

@ Talion: Nettes Ding, nur kann es leider nicht hellsehen und kann einige Stückchen Code wiederum verunstalten:

[php]define('arraykey','user');

print $_SESSION[arraykey];[/php]

Da wird nämlich der Sinn totel verdreht mit dem Maschinchen, deshalb ist es von Hand wohl am sichersten :)


Notice 3

Eine weitere PHP-Notiz kann bei folgendem Stück Code auftauchen:

[php]$array = array("Banane" => "Gelb");

if($array['Apfel'] == "") print "Apfel hat keine Farbe!";[/php]

Und zwar, weil "Apfel" hier kein bestehender Array-Schlüssel ist. Deshalb empfiehlt sich eher folgende Überprüfung:

[php]if(isset($array['Apfel']) && $array['Apfel'] == "") print "Apfel hat keine Farbe";[/php]

Autor:  Chaosmaker [ Mo 10 Apr, 2006 17:38 ]
Betreff des Beitrags: 

Da die Prüfung mit isset() und =="" aber immer häßlich aussieht und vor allem so lang zu schreiben ist, hat uns (der PHP-)Gott am *Kalender betracht* ersten Tag der Woche ein praktisches Werkzeug zur Hand gegeben. ;)

Autor:  Eliwood [ Di 11 Apr, 2006 20:09 ]
Betreff des Beitrags: 

Argh... Wusste nicht, dass empty auch keinen Notice ausgibt :)

Notice-Fehlermenge
Nachdem ich ein paar wenige Notice-Fehler - vor allem in den häufigsten Orten - behoben hab, hab ich nen error_handler gebaut, er mit die Notice in eine Datei schreibt.
Ergebnis:

Erster Eintrag: [10.04.2006 06:31]
Letzter Eintrag: [11.04.2006 09:02]

Insgesamt etwa knapp 12 Megabyte ist die Textdatei gross.
Und dabei hab ich vielleicht einen User am Tag *g

Autor:  Montekar [ Sa 03 Jun, 2006 20:13 ]
Betreff des Beitrags: 

öhm...
Aber

[php]
if (...)
{

}
[/php]

Is aber doch nicht w3c Standart oder? Das macht man doch nur bei funktionen...

Autor:  Eliwood [ Sa 03 Jun, 2006 20:55 ]
Betreff des Beitrags: 

Montekar hat geschrieben:
öhm...
Aber

[php]
if (...)
{

}
[/php]

Is aber doch nicht w3c Standart oder? Das macht man doch nur bei funktionen...


Das W3C sagt doch bei PHP nix ôÒ
W3C standardisiert zum Beispiel HTML-Schreibweisen, JS, da die von verschiedenen Programmen interpretiert werden. PHP wird nur von "PHP" geparst, also ist das doch egal-

Und ob man:
[php]if (true) {
dont();
}[/php]
Oder
[php]if(true)
{
dont();
}[/php]
Oder
[php]if(true):
dont();
endif;[/php]
schreibt ist egal, es ist das gleiche.

Autor:  Montekar [ So 04 Jun, 2006 12:06 ]
Betreff des Beitrags: 

Sry ich hatte mich verschrieben ich mein Pear die sagen jedenfalls das man es so

[php]
if ($session['user']['gold']<100) {
||||output("Hah ha du bist arm *g*");
}
[/php]

machen sollen

(Das | steht für ein Leerzeichen)

EDIT: Ja egal ist es aber so könnt mans mit ner Funktion verwechseln die mann ja so schreiben soll...
Ach ja Eliwood danke für den Tipp mit den '' Zeichen hab gestern Abend alle meine Scripte überarbeitet :D

Autor:  Harthas [ So 04 Jun, 2006 13:57 ]
Betreff des Beitrags: 

$this->bbcode_second_pass_code('', 'Notice: Undefined index: insertcommentary in /home/www/web267/html/hogwarts/common.php on line 1484')

Und wenn man einen undefinierten index hat?

die zeile in der common.php wäre:
[php]
if ($HTTP_POST_VARS['insertcommentary'][$section]!==NULL &&[/php]

Und das nächste

$this->bbcode_second_pass_code('', 'Notice: Undefined offset: 10 in /home/www/web267/html/hogwarts/common.php on line 1679')

Die Zeile der common dazu

[php]if ($op[$i]=="")[/php]

Autor:  Eliwood [ So 04 Jun, 2006 14:25 ]
Betreff des Beitrags: 

Harthas hat geschrieben:
$this->bbcode_second_pass_code('', 'Notice: Undefined index: insertcommentary in /home/www/web267/html/hogwarts/common.php on line 1484')

Und wenn man einen undefinierten index hat?

die zeile in der common.php wäre:
[php]
if ($HTTP_POST_VARS['insertcommentary'][$section]!==NULL &&[/php]

Und das nächste

$this->bbcode_second_pass_code('', 'Notice: Undefined offset: 10 in /home/www/web267/html/hogwarts/common.php on line 1679')

Die Zeile der common dazu

[php]if ($op[$i]=="")[/php]


Dann schreibst es so:
[php]if (!empty($HTTP_POST_VARS['insertcommentary'][$section]) &&[/php]

Oder
[php]if (isset($HTTP_POST_VARS['insertcommentary'][$section]) &&[/php]
Dann kommt kein Notice ;)

Autor:  Deus X Machina [ Mo 05 Okt, 2009 16:39 ]
Betreff des Beitrags:  Re: Tutorial: Wie vermeide ich Notice-Fehler?

Der Thread hat zwar schon ziemlich etwas auf dem Buckel, hat aber ganz offensichtlich nichts an Aktualität verloren.
Um beim Ausbau mit nem halbwegs sauberen Code zu starten habe ich mich daran gemacht mal die Fehler nach und nach auszuarbeiten (aufwendig, aber fühlt sich gut an und man lernt einiges dabei)
Im Moment bin ich noch an Fehlertyp
PHP:
Notice: Use of undefined constant user - assumed 'user' in C:\SERVER\xampp\htdocs\logd\common.php on line 102
hauptsächlich dran. Dabei bin ich über welche gestolpert wo mir die Zuordnung - ändern oder nicht ändern - etwas schwer fällt, vielleicht kann mir ja weitergeholfen werden:
Betroffen sind solche Aussagen:
PHP:
$info [1]
Gefunden zum Beispiel in der Anpera Version in der common.php in function showform, function createarray, function getgamedate
oder auch in einigen Zeilen, z.B. Zeile 1164 die so aussieht:
PHP:
$footer = "<table border='0' cellpadding='5' cellspacing='0' align='right'><tr><td><b><a href='viewpetition.php'>Anfragen</a>$petitions['star']:</b> $petitions[0] Ungelesen, $petitions[1] Gelesen, $petitions[2] Geschlossen.</td></tr></table>".$footer;)
Auch auf die Gefahr hin dass das jeder der sich schon halbwegs damit auskennt weiß und ich mich blamiere:
Sind diese Ziffern auch Variablen? Oder auf was beziehen sich die? Und am wichtigsten:
PHP:
$info [1]
ODER
PHP:
$info ['1']
?
Die anderen Fehler machen mir auch noch Probleme, aber ich will mal einen nach dem anderen Angehen, werde aber fürchte noch weitere Fragen stellen ;)

Autor:  Eliwood [ Mo 05 Okt, 2009 16:55 ]
Betreff des Beitrags:  Re: Tutorial: Wie vermeide ich Notice-Fehler?

Dieser Notice betrifft nur strings wie user, die ohne '' oder "" rumstehen. Die könnten nämlich auch Konstanten sein - Ziffern sind Ziffern und sollten ohne '' und "" geschrieben werden - es sei denn, man meint auch einen String mit Zahlen drin. Spielt aber bei PHP keine ROlle.

Autor:  Deus X Machina [ Fr 08 Jan, 2010 22:19 ]
Betreff des Beitrags:  Re: Tutorial: Wie vermeide ich Notice-Fehler?

Nach Auffrischen meiner Kenntnisse, Lernen von PHP und Logd und allgemeiner Steigerung meines Verständnisses habe ich heute beschlossen mich mal an die weiteren Notice Fehler zu wenden (variablen und index), oder mir zumindest anzusehen ob ich da weiterkomme. Und tatsächlich konnte ich ein paar davon Probeweise aus dem netten Fehlerkatalog werfen. Es wär mir aber lieb wenn da einer drüber sehen könnte und mir sagen ob das auch wirklich das gleiche und richtig ist, weil wenn ich das richtig verstehe kann ja eine falsche Anwendung von einem "!" [if empty() vs. if !empty()] den Sinn einer Überprüfung genau umdrehen. Folgende drei Codestückchen hab ich mir zum trainieren vorgenommen:$this->bbcode_second_pass_code('', 'if (!empty($session['loggedin'])){
//if ($session['loggedin']){

if (empty($session['user']['loggedin']) && !$allowanonymous[$SCRIPT_NAME]){
//if ($session['user']['loggedin']!=true && !$allowanonymous[$SCRIPT_NAME]){

if (!empty($session['user']['hitpoints'])){
//if ($session['user']['hitpoints']>0){')Wie man sieht wurde ersetzt die obere Codezeile die jeweils darunterliegende. Ich geh besser auf Nummer sicher ob ich das richtig mache, bevor dann irgendeine wichtige Funktion nicht ausgeführt wird die nicht auffällt (optisch) - da sind mir schon welche untergekommen die nicht zum tragen kamen wegen kleiner Fehler (okay, zumindest eine), von dem man aber nichts merkte wenn man nicht wusste dass es da war und auf eine bestimmte Weise funktionieren musste.

Autor:  Welv [ Fr 08 Jan, 2010 22:34 ]
Betreff des Beitrags:  Re: Tutorial: Wie vermeide ich Notice-Fehler?

ich hab mir für sowas ne kleine Funktion geschrieben

$this->bbcode_second_pass_code('', '
function cvar(&$str){
#CheckVARiable
#Prüft ob eine Variable od. ein Array (Arrayschlüssel) vorhanden ist und einen Wert hat. Liefert den Wert oder false zurück.
#Verhinderung von NOTICE-Fehler
if(isset($str)){
if($str=="0") return 0;
else return $str;
}
else return false;
}
')

//if (cvar($session['loggedin'])){
//if ($session['loggedin']){


if ((int)cvar($session['user']['hitpoints'])>0)
if ($session['user']['hitpoints']>0)

Autor:  Eliwood [ Fr 08 Jan, 2010 23:06 ]
Betreff des Beitrags:  Re: Tutorial: Wie vermeide ich Notice-Fehler?

Wie wärs mit empty, Welv?

Empty prüft, ob NUL, '', 0, 0.0 oder false - wenn ja, gibts true zurück. Also ist deine Funktion überflüssig - ausser, dass sie leicht Schreibarbeit spart. Verleitet aber zum selben Programmierstil, wie einfach nicht zu prüfen ob die Variable gesetzt ist, deshalb ist eine richtige Prüfung deiner Version eindeutig vorzuziehen. Nebenbei verbrauchst du auch (wenig) CPU-Zeit damit.

@Deus ex Machina:
$this->bbcode_second_pass_code('', 'if (!empty($session['loggedin'])){
//if ($session['loggedin']){')
Ja, das ist synonym.

$this->bbcode_second_pass_code('', 'if (empty($session['user']['loggedin']) && !$allowanonymous[$SCRIPT_NAME]){
//if ($session['user']['loggedin']!=true && !$allowanonymous[$SCRIPT_NAME]){')
Warum lässt du den zweiten Teil in Ruhe? Der ist genauso Notice-Fehleranfällig.
$this->bbcode_second_pass_code('', 'if (empty($session['user']['loggedin']) && empty($allowanonymous[$SCRIPT_NAME])){')


$this->bbcode_second_pass_code('', 'if (!empty($session['user']['hitpoints'])){
//if ($session['user']['hitpoints']>0){')
Das hingegen ist nicht synonym. !empty meint hier ungleich NUL, 0, 0.0, '' oder false. < 0 würde hier false für empty liefern, und ! macht daraus true - du willst aber für Zahlenwerte <= 0 ein false.
$this->bbcode_second_pass_code('', 'if (!empty($session['user']['hitpoints']) AND $session['user']['hitpoints'] > 0){')

Aber anstatt nun jeden session['user']-Wert zu überprüfen würd ich das anders machen - prüfen, ob eingeloggt, wenn ja, ist session['user'] gesetzt. Dann session['user'] verwenden. Wenn false, anderen Code schreiben, der nicht darauf zurückgreift.

Autor:  Deus X Machina [ Fr 15 Jan, 2010 19:39 ]
Betreff des Beitrags:  Re: Tutorial: Wie vermeide ich Notice-Fehler?

Eliwood hat geschrieben:
$this->bbcode_second_pass_code('', 'if (empty($session['user']['loggedin']) && !$allowanonymous[$SCRIPT_NAME]){
//if ($session['user']['loggedin']!=true && !$allowanonymous[$SCRIPT_NAME]){')
Warum lässt du den zweiten Teil in Ruhe? Der ist genauso Notice-Fehleranfällig.
$this->bbcode_second_pass_code('', 'if (empty($session['user']['loggedin']) && empty($allowanonymous[$SCRIPT_NAME])){')
Simpel: Da ich solche Fehlerquellen noch nicht mit freiem Auge erkenne schalte ich zur Suche die Noticefehler ab und rufe die Seite auf. Was mir angezeigt wird sehe ich mir an und versuche es zu beheben, und wie gesagt, ich hatte mir nur ein paar rausgepickt. Der zweite Teil war (noch) nicht bei denen die ich gesehen habe.
Eliwood hat geschrieben:
$this->bbcode_second_pass_code('', 'if (!empty($session['user']['hitpoints'])){
//if ($session['user']['hitpoints']>0){')
Das hingegen ist nicht synonym. !empty meint hier ungleich NUL, 0, 0.0, '' oder false. < 0 würde hier false für empty liefern, und ! macht daraus true - du willst aber für Zahlenwerte <= 0 ein false.
$this->bbcode_second_pass_code('', 'if (!empty($session['user']['hitpoints']) AND $session['user']['hitpoints'] > 0){')
Ach du meine Güte, was für ein Aussetzer... An Werte unter Null hatte ich aus irgendeinem Grund nicht gedacht...
Eliwood hat geschrieben:
Aber anstatt nun jeden session['user']-Wert zu überprüfen würd ich das anders machen - prüfen, ob eingeloggt, wenn ja, ist session['user'] gesetzt. Dann session['user'] verwenden. Wenn false, anderen Code schreiben, der nicht darauf zurückgreift.
Das wäre natürlich einfacher, aber einerseits betrifft es nicht immer $session Werte, andererseits wüsste ich leider einfach nicht wo ich diese Überprüfung genau machen sollte damit das alles funktioniert, dazu müsste ich mich wohl noch viel mehr durch den Code graben um das festzustellen (da fast alle dieser Fehler in der Common auftauchen) wobei sie eigentlich von der Index.php ausgehen müssten... (da ich ja wegen meiner Methode über die nicht hinauskomme...) Naja eventuell schaffe ichs ja doch irgendwie, probieren kann ichs ja ;)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/