GARDEN OF THE MULTIVERSE
Privat Forum
Benutzername:
Passwort:
Passwort vergessen?
 
Deutsche Übersetzung: MyBB.de, Powered by MyBB, © 2002- MyBB Group.
Fehler und Warnungen: php8
#1
Hallo und herzlich willkommen zu einer kleinen Erklärung und Hilfestellung bei Fehlern und Warnungen durch php8. MyBB ist mindestens seit Version 1.8.33 mit php8 kompatibel und es werden seitdem mit jedem Update sowohl Fehler, als auch Warnungen behoben. Spätestens seit Version 1.8.37 gibt es auch mit php8.2.9 keine Probleme.

Alles, was nicht funktioniert oder zu unerwünschtem Verhalten führt, fällt unter Fehler.
Alles, was funktioniert und lediglich Meldungen (meist oberhalb) des Forums auswirft, fällt unter Warnungen.

Wie verhalte ich mich bei Fehlern?


Werden die Fehler nicht durch etwas, das du selbst geschrieben hast, verursacht, gilt es, diese zu dokumentieren und an die Person weiterzuleiten, die die Funktion implementiert hat. Das kann das MyBB selbst, aber auch ein Plugin sein. Beschreibe, was du getan hast, um auf diesen Fehler zu stoßen und welches Verhalten du eigentlich erwartest. Es ist im Interesse der entwickelnden Person, sich solcher Fehler anzunehmen, also trete ruhig an diejenigen heran. Gibt es keinen Support mehr, also wird weder weiterentwickelt, noch Hilfe geleistet, kannst du dich auch immer an die breite Masse wenden.

Wie verhalte ich mich bei Warnungen?


Auch die kannst du den verantwortlichen Personen zukommen lassen, aber es hat in der Regel keine Priorität. Es sind Warnungen, keine Fehler. Alles funktioniert wie es soll, es wird lediglich davor gewarnt, dass etwas nicht den gängigen Standards entsprechend implementiert wurde (in der Zukunft zu Fehlern führen kann). Für dich als Person, die das nicht entwickelt hat, kann das im Prinzip egal sein.

Also, um dich zu beruhigen: Siehst du Warnungen, aber funktioniert alles, kannst du das einfach ignorieren und musst niemanden wild machen, du würdest Fehlermeldungen sehen. Es sieht einfach nur unschön aus, daher folgendes:

Logging ein oder aus?


Solange du selbst etwas entwickelst, ist es hilfreich, Fehler zu loggen und anzuzeigen. Bist du allerdings nur nutzende Person, also entwickelst du selbst keine Plugins sowie Funktionen und funktioniert alles, solltest du nichts loggen. Ich würde hier alles ausschalten, damit weder die [inline-code]error.log[/inline-code] vollläuft, noch irgendwas angezeigt wird, wenn dann doch mal eine Warnung dabei ist. Das kannst du in einem Spiegel- und Testforum machen, aber nicht dort, wo aktiv geschrieben wird und Leute deine Seite besuchen.

Fehlermeldung bei weißer Seite anzeigen


MyBB erfasst nicht alle Fehlermeldungen. So kann es vorkommen, dass dir einfach eine weiße Seite angezeigt wird und auch nichts in der [inline-code]error.log[/inline-code] steht. Um dir den Fehler anzuzeigen, ändere folgendes in der [inline-code]global.php[/inline-code].

Suche:
PHP-Code:
<?php 
$working_dir
= dirname(__FILE__);

Füge darüber ein:
PHP-Code:
<?php 
ini_set
('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Warnungen selbst fixen


Manche Personen - mich eingeschlossen - mögen Warnungen nicht, auch wenn man sie getrost ignorieren könnte. Sie stören einfach, wenn man selber etwas entwickelt und dann erst mal filtern muss, welche Warnungen jetzt zum eigenen Plugin gehören und welche nicht (auch muss man deswegen manchmal ewig scrollen - ungünstig).
Daher hier eine kleine Erklärung, wie man Warnungen selbst beheben kann, die häufig vorkommen.

[inline-code]Undefined array key 'abc'[/inline-code]


Im Code sieht es so aus:
PHP-Code:
<?php 
$variable
['abc']
[inline-code]abc[/inline-code] ist der [inline-code]key[/inline-code] innerhalb des Arrays und enthält einen Wert ([inline-code]value[/inline-code]). Darauf können wir nur zugreifen, wenn er überhaupt existiert.

Unser [inline-code]Array[/inline-code] muss also mindestens so aussehen:
PHP-Code:
<?php 
$variable
= array('abc' => 'value');

Wie checken wir also, ob der [inline-code]key[/inline-code] überhaupt vorhanden ist? Da gibt es eine schöne Funktion, nämlich isset. Bevor wir unsere Variable also nutzen, überprüfen wir, ob es sie gibt, sie also nicht gleich [inline-code]null[/inline-code] ist:
PHP-Code:
<?php 
isset($variable['abc'])
Oder so, wenn wir nicht [inline-code]isset[/inline-code] verwenden wollen:
PHP-Code:
<?php 
$variable
['abc'] !== null

Wird die Variable in einer [inline-code]if[/inline-code]-Bedingung verwendet, haben wir es einfach:
PHP-Code:
<?php 
if ($variable['abc'])
wird zu:
PHP-Code:
<?php 
if (isset($variable['abc']))

Verwenden wir die Variable aber an anderer Stelle, müssen wir das gleiche selber einmal machen:
PHP-Code:
<?php 
$name
= $variable['abc'];
wird zu:
PHP-Code:
<?php 
$name
= isset($variable['abc']) ? $variable['abc'] : "fallback";
Das [inline-code]"fallback"[/inline-code] ist das, was angezeigt wird, wenn unsere Variable nicht existiert. Bei einem Namen kann das ein [inline-code]String[/inline-code] sein, an anderen Stellen ist [inline-code]null[/inline-code] oder [inline-code]false[/inline-code] sinnvoller.

Das Fragezeichen und der Doppelpunkt sind übrigens nur eine Kurzschreibweise für das hier:
PHP-Code:
<?php 
$name
= "fallback";

if (isset(
$variable['abc'])) {
$name = $variable['abc'];
}
Also übersetzt: wenn [inline-code]$variable['abc'][/inline-code] vorhanden, dann nimm [inline-code]$variable['abc'][/inline-code] ansonsten [inline-code]"fallback"[/inline-code].

[inline-code]Undefined variable $abc[/inline-code]


Das bedeutet, dass die Variable [inline-code]$abc[/inline-code] an einer Stelle verwendet wird, an der sie unbekannt ist. Also bspw. haben wir [inline-code]{$abc}[/inline-code] im Template stehen, aber in der php ist sie nur in einem [inline-code]if[/inline-code]-Scope oder einem [inline-code]while[/inline-code]-Loop vorhanden. Wir müssen sie auch außerhalb einmal beschreiben.
Wenn sie leer sein soll, dann machen wir das bspw. mit einem leeren String:
PHP-Code:
<?php 
$abc
= "";

Im Code sieht es dann etwa so aus:
PHP-Code:
<?php 
$abc
= "";

while (...) {
$abc = ...;
}

Haben wir [inline-code]$abc[/inline-code] als [inline-code]if[/inline-code]-Bedingung, können wir übrigens wieder mit [inline-code]isset[/inline-code] checken, ob die Variable vorhanden ist:
PHP-Code:
<?php 
if (isset($abc))

Bei MyBB tritt dieser Fall in der Regel mit [inline-code]while[/inline-code]-Loops in folgendem Kontext auf:
PHP-Code:
<?php 
while ($character = $db->fetch_array($character_query)) {
eval(
"\$character_bit = \"".$templates->get("irgendeintemplate")."\";");
}

Wie beheben wir das? So:
PHP-Code:
<?php 
$character_bit
= "";

while (
$character = $db->fetch_array($character_query)) {
eval(
"\$character_bit = \"".$templates->get("irgendeintemplate")."\";");
}

Inputs


Was immer mal wieder Probleme bereitet, ist die Art und Weise, wie Inputs angesprochen werden. Das sind die Eingabefelder von Formularen, in HTML sehen die so aus:
Code:
<input type="text" name="abc" value="ABC" />

In Plugins werden sie dann oft folgendermaßen angesprochen, was allerdings zu Warnungen führen kann:
PHP-Code:
<?php 
$mybb
->input['abc']

Lösen lässt sich das, indem wir es einfach hiermit ersetzen:
PHP-Code:
<?php 
$mybb
->get_input('abc')

Nicht in den Dateien herumwurschteln!


Und weil unsere Änderungen mit jedem Update immer wieder überschrieben werden würden, empfehle ich ganz klar, so etwas mit dem Plugin Patches umzusetzen. Sowohl bei MyBB selbst, als auch bei Plugins, die nicht unsere eigenen sind.



Dieser Thread ist sowohl eine Ergänzung zu diesem hier als auch eine knappe grobe Anleitung zur Selbsthilfe und Beruhigung der Nerven, wenn das Forum plötzlich ganz viele Warnungen auswirft, die man eigentlich ignorieren könnte. Außerdem bezieht es sich explizit auf php8, während nach wie vor noch viele Foren auf einer 7er Version laufen und es Bedenken bei der Umstellung gibt.

Es gibt noch viele andere Wege, Warnungen zu fixen und die hier aufgeführten sind nur Beispiele in den gängigsten Fällen und sollen lediglich als Orientierung dienen. Zum Fixen von Fehlern habe ich hier explizit nichts geschrieben, weil das viel komplexer ist und sich da jeweils ein eigener Thread im Supportbereich anbietet.
Zitieren
« Ein Thema zurück | Ein Thema vor »