it-swarm.com.de

Referenz - Was bedeutet dieser Fehler in PHP?

Was ist das?

Dies ist eine Reihe von Antworten auf Warnungen, Fehler und Hinweise, die beim Programmieren auftreten können PHP und Sie haben keine Ahnung, wie Sie das Problem beheben können. Dies ist auch ein Community-Wiki, daher ist jeder eingeladen, an der Erweiterung und Pflege dieser Liste teilzunehmen. 

Warum ist das?

Fragen wie "Bereits gesendete Header" oder "Ein Mitglied eines Nichtobjekts aufrufen" werden beim Stack Overflow häufig angezeigt. Die Ursache dieser Fragen ist immer die gleiche. Die Antworten auf diese Fragen wiederholen sie in der Regel und zeigen dann dem OP an, welche Zeile in seinem speziellen Fall geändert werden muss. Diese Antworten fügen der Site keinen Wert hinzu, da sie nur für den speziellen Code des OP gelten. Andere Benutzer mit demselben Fehler können die Lösung nicht leicht auslesen, da sie zu lokalisiert sind. Das ist traurig, denn wenn Sie die Grundursache verstanden haben, ist die Behebung des Fehlers trivial. Daher versucht diese Liste, die Lösung allgemein zu erläutern.

Was soll ich hier machen?

Wenn Ihre Frage als Duplikat markiert wurde, finden Sie unten Ihre Fehlermeldung und wenden Sie den Fix auf Ihren Code an. Die Antworten enthalten in der Regel weitere Links, die untersucht werden sollten, falls dies nicht aus der allgemeinen Antwort ersichtlich sein sollte.

Wenn Sie einen Beitrag leisten möchten, fügen Sie bitte Ihre "bevorzugte" Fehlermeldung, Warnung oder Benachrichtigung, eine Antwort pro Antwort, eine kurze Beschreibung der Bedeutung (auch wenn nur Begriffe auf der Manpage hervorgehoben werden), eine mögliche Lösung oder ein Debugging-Ansatz hinzu eine Auflistung der bestehenden Fragen und Antworten, die von Wert sind. Sie können auch vorhandene Antworten verbessern.

Die Liste

Siehe auch 

993
hakre

Warnung: Header-Informationen können nicht geändert werden - Header wurden bereits gesendet

Dies geschieht, wenn Ihr Skript versucht, einen HTTP-Header an den Client zu senden, jedoch zuvor bereits eine Ausgabe erfolgte, die dazu führte, dass Header bereits an den Client gesendet wurden.

Dies ist ein E_WARNING und das Skript wird nicht angehalten.

Ein typisches Beispiel wäre eine Vorlagendatei wie folgt:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

Die Funktion session_start() versucht, Header mit dem Sitzungscookie an den Client zu senden. PHP hat jedoch bereits Header gesendet, als das <html>-Element in den Ausgabestream geschrieben wurde. Sie müssten die session_start() nach oben verschieben.

Sie können dieses Problem lösen, indem Sie die Zeilen vor durchlaufen, um die Warnung auszulösen, und prüfen, wo sie ausgegeben wird. Verschieben Sie einen Header-Sendecode vor diesem Code. 

Eine oft übersehene Ausgabe ist eine neue Zeile nach dem ?> von PHP. Es wird als Standardpraxis angesehen, ?> wegzulassen, wenn es das letzte in der Datei ist. Eine weitere häufige Ursache für diese Warnung ist, dass vor dem Öffnen <?php ein Leerzeichen, eine Zeile oder ein unsichtbares Zeichen angezeigt wird. Der Webserver sendet dann die Header und die Whitespace/Newline, wenn PHP mit dem Analysieren von won 'beginnt. Es kann keine Kopfzeile übergeben werden.

Wenn Ihre Datei mehr als einen <?php ... ?>-Codeblock enthält, sollten Sie keine Leerzeichen zwischen sich enthalten. (Hinweis: Möglicherweise verfügen Sie über mehrere Blöcke, wenn der Code automatisch erstellt wurde.)

Stellen Sie außerdem sicher, dass sich in Ihrem Code keine Byte-Reihenfolge-Markierungen befinden, zum Beispiel, wenn die Codierung des Skripts UTF-8 mit BOM ist.

Verwandte Fragen:

247
Gordon

Schwerwiegender Fehler: Aufruf einer Member-Funktion ... für ein Nichtobjekt

Wird mit ähnlichem Code wie xyz->method() ausgeführt, wobei xyz kein Objekt ist und daher method nicht aufgerufen werden kann.

Dies ist ein schwerwiegender Fehler, durch den das Skript angehalten wird (Vorwärtskompatibilitätshinweis: Ab PHP 7 wird ein auffangener Fehler angezeigt).

Meistens ist dies ein Zeichen dafür, dass der Code fehlende Prüfungen auf Fehlerbedingungen aufweist. Stellen Sie sicher, dass ein Objekt tatsächlich ein Objekt ist, bevor Sie seine Methoden aufrufen.

Ein typisches Beispiel wäre

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

Im obigen Beispiel kann die Abfrage nicht vorbereitet werden, und prepare() weist false$statement zu. Wenn Sie versuchen, die execute()-Methode aufzurufen, führt dies zu einem schwerwiegenden Fehler, da false ein "Nicht-Objekt" ist, da der Wert ein Boolean ist.

Herausfinden warum Ihre Funktion hat einen Boolean-Wert anstelle eines Objekts zurückgegeben. Überprüfen Sie beispielsweise das $pdo-Objekt auf den zuletzt aufgetretenen Fehler. Details zum Debuggen hängen davon ab, wie Fehler für die jeweilige betreffende Funktion/Objekt/Klasse behandelt werden.

Wenn auch der ->prepare fehlschlägt, wurde Ihr $pdo-Datenbank-Handle-Objekt nicht in den aktuellen Bereich übergeben. Finden Sie heraus, wo es definiert wurde. Übergeben Sie es dann als Parameter, speichern Sie es als Eigenschaft oder geben Sie es über den globalen Gültigkeitsbereich frei.

Ein anderes Problem besteht möglicherweise darin, ein Objekt bedingt zu erstellen und dann zu versuchen, eine Methode außerhalb dieses Bedingungsblocks aufzurufen. Zum Beispiel

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Wenn Sie versuchen, die Methode außerhalb des Bedingungsblocks auszuführen, wird Ihr Objekt möglicherweise nicht definiert.

Verwandte Fragen:

174
hakre

Nichts ist zu sehen. Die Seite ist leer und weiß.

Auch als weiße Todesseite oder weiße Bildschirmseite des Todes bekannt. Dies geschieht, wenn die Fehlerberichterstattung deaktiviert ist und ein schwerwiegender Fehler (häufig Syntaxfehler) aufgetreten ist.

Wenn Sie die Fehlerprotokollierung aktiviert haben, finden Sie die konkrete Fehlermeldung in Ihrem Fehlerprotokoll. Dies ist normalerweise in einer Datei namens "php_errors.log" entweder an einem zentralen Ort (z. B. /var/log/Apache2 in vielen Linux-Umgebungen) oder im Verzeichnis des Skripts selbst (manchmal in einer gemeinsam genutzten Hosting-Umgebung verwendet).

Manchmal ist es einfacher, die Anzeige von Fehlern vorübergehend zu aktivieren. Die weiße Seite zeigt dann die Fehlermeldung an. Seien Sie vorsichtig, denn diese Fehler sind für jeden Besucher der Website sichtbar.

Dies kann leicht durch Hinzufügen des folgenden PHP -Codes am Anfang des Skripts erfolgen:

ini_set('display_errors', 1); error_reporting(~0);

Der Code aktiviert die Anzeige von Fehlern und setzt die Berichterstattung auf die höchste Ebene.

Da die ini_set() zur Laufzeit ausgeführt wird, hat dies keine Auswirkungen auf Parsing-/Syntaxfehler. Diese Fehler werden im Protokoll angezeigt. Wenn Sie sie auch in der Ausgabe anzeigen möchten (z. B. in einem Browser), müssen Sie die Direktive display_startup_errors auf true setzen. Tun Sie dies entweder im php.ini oder in einem .htaccess oder von einer beliebigen anderen Methode, die die Konfiguration vor der Laufzeit beeinflusst.

Sie können die gleichen Methoden verwenden, um die Direktiven log_errors und error_log festzulegen, um Ihren eigenen Protokolldateipfad auszuwählen.

Wenn Sie in das Protokoll schauen oder die Anzeige verwenden, erhalten Sie eine viel bessere Fehlermeldung und die Codezeile, in der Ihr Skript zum Stillstand kommt.

Verwandte Fragen:

Verwandte Fehler:

108
nalply

Hinweis: Undefinierter Index

Wird ausgeführt, wenn Sie versuchen, auf einen Array mit einem Schlüssel zuzugreifen, der im Array nicht vorhanden ist. 

Ein typisches Beispiel für eine Undefined Index-Benachrichtigung wäre ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Sowohl spinach als auch 1 sind nicht im Array vorhanden, wodurch ein E_NOTICE ausgelöst wird.

Die Lösung besteht darin, vor dem Zugriff auf diesen Index sicherzustellen, dass der Index oder Offset vorhanden ist. Dies kann bedeuten, dass Sie einen Fehler in Ihrem Programm beheben müssen, um sicherzustellen, dass diese Indizes vorhanden sind, wenn Sie dies erwarten. Oder es kann bedeuten, dass Sie prüfen müssen, ob die Indizes vorhanden sind, indem Sie array_key_exists oder isset verwenden:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

Wenn Sie Code haben wie:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

dann wird $_POST['message'] nicht festgelegt, wenn diese Seite zum ersten Mal geladen wird, und Sie erhalten den obigen Fehler. Nur wenn das Formular gesendet und dieser Code ein zweites Mal ausgeführt wird, ist der Arrayindex vorhanden. Sie überprüfen dies normalerweise mit:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Verwandte Fragen:

94
Gordon

Warnung: mysql_fetch_array () erwartet, dass Parameter 1 eine Ressource ist, die boolesch angegeben wird

Zuallererst:

Bitte verwenden Sie mysql_* -Funktionen nicht in neuem Code . Sie werden nicht mehr gepflegt nd sind offiziell veraltet . Siehe das rote Kästchen ? Erfahren Sie mehr über vorbereitete Anweisungen und verwenden Sie PDO oder MySQLi - dieser Artikel hilft Ihnen bei der Entscheidung, welche. Wenn Sie PDO wählen, hier ist ein gutes Tutorial .


Dies geschieht, wenn Sie versuchen, Daten aus dem Ergebnis von mysql_query abzurufen, die Abfrage jedoch fehlgeschlagen ist.

Dies ist eine Warnung, die das Skript nicht anhält, aber Ihr Programm falsch macht.

Sie müssen das Ergebnis überprüfen, das von mysql_query by zurückgegeben wurde

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Verwandte Fragen:

Verwandte Fehler:

Andere mysql* -Funktionen, die ebenfalls eine MySQL-Ergebnisressource als Parameter erwarten, erzeugen aus demselben Grund denselben Fehler.

83
xdazz

Schwerwiegender Fehler: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext befinden

$this ist eine spezielle Variable in PHP , die nicht zugewiesen werden kann. Wenn auf einen Kontext zugegriffen wird, in dem es nicht existiert, wird dieser schwerwiegende Fehler angezeigt.

Dieser Fehler kann auftreten:

  1. Wenn eine nicht statische Methode statisch aufgerufen wird. Beispiel:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Problembehebung: Überprüfen Sie Ihren Code erneut. $this kann nur in einem Objektkontext verwendet werden und sollte niemals in einer statischen Methode verwendet werden. Eine statische Methode sollte auch nicht auf die nicht statische Eigenschaft zugreifen. Verwenden Sie self::$static_property, um auf die statische Eigenschaft zuzugreifen.

  2. Wenn Code aus einer Klassenmethode in eine normale Funktion oder nur in den globalen Gültigkeitsbereich und übernommen wurde, bleibt die spezielle Variable $this erhalten.
    Gewusst wie: Überprüfen Sie den Code und ersetzen Sie $this durch eine andere Ersetzungsvariable.

Verwandte Fragen:

  1. Rufen Sie eine nicht statische Methode als statisch auf: PHP Schwerwiegender Fehler: Verwendung von $ this, wenn es sich nicht im Objektkontext befindet
  2. Code kopieren: Schwerwiegender Fehler: Verwendung von $ this, wenn es sich nicht im Objektkontext befindet
  3. Alle "Verwendung von $ this, wenn nicht im Objektkontext" Fragen zu Stackoverflow
72
xdazz

Schwerwiegender Fehler: Aufruf an undefinierte Funktion XXX

Wird ausgeführt, wenn Sie versuchen, eine Funktion aufzurufen, die noch nicht definiert ist. Häufige Ursachen sind fehlende Erweiterungen und Includes, bedingte Funktionsdeklaration, Funktion in einer Funktionsdeklaration oder einfache Tippfehler.

Beispiel 1 - Bedingte Funktionsdeklaration

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

In diesem Fall wird fn() niemals deklariert, da $someCondition nicht wahr ist. 

Beispiel 2 - Funktion in Funktionsdeklaration

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

In diesem Fall wird fn erst dann deklariert, wenn createFn() aufgerufen wird. Beachten Sie, dass nachfolgende Aufrufe von createFn() einen Fehler bei der Neudeklaration einer vorhandenen Funktion auslösen.

Möglicherweise sehen Sie dies auch für eine eingebaute Funktion PHP. Suchen Sie nach der Funktion in dem offiziellen Handbuch und prüfen Sie, zu welcher "Erweiterung" (PHP-Modul) sie gehört und welche Versionen von PHP sie unterstützen.

Wenn eine Erweiterung fehlt, installieren Sie diese Erweiterung und aktivieren Sie sie in der php.ini. Informationen zur Erweiterung, in der Ihre Funktion angezeigt wird, finden Sie in der Installationsanleitung im Handbuch PHP. Sie können die Erweiterung möglicherweise auch mit Ihrem Paketmanager aktivieren oder installieren (z. B. apt in Debian oder Ubuntu, yum in Red Hat oder CentOS) ) oder ein Kontrollfeld in einer gemeinsam genutzten Hosting-Umgebung.

Wenn die Funktion in einer neueren Version von PHP eingeführt wurde, finden Sie möglicherweise Links zu alternativen Implementierungen im Handbuch oder im Kommentarbereich. Wenn es aus PHP entfernt wurde, suchen Sie nach Informationen zum Grund, da es möglicherweise nicht mehr erforderlich ist.

Bei fehlenden Includes müssen Sie unbedingt die Datei angeben, die die Funktion deklariert, bevor Sie die Funktion aufrufen. 

Bei Tippfehlern den Tippfehler korrigieren.

Verwandte Fragen:

70
Gordon

Parse-Fehler: Syntaxfehler, unerwarteter T_XXX

Geschieht, wenn Sie T_XXX Token an einem unerwarteten Ort, unausgeglichenen (überflüssigen) Klammern, Verwendung eines kurzen Tags, ohne es in php.ini zu aktivieren, und vielem mehr haben.

Verwandte Fragen:

Weitere Hilfe finden Sie unter:

68
LeleDumbo

Schwerwiegender Fehler: Der Funktionsrückgabewert kann nicht im Schreibkontext verwendet werden

Dies geschieht normalerweise, wenn eine Funktion direkt mit empty verwendet wird.

Beispiel:

if (empty(is_null(null))) {
  echo 'empty';
}

Dies liegt daran, dass empty ein Sprachkonstrukt und keine Funktion ist. Es kann in PHP Versionen vor 5.5 nicht mit einem Ausdruck als Argument aufgerufen werden. Vor PHP 5.5 muss das Argument für empty() eine Variable sein, aber ein beliebiger Ausdruck (z. B. ein Rückgabewert von a Funktion) ist in PHP 5.5+ zulässig.

empty prüft trotz seines Namens nicht, ob eine Variable "leer" ist. Stattdessen wird geprüft, ob eine Variable nicht vorhanden ist oder == false. Ausdrücke (wie is_null(null) im Beispiel) gelten immer als vorhanden, daher überprüft empty hier nur, ob sie gleich false sind. Sie könnten hier empty() durch ! ersetzen, z. if (!is_null(null)) oder explizit mit false zu vergleichen, z. if (is_null(null) == false).

Verwandte Fragen:

67
xdazz

MySQL: Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, auf die richtige Syntax, um near ... at line ... zu verwenden.

Dieser Fehler wird häufig verursacht, weil Sie vergessen haben, die an eine MySQL-Abfrage übergebenen Daten ordnungsgemäß zu sichern.

Ein Beispiel dafür, was not zu tun ist (die "schlechte Idee"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Dieser Code könnte auf einer Seite mit einem Formular enthalten sein, das eingereicht werden soll, mit einer URL wie http://example.com/edit.php?id=10 (um den Beitrag Nr. 10 zu bearbeiten)

Was passiert, wenn der eingesendete Text einfache Anführungszeichen enthält? $query endet mit:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

Wenn diese Abfrage an MySQL gesendet wird, wird sie sich darüber beschweren, dass die Syntax falsch ist, da in der Mitte ein zusätzliches einfaches Anführungszeichen steht.

Um solche Fehler zu vermeiden, müssen Sie die Daten vor der Verwendung in einer Abfrage M&UUML;SSEN.

Das Sichern von Daten vor der Verwendung in einer SQL-Abfrage ist auch sehr wichtig, da sonst das Skript für SQL-Injektionen geöffnet ist. Eine SQL-Injection kann zu Änderungen, zum Verlust oder zur Änderung eines Datensatzes, einer Tabelle oder einer gesamten Datenbank führen. Dies ist eine sehr ernste Sicherheitslücke!

Dokumentation:

59
Jocelyn

Schwerwiegender Fehler: zulässige Speichergröße von XXX Bytes erschöpft (versucht, XXX Bytes zuzuordnen)

Es ist nicht genügend Speicherplatz vorhanden, um das Skript auszuführen. PHP hat die Speichergrenze erreicht und beendet die Ausführung. Dieser Fehler ist fatal, das Skript wird angehalten. Der Wert von memory limit kann entweder in der Datei php.ini oder mithilfe von ini_set('memory_limit', '128 M'); im Skript konfiguriert werden (wodurch der in php.ini definierte Wert überschrieben wird). Mit dem Speicherlimit soll verhindert werden, dass ein einziges PHP - Skript den gesamten verfügbaren Speicher verschlingt und den gesamten Webserver herunterfährt.

Als erstes müssen Sie den Speicherbedarf minimieren, den Ihr Skript benötigt. Wenn Sie beispielsweise eine große Datei in eine Variable einlesen oder viele Datensätze aus einer Datenbank abrufen und sie alle in einem Array speichern, kann dies viel Speicherplatz beanspruchen. Ändern Sie Ihren Code, um die Datei stattdessen Zeile für Zeile zu lesen oder Datenbankdatensätze einzeln abzurufen, ohne sie alle im Speicher abzulegen. Dies erfordert ein gewisses konzeptionelles Bewusstsein darüber, was sich hinter den Kulissen abspielt und wann Daten im Speicher gespeichert werden, oder anderswo.

Wenn dieser Fehler auftrat, wenn Ihr Skript keine speicherintensive Arbeit verrichtete, müssen Sie Ihren Code überprüfen, um festzustellen, ob ein Speicherverlust vorliegt. Die Funktion memory_get_usage ist Ihr Freund.

Verwandte Fragen:

50
xdazz

Parse-Fehler: Syntaxfehler, unerwarteter T_ENCAPSED_AND_WHITESPACE

Dieser Fehler tritt am häufigsten auf, wenn versucht wird, einen Array-Wert mit einem in Anführungszeichen gesetztem Schlüsselfür die Interpolation in einer Zeichenfolge mit doppelten Anführungszeichen zu referenzieren, wenn das gesamte Konstrukt für komplexe Variablen nicht in {} eingeschlossen ist.

Der Fehlerfall:

Dies führt zu Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Mögliche Korrekturen:

In einer Zeichenfolge mit doppelten Anführungszeichen erlaubt PHP die Verwendung von Array-Schlüsselzeichenfolgen nicht in Anführungszeichen und es wird kein E_NOTICE ausgegeben. So könnte das oben geschrieben werden als:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Die gesamte komplexe Array-Variable und die Schlüssel können in {} eingeschlossen werden. In diesem Fall werden sollte in Anführungszeichen gesetzt, um einen E_NOTICE zu vermeiden. Die Dokumentation zu PHP empfiehlt diese Syntax für komplexe Variablen.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Natürlich besteht die Alternative zu any der obigen darin, die Array-Variable zu verketten, anstatt sie zu interpolieren:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Weitere Informationen finden Sie im Abschnitt über Variable Parsing in der PHP - Strings-Handbuchseite .

48

Warnung: [function]: Stream konnte nicht geöffnet werden: [reason]

Dies geschieht, wenn Sie eine Datei normalerweise aufrufen, indem include, require oder fopen und PHP die Datei nicht finden oder nicht über die erforderlichen Berechtigungen zum Laden der Datei verfügen.

Dies kann verschiedene Ursachen haben:

  • der Dateipfad ist falsch
  • der Dateipfad ist relativ
  • include-Pfad ist falsch
  • berechtigungen sind zu restriktiv
  • SELinux ist in Kraft
  • und viele mehr ...

Ein häufiger Fehler ist, keinen absoluten Pfad zu verwenden. Dies kann leicht gelöst werden, indem Sie einen vollständigen Pfad oder magische Konstanten wie __DIR__ oder dirname(__FILE__) verwenden:

include __DIR__ . '/inc/globals.inc.php';

oder:

require dirname(__FILE__) . '/inc/globals.inc.php';

Die Sicherstellung des richtigen Pfads ist ein Schritt zur Behebung dieser Probleme. Dies kann auch auf nicht vorhandene Dateien, Rechte des Dateisystems, die den Zugriff verhindern, oder auf offene Beschränkungen durch PHP selbst bezogen werden.

Um dieses Problem schnell zu lösen, folgen Sie der nachstehenden Checkliste zur Fehlerbehebung.

Verwandte Fragen:

Verwandte Fehler:

40
Mahdi

Parse-Fehler: Syntaxfehler, unerwarteter T_PAAMAYIM_NEKUDOTAYIM

Der Bereichsauflösungsoperator wird auch "Paamayim Nekudotayim" aus dem Hebräischen alsoמיים נקודתיים genannt. was "Doppelpunkt" oder "doppelter Punkt doppelt" bedeutet.

Dieser Fehler tritt normalerweise auf, wenn Sie versehentlich :: in Ihren Code eingegeben haben.

Verwandte Fragen:

Dokumentation:

40
Rich Bradshaw

Hinweis: Verwendung der undefinierten Konstante XXX - angenommen 'XXX'

oder in PHP 7.2 oder höher:

Warnung: Verwendung der undefinierten Konstante XXX - angenommen "XXX" (dies wird einen Fehler in einer zukünftigen Version von PHP auslösen)

Dieser Hinweis tritt auf, wenn ein Token im Code verwendet wird und eine Konstante zu sein scheint, eine Konstante mit diesem Namen jedoch nicht definiert ist.

Eine der häufigsten Ursachen für diesen Hinweis ist der Fehler, eine Zeichenfolge als assoziativen Array-Schlüssel anzugeben.

Zum Beispiel:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Eine weitere häufige Ursache ist ein fehlendes $ (Dollar) vor einem Variablennamen:

// Wrong
echo varName;

// Right
echo $varName;

Oder Sie haben vielleicht eine andere Konstante oder ein Schlüsselwort falsch geschrieben:

// Wrong
$foo = fasle;

// Right
$foo = false;

Es kann auch ein Zeichen dafür sein, dass eine erforderliche Erweiterung oder Bibliothek PHP fehlt, wenn Sie versuchen, auf eine durch diese Bibliothek definierte Konstante zuzugreifen.

Verwandte Fragen:

39
DaveRandom

Schwerwiegender Fehler: Klasse kann nicht erneut deklariert werden [Klassenname]

Schwerwiegender Fehler: Redeclare [Funktionsname] nicht möglich

Das bedeutet, dass Sie entweder denselben Funktions-/Klassennamen zweimal verwenden und einen von ihnen umbenennen müssen oder weil require oder include dort verwendet wurden, wo Sie require_once oder include_once verwenden sollten.

Wenn eine Klasse oder Funktion in PHP deklariert ist, ist sie unveränderlich und kann später nicht mit einem neuen Wert deklariert werden.

Betrachten Sie den folgenden Code:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

Der zweite Aufruf von do_stuff() führt zu dem obigen Fehler. Durch die Änderung von require in require_once können wir sicher sein, dass die Datei, die die Definition von MyClass enthält, nur einmal geladen wird und der Fehler vermieden wird.

39
DaveRandom

Hinweis: Undefinierte Variable

Wird ausgeführt, wenn Sie versuchen, eine Variable zu verwenden, die zuvor nicht definiert wurde.

Ein typisches Beispiel wäre

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Wenn Sie vorher noch nicht $counter definiert haben, wird der obige Code die Benachrichtigung auslösen.

Die korrekte Methode wäre, die Variable vor der Verwendung festzulegen, selbst wenn es sich nur um eine leere Zeichenfolge handelt 

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Verwandte Fragen:

36
aleation

Parse-Fehler: Syntaxfehler, unerwarteter T_VARIABLE

Mögliches Szenario

Ich kann anscheinend nicht herausfinden, wo mein Code fehlerhaft ist. Hier ist mein voller Fehler:

Parse-Fehler: Syntaxfehler, unerwarteter T_VARIABLE in Zeile x

Was ich versuche 

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

Antworten

Parse-Fehler: Ein Problem mit der Syntax Ihres Programms, z. B. wenn Sie am Ende einer Anweisung ein Semikolon lassen oder den Operator . (wie oben beschrieben) nicht angeben. Der Interpreter stoppt die Ausführung Ihres Programms, wenn ein Analysefehler auftritt.

In einfachen Worten ist dies ein Syntaxfehler, was bedeutet, dass sich in Ihrem Code etwas befindet, das verhindert, dass es richtig analysiert wird und daher ausgeführt wird.

Was Sie tun sollten ist, prüfen Sie sorgfältig die Zeilen, in denen der Fehler auftritt, auf einfache Fehler.

Diese Fehlermeldung bedeutet, dass der Interpreter PHP in Zeile x eine geöffnete Klammer erwartet hatte, jedoch auf etwas mit dem Namen T_VARIABLE gestoßen war. Dieses T_VARIABLE-Ding wird token genannt. Es ist der PHP -Interpreter, der verschiedene grundlegende Teile von Programmen ausdrückt. Wenn der Interpreter ein Programm einliest, übersetzt er das, was Sie geschrieben haben, in eine Liste von Token. Wo immer Sie eine Variable in Ihr Programm einfügen, befindet sich in der Liste des Interpreters ein T_VARIABLE-Token.

Gut gelesen: Liste der Parser-Token

Stellen Sie also sicher, dass Sie mindestens E_PARSE in Ihrem php.ini aktivieren. Parse-Fehler sollten in Produktionsskripten nicht vorhanden sein.

Ich habe immer empfohlen, beim Codieren die folgende Anweisung hinzuzufügen:

error_reporting(E_ALL);

PHP Fehlerberichterstattung

Eine gute Idee ist auch die Verwendung einer IDE, mit der Sie beim Tippen auf Analysefehler hingewiesen werden. Sie können verwenden:

  1. NetBeans (ein feines Stück Schönheit, freie Software) (das Beste meiner Meinung nach)
  2. PhpStorm (Onkel Gordon liebt das: P, bezahlter Plan, enthält proprietäre und freie Software)
  3. Eclipse (Die Schöne und das Biest, freie Software)

Verwandte Fragen:

31
NullPoiиteя

Hinweis: Nicht initialisierter String-Offset: *

Wie der Name schon sagt, tritt ein solcher Fehler auf, wenn Sie höchstwahrscheinlich versuchen, einen Wert mit einem nicht vorhandenen Schlüssel in einem Array zu durchlaufen oder zu finden. 

Betrachten Sie, Sie versuchen, jeden Buchstaben von $string anzuzeigen 

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

Das obige Beispiel erzeugt ( Online-Demo ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

Sobald das Skript D ausgegeben hat, wird der Fehler angezeigt, da Sie innerhalb der for()-Schleife PHP angewiesen haben, das erste bis fünfte Zeichen aus 'ABCD' which anzuzeigen, das aber seit dem vorhanden ist Die Schleife beginnt von 0 zu zählen und echos D bis zu dem Zeitpunkt, an dem sie 4 erreicht, gibt einen Offset-Fehler aus. 

Ähnliche Fehler:

31
samayo

Warnung: Die Einschränkung von open_basedir ist in Kraft

Diese Warnung kann bei verschiedenen Funktionen angezeigt werden, die sich auf den Datei- und Verzeichniszugriff beziehen. Es warnt vor einem Konfigurationsproblem.

Wenn es angezeigt wird, bedeutet dies, dass der Zugriff auf einige Dateien verboten wurde.

Die Warnung selbst zerstört nichts, aber meistens funktioniert ein Skript nicht ordnungsgemäß, wenn der Dateizugriff verhindert wird. 

Das Update besteht normalerweise darin, die Konfiguration von PHP zu ändern . Die entsprechende Einstellung heißt open_basedir .

Manchmal werden die falschen Datei- oder Verzeichnisnamen verwendet. Die Lösung besteht darin, die richtigen zu verwenden.

Verwandte Fragen:

28
hakre

Error: Syntax Error, unerwartet '['

Dieser Fehler tritt in zwei Varianten auf:

Variante 1

$arr = [1, 2, 3];

Diese Array-Initialisierungssyntax wurde nur in PHP 5.4 eingeführt. In früheren Versionen wird ein Parser-Fehler ausgegeben. Wenn möglich, aktualisieren Sie Ihre Installation oder verwenden Sie die alte Syntax:

$arr = array(1, 2, 3);

Siehe auch dieses Beispiel aus dem Handbuch.

Variante 2

$suffix = explode(',', 'foo,bar')[1];

Die Ergebnisse der Array-Dereferenzierungsfunktion wurden auch in PHP 5.4 eingeführt. Wenn ein Upgrade nicht möglich ist, müssen Sie eine (temporäre) Variable verwenden:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Siehe auch dieses Beispiel aus dem Handbuch.

26
Ja͢ck

Hinweis: Der Versuch, die Eigenschaft eines Nicht-Objektfehlers abzurufen

Dies geschieht, wenn Sie versuchen, auf eine Eigenschaft eines Objekts zuzugreifen, während kein Objekt vorhanden ist.

Ein typisches Beispiel für eine Nichtobjektbenachrichtigung wäre

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

In diesem Fall ist $users ein Array (also kein Objekt) und es hat keine Eigenschaften.

Dies ist vergleichbar mit dem Zugriff auf einen nicht vorhandenen Index oder Schlüssel eines Arrays (siehe Hinweis: Undefined Index ).

Dieses Beispiel ist stark vereinfacht. Meistens signalisiert eine solche Benachrichtigung einen ungeprüften Rückgabewert, z. Wenn eine Bibliothek NULL zurückgibt, wenn ein Objekt nicht vorhanden ist oder nur ein unerwarteter Nicht-Objektwert (z. B. in einem Xpath-Ergebnis, JSON-Strukturen mit unerwartetem Format, XML mit unerwartetem Format usw.), der Code jedoch nicht nach einer solchen Bedingung sucht.

Da diese Nichtobjekte häufig weiterverarbeitet werden, tritt beim Aufrufen einer Objektmethode für ein Nichtobjekt häufig ein schwerwiegender Fehler auf (siehe: Schwerwiegender Fehler: Aufruf einer Memberfunktion ... bei einem Nichtobjekt ) Stoppen des Skripts.

Es kann leicht verhindert werden, indem nach Fehlerbedingungen gesucht wird und/oder ob eine Variable mit einer Erwartung übereinstimmt. Hier ein Hinweis mit einem DOMXPath Beispiel:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Das Problem besteht darin, auf die nodeValue-Eigenschaft (Feld) des ersten Elements zuzugreifen, obwohl nicht geprüft wurde, ob es in der $result-Auflistung vorhanden ist oder nicht. Stattdessen lohnt es sich, den Code deutlicher zu machen, indem den Objekten, für die der Code ausgeführt wird, Variablen zugewiesen werden:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Verwandte Fehler:

25
hakre

Warnung: [Funktion] erwartet, dass Parameter 1 eine Ressource ist, die boolean ist

(Eine allgemeinere Variation von Warnung: mysql_fetch_array () erwartet, dass Parameter 1 eine Ressource ist, die boolean ist ).

Ressourcen sind ein Typ in PHP (wie Strings, Ganzzahlen oder Objekte). Eine Ressource ist ein undurchsichtiger Fleck, der keinen inhärent sinnvollen Wert hat. Eine Ressource ist für einen bestimmten Satz von PHP -Funktionen oder -Erweiterungen spezifisch und wird durch diesen definiert. Zum Beispiel definiert die Erweiterung Mysql zwei Ressourcentypen :

Im MySQL-Modul werden zwei Ressourcentypen verwendet. Die erste ist die Verbindungskennung für eine Datenbankverbindung, die zweite eine Ressource, die das Ergebnis einer Abfrage enthält.

Die cURL-Erweiterung definiert weitere zwei Ressourcentypen :

... ein cURL-Handle und ein cURL-Multi-Handle.

Bei var_dumped sehen die Werte folgendermaßen aus:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

Das sind die meisten Ressourcen, ein numerischer Bezeichner ((1)) eines bestimmten Typs ((curl)).

Sie tragen diese Ressourcen herum und geben sie an verschiedene Funktionen weiter, für die eine solche Ressource etwas bedeutet. Normalerweise weisen diese Funktionen bestimmte Daten im Hintergrund zu und eine Ressource ist nur eine Referenz, mit der sie diese Daten intern nachverfolgen.


Der Fehler "... erwartet, dass Parameter 1 eine Ressource ist, boolean angegeben" ist normalerweise das Ergebnis einer ungeprüften Operation, die eine Ressource erstellen sollte, jedoch stattdessen false zurückgegeben hat. Beispielsweise hat die Funktion fopen diese Beschreibung:

Rückgabewerte

Gibt bei Erfolg eine Dateizeigerressource oder bei einem Fehler FALSE zurück.

In diesem Code ist $fp entweder eine resource(x) of type (stream) oder eine false:

$fp = fopen(...);

Wenn Sie nicht prüfen, ob die fopen-Operation erfolgreich ist oder fehlgeschlagen ist und daher $fp eine gültige Ressource oder false ist, und $fp an eine andere Funktion übergeben, die eine Ressource erwartet, erhalten Sie möglicherweise den obigen Fehler:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

Sie müssen immer den Rückgabewert von Funktionen überprüfen, die versuchen, eine Ressource ) zuzuweisen, und können fehlschlagen:

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Verwandte Fehler:

22
deceze

Warnung: Ungültiger String-Offset 'XXX'

Dies geschieht, wenn Sie versuchen, auf ein Array-Element mit der eckigen Klammer-Syntax zuzugreifen, dies jedoch für eine Zeichenfolge und nicht für ein Array, also die Operation eindeutig nicht sinnvoll .

Beispiel:

$var = "test";
echo $var["a_key"];

Wenn Sie der Meinung sind, dass die Variable ein Array sein sollte, überprüfen Sie, woher sie stammt, und beheben Sie das Problem dort.

19
Karoly Horvath

Code läuft nicht/was aussieht wie Teile meines PHP Codes werden ausgegeben

Wenn Sie aus Ihrem PHP Code überhaupt kein Ergebnis sehen und/oder Sie Teile Ihres wörtlichen PHP Quellcodes auf der Webseite sehen, können Sie ziemlich sicher sein, dass Ihr PHP wird nicht wirklich ausgeführt. Wenn Sie in Ihrem Browser "Quelltext anzeigen" verwenden, wird wahrscheinlich die gesamte PHP Quellcodedatei so angezeigt, wie sie ist. Da PHP Code in <?php ?>-Tags eingebettet ist, versucht der Browser, diese als HTML-Tags zu interpretieren.

Um Ihre PHP Skripte tatsächlich auszuführen, benötigen Sie:

  • ein Webserver, der Ihr Skript ausführt
  • um die Dateierweiterung auf .php zu setzen, sonst interpretiert der Webserver sie nicht als solche *
  • um auf Ihre .php-Datei über den Webserver zuzugreifen

* Wenn Sie es nicht neu konfigurieren, kann alles konfiguriert werden.

Letzteres ist besonders wichtig. Durch einen Doppelklick auf die Datei wird sie wahrscheinlich in Ihrem Browser mit folgender Adresse geöffnet:

file://C:/path/to/my/file.php

Dies umgeht jeden Webserver, den Sie möglicherweise ausgeführt haben, und die Datei wird nicht interpretiert. Sie müssen die URL der Datei auf Ihrem Webserver aufrufen.

http://localhost/my/file.php

Möglicherweise möchten Sie auch prüfen, ob Sie kurze offene Tags <? anstelle von <?php verwenden und Ihre PHP Konfiguration hat kurze offene Tags deaktiviert.

Siehe auch PHP Code wird nicht ausgeführt, stattdessen wird Code auf der Seite angezeigt

18
deceze

Warnung: mysql_connect (): Zugriff für Benutzer 'name' @ 'Host' verweigert

Diese Warnung wird angezeigt, wenn Sie eine Verbindung zu einem MySQL/MariaDB-Server mit ungültigen oder fehlenden Anmeldeinformationen (Benutzername/Passwort) herstellen. Das ist also normalerweise nicht ein Code-Problem, aber ein Problem mit der Serverkonfiguration.

  • Beispiele finden Sie in der Manpage zu mysql_connect("localhost", "user", "pw") .

  • Stellen Sie sicher, dass Sie tatsächlich einen $username Und einen $password Verwendet haben.

    • Es ist ungewöhnlich, dass Sie ohne Passwort Zugang erhalten - was passiert ist, als die Warnung (using password: NO) Lautete.
    • Nur der lokale Testserver ermöglicht normalerweise die Verbindung mit dem Benutzernamen root, keinem Kennwort und dem Datenbanknamen test.

    • Sie können mit dem Befehlszeilen-Client testen, ob sie wirklich korrekt sind:
      mysql --user="username" --password="password" testdb

    • Benutzername und Passwort werden Groß- und Kleinschreibung beachten und Leerzeichen nicht ignoriert. Wenn Ihr Kennwort Metazeichen wie $ Enthält, schließen Sie diese mit einem Escape-Zeichen ab oder geben Sie das Kennwort in einfache Anführungszeichen ein.

    • Die meisten Shared Hosting-Anbieter deklarieren MySQL-Konten in Bezug auf das Unix-Benutzerkonto (manchmal nur Präfixe oder zusätzliche numerische Suffixe). In der Dokumentation finden Sie ein Muster oder eine Dokumentation sowie das CPanel oder eine andere Schnittstelle zum Festlegen eines Kennworts.

    • Weitere Informationen finden Sie im MySQL-Handbuch unter Hinzufügen von Benutzerkonten über die Befehlszeile. Wenn Sie als admin user verbunden sind, können Sie eine Abfrage wie folgt ausführen:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Oder verwenden Sie Admin oder WorkBench oder ein anderes grafisches Tool, um Kontodaten zu erstellen, zu überprüfen oder zu korrigieren.

    • Wenn Sie Ihre Anmeldeinformationen nicht korrigieren können, hat die Aufforderung des Internets, "Bitte helfen", keine Auswirkung. Nur Sie und Ihr Hosting-Anbieter verfügen über Berechtigungen und ausreichenden Zugriff zum Diagnostizieren und Beheben von Problemen.

  • Stellen Sie sicher, dass Sie den Datenbankserver erreichen können , indem Sie den von Ihrem Provider angegebenen Hostnamen verwenden:
    ping dbserver.hoster.example.net

    • Überprüfen Sie dies von einer SSH-Konsole direkt auf Ihrem Webserver. Das Testen von Ihrem lokalen Entwicklungsclient auf Ihrem gemeinsam genutzten Hosting-Server ist selten sinnvoll.

    • Häufig soll der Servername nur "localhost" Lauten, wobei normalerweise ein lokal benannter Socket verwendet wird, sofern verfügbar. Ansonsten können Sie "127.0.0.1" Als Fallback versuchen.

    • Sollte Ihr MySQL/MariaDB-Server einen anderen Port überwachen, verwenden Sie "servername:3306".

    • Wenn dies fehlschlägt, liegt möglicherweise ein Firewall-Problem vor. (Off-Topic, keine Programmierfrage. Keine Remote-Ratschläge möglich.)

  • Bei Verwendung von Konstanten wie z. DB_USER Oder DB_PASSWORD Überprüfen, ob sie tatsächlich definiert sind.

    • Wenn Sie einen "Warning: Access defined for 'DB_USER'@'Host'" Und einen "Notice: use of undefined constant 'DB_PASS'" Erhalten, ist das Ihr Problem.

    • Stellen Sie sicher, dass Ihr z. xy/db-config.php War tatsächlich enthalten und so weiter.

  • Überprüfen Sie, ob die GRANT - Berechtigungen richtig eingestellt sind.

    • Es reicht nicht aus, ein username + password Paar zu haben.

    • Jedem MySQL/MariaDB-Konto können Berechtigungen zugeordnet sein.

    • Diese können einschränken, zu welchen Datenbanken Sie eine Verbindung herstellen dürfen, von welchem ​​Client/Server die Verbindung stammen darf und welche Abfragen zulässig sind.

    • Die Warnung "Zugriff verweigert" kann daher auch für mysql_query Aufrufe angezeigt werden, wenn Sie nicht die Berechtigung haben, SELECT aus einer bestimmten Tabelle oder INSERT/UPDATE und häufiger DELETE alles.

    • Sie können Kontoberechtigungen anpassen bei Verbindung per Kommandozeilen-Client mit dem Administratorkonto mit einer Abfrage wie:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Wenn die Warnung zuerst mit Warning: mysql_query(): Access denied for user ''@'localhost' angezeigt wird, haben Sie möglicherweise ein php.ini-vorkonfiguriertes Konto/Passwort-Paar .

    • Stellen Sie sicher, dass mysql.default_user= Und mysql.default_password= Sinnvolle Werte haben.

    • Oft ist dies eine Provider-Konfiguration. Wenden Sie sich daher an den Support, um Unstimmigkeiten zu beheben.

  • Hier finden Sie die Dokumentation Ihres Shared Hosting-Anbieters:

  • Beachten Sie, dass Sie möglicherweise den verfügbaren Verbindungspool aufgebraucht haben. Sie erhalten Warnungen zu verweigertem Zugriff für zu viele gleichzeitige Verbindungen. (Sie müssen das Setup untersuchen. Dies ist ein nicht themenbezogenes Problem bei der Serverkonfiguration, keine Programmierfrage.)

  • Ihr libmysql-Client Version ist möglicherweise nicht kompatibel mit dem Datenbankserver. Normalerweise können MySQL- und MariaDB-Server mit im Treiber kompilierten PHPs erreicht werden. Wenn Sie ein benutzerdefiniertes Setup oder eine veraltete PHP Version und einen viel neueren Datenbankserver oder einen erheblich veralteten haben, kann die Nichtübereinstimmung der Versionen Verbindungen verhindern. (Nein, Sie müssen selbst nachforschen Niemand kann dein Setup erraten.

Weitere Referenzen:

Übrigens möchten Sie wahrscheinlich nicht mehr mysql_* - Funktionen verwenden. Neulinge migrieren häufig nach mysqli , was jedoch genauso mühsam ist. Lesen Sie stattdessen PDO und vorbereitete Anweisungen .
$db = new PDO("mysql:Host=localhost;dbname=testdb", "username", "password");

17
mario

Hinweis: Konvertierung von Array in String

Dies geschieht einfach, wenn Sie versuchen, ein Array als Zeichenfolge zu behandeln:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Ein Array kann nicht einfach echo 'd sein oder mit einem String verkettet sein, da das Ergebnis nicht genau definiert ist. PHP wird anstelle des Arrays den String "Array" verwenden und darauf hinweisen, dass dies wahrscheinlich nicht beabsichtigt ist und Sie Ihren Code hier überprüfen sollten. Wahrscheinlich möchten Sie stattdessen so etwas:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Oder das Array schleifen:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Wenn dieser Hinweis an einer Stelle erscheint, die Sie nicht erwarten, bedeutet dies, dass eine Variable, die Sie für eine Zeichenfolge halten, tatsächlich ein Array ist. Das bedeutet, dass Sie einen Fehler in Ihrem Code haben, der diese Variable zu einem Array anstelle der erwarteten Zeichenfolge macht.

15
deceze

Warnung: Division durch Null

Die Warnmeldung 'Division by zero' ist eine der am häufigsten gestellten Fragen unter neuen PHP - Entwicklern. Dieser Fehler verursacht keine Ausnahmebedingung. Daher unterdrücken einige Entwickler gelegentlich die Warnung, indem sie den Fehlerunterdrückungsoperator @ vor dem Ausdruck hinzufügen. Zum Beispiel:

$value = @(2 / 0);

Wie bei jeder Warnung wäre es jedoch am besten, die Ursache der Warnung aufzuspüren und zu beheben. Die Ursache der Warnung wird von einer Instanz kommen, in der Sie versuchen, durch 0 zu dividieren, eine Variable gleich 0 oder eine nicht zugewiesene Variable (weil NULL == 0), da das Ergebnis "undefined" ist.

Um diese Warnung zu korrigieren, sollten Sie Ihren Ausdruck umschreiben, um zu überprüfen, dass der Wert nicht 0 ist. Wenn dies der Fall ist, tun Sie etwas anderes. Wenn der Wert Null ist, sollten Sie den Wert nicht teilen oder in 1 ändern und dann teilen, so dass die Unterteilung das Äquivalent ergibt, nur durch die zusätzliche Variable geteilt zu werden.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Verwandte Fragen:

11
davidcondrey

Strikte Standards: Die nicht statische Methode [<class> :: <method>] sollte nicht statisch aufgerufen werden

Tritt auf, wenn Sie versuchen, eine nicht statische Methode für eine Klasse als statisch aufzurufen, und Sie haben auch das Flag E_STRICT in den Einstellungen von error_reporting().

Beispiel:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() oder $html::br()

Sie können diesen Fehler eigentlich vermeiden, indem Sie E_STRICT nicht zu error_reporting() hinzufügen, z

error_reporting(E_ALL & ~E_STRICT);

da für PHP 5.4.0 und höher, E_STRICT in E_ALL [ ref ] enthalten ist. Das ist aber nicht ratsam. Die Lösung ist, Ihre beabsichtigte statische Funktion als tatsächliche static zu definieren:

public static function br() {
  echo '<br>';
}

oder rufen Sie die Funktion konventionell auf:

$html = new HTML();
$html->br();

Verwandte Fragen: 

8
davidkonrad

Schwerwiegender Fehler: [TraitA] und [TraitB] definieren dieselbe Eigenschaft ([$ x]) in der Zusammensetzung von [ClassC]

Tritt auf, wenn eine Klasse versucht, use mehrere Traits zu verwenden, wobei zwei oder mehr dieser Traits eine Eigenschaft mit demselben Namen definiert haben und deren Eigenschaft unterschiedliche Anfangswerte hat.

Beispiel:

<?php
trait TraitA
{
    public $x = 'a';
}
trait TraitB
{
    public $x = 'b';
}
class ClassC
{
    use TraitA, TraitB;
}

Problematic: Zwar ist es möglich, Konflikte zwischen konkurrierenden Methoden aufzulösen. Derzeit gibt es keine Syntax, die einen Konflikt zwischen zwei konkurrierenden Eigenschaften auflösen könnte. Die einzige Lösung zu diesem Zeitpunkt ist zu refactor ; d. h. einen Konflikt zwischen Eigenschaftennamen vermeiden, der einen schwerwiegenden Fehler verursacht.


Verwandte Fragen:

3
jaswrks

HTTP-Fehler 500 - Interner Serverfehler

Der HTTP-Statuscode 500 und die typische Apache- oder Browser-Warnung ist eine sehr umfassende Nachricht. Es ist nicht der tatsächliche Fehler. Um herauszufinden, ob es sich um eine falsche Konfiguration des Webservers (.htaccess) oder einen schwerwiegenden PHP - Fehler handelt, müssen Sie den error.log betrachten.

Sie finden die Webserver error.log normalerweise unter:

  • /var/log/Apache2 auf Linux-Servern, häufig für lokale und virtuelle Hosts verwendet.
  • /var/www/_user12345_/logs oder ähnliches bei Shared Hosting-Plänen.
    Normalerweise gibt es neben jedem logs/-Ordner ein htdocs/-Verzeichnis.
  • C:\xampp\Apache\logs\error.log für WAMP / XAMPP Distributionen von Apache + PHP.
  • Alternativ können Sie einfach eine Dateisuchfunktion verwenden, um nach "error.log" zu suchen.
    Oder schauen Sie in Ihren Apache httpd.conf und seine ErrorLog-Direktive.
  • /var/log/nginx/nginx_error.log für NGINX .
  • C:\inetpub\logs\LogFiles für ISIS .

Es ist eine Textdatei. Suchen Sie nach dem Eintrag, der der Fehlerzeit am ehesten entspricht, und verwenden Sie den signifikanten Teil der Fehlermeldung (von "PHP-Fehler:…" bis "in line ..."), um weitere Informationen zu erhalten.

[Mon 22:10] [:error] [pid 12345] [client 127.0.0.1] FastCGI: server "/fcgi/p73" stderr: PHP message:PHP Error: Unfiltered inputvariable $_JSON['pokestop_lng'] in filyfile.php on line 845

Bei FPM-Setups werden hier oft nur schwerwiegende Fehler PHP angezeigt. Während ältere mod_php-Konfigurationen (Shared Hosting) häufig Warnungen und Hinweise enthalten (die sich in der Regel auch lohnen sollten).

Wenn Sie nicht für die Verwendung des Systems oder des Apache-Protokollierungsmechanismus konfiguriert sind, möchten Sie möglicherweise auch die Datei PHP error.log anzeigen. Im Allgemeinen ist es einfacher, die Standardeinstellungen beizubehalten und nur error_display + error_reporting zu aktivieren, um den konkreten Fehler anzuzeigen. Die HTTP-500-Catch-All-Seite ist immerhin nur eine Variation von PHP 's White Screen of Death .

Siehe auch:

3
mario

Schwerwiegender Fehler: Objekt der Klasse Closure konnte nicht in eine Zeichenfolge konvertiert werden

Dies bedeutet, dass Sie Ihre anonyme Funktion (oder einen Abschluss) nicht ausführen.

In diesem Beispiel wird mit den folgenden Pfeilfunktionen ein Fehler ausgegeben:

echo $fn = fn($x = 42) => $x;

Oder für eine anonyme Funktion

echo function($x = 42) { return $x; };

Um diesen Fehler zu beheben, müssen Sie den Abschluss ausführen.

echo $fn = (fn($x = 42) => $x)(30); // take notice of the 2 sets of brackets

echo (function($x = 42) { return $x; })(30);

Diese Art von Syntax heißt IIFE und es war hinzugefügt in PHP 7 .

3
Dharman

Warnung: function () erwartet, dass der ParameterXboolean ist (oder Ganzzahl, Zeichenfolge usw.)

Wenn der falsche Parametertyp an eine Funktion übergeben wird und PHP ihn nicht automatisch konvertieren kann, wird eine Warnung ausgegeben. Diese Warnung gibt an, welcher Parameter das Problem ist und welcher Datentyp erwartet wird. Die Lösung: Ändern Sie den angegebenen Parameter in den richtigen Datentyp.


Zum Beispiel diesen Code:

echo substr(["foo"], 23);

Ergebnisse in dieser Ausgabe:

PHP-Warnung: substr () erwartet, dass Parameter 1 ein String und ein Array ist

1
miken32

Warnung: count (): Parameter muss ein Array oder ein Objekt sein, das Countable in ... implementiert.

Selbsterklärend; Der an die Funktion count() übergebene Parameter muss abzählbar sein, normalerweise ein Array.

Das wahrscheinliche Problem ist, dass ein skalarer Wert wie eine Zeichenfolge oder eine Ganzzahl übergeben wurde oder ein Objekt, das die Schnittstelle Countable nicht implementiert. Die Verwendung von var_dump() für die betreffende Variable kann zeigen, ob dies der Fall ist oder nicht.

0
miken32