Referenz - Was bedeutet dieser Fehler in PHP?


1137

Was ist das?

Dies ist eine Reihe von Antworten zu Warnungen, Fehlern und Hinweisen, die beim Programmieren von PHP auftreten können, und Sie haben keine Ahnung, wie Sie diese beheben können. Dies ist auch ein Community-Wiki, daher ist jeder eingeladen, daran teilzunehmen und diese Liste zu ergänzen und zu pflegen.

Warum ist das?

Fragen wie "Bereits gesendete Header" oder "Anrufen eines Mitglieds eines Nicht-Objekts" werden häufig im Stapelüberlauf angezeigt. Die Grundursache für diese Fragen ist immer dieselbe. Die Antworten auf diese Fragen wiederholen sie normalerweise und zeigen dem OP dann, welche Zeile in ihrem speziellen Fall geändert werden soll. Diese Antworten bieten keinen Mehrwert für die Site, da sie nur für den jeweiligen Code des OP gelten. Andere Benutzer mit demselben Fehler können die Lösung nicht einfach auslesen, da sie zu lokalisiert sind. Das ist traurig, denn sobald Sie die Grundursache verstanden haben, ist es trivial, den Fehler zu beheben. Daher versucht diese Liste, die Lösung allgemein zu erklären, um sie anzuwenden.

Was soll ich hier machen?

Wenn Ihre Frage als Duplikat dieser Frage markiert wurde, finden Sie unten Ihre Fehlermeldung und wenden Sie das Update auf Ihren Code an. Die Antworten enthalten normalerweise weitere Links, die untersucht werden müssen, falls dies nicht allein aus der allgemeinen Antwort hervorgeht.

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

Die Liste

Siehe auch:


7
Um die



Antworten:


275

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

Passiert, wenn Ihr Skript versucht, einen HTTP-Header an den Client zu senden, der jedoch bereits zuvor ausgegeben wurde, was dazu führte, dass Header bereits an den Client gesendet wurden.

Dies ist ein E_WARNINGund es wird das Skript nicht stoppen.

Ein typisches Beispiel wäre eine Vorlagendatei wie diese:

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

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

Sie können dieses Problem lösen, indem Sie die Zeilen vor dem Code durchgehen, der die Warnung auslöst, und überprüfen, wo sie ausgegeben wird. Verschieben Sie einen Header-Sendecode vor diesen Code.

Eine häufig übersehene Ausgabe sind neue Zeilen nach dem Schließen von PHP ?>. Es wird als Standardpraxis angesehen, dies wegzulassen, ?>wenn es das letzte Element in der Datei ist. Eine weitere häufige Ursache für diese Warnung ist, dass vor der Öffnung <?phpein Leerzeichen, eine Zeile oder ein unsichtbares Zeichen steht, wodurch der Webserver die Header und die Leerzeichen / Zeilenumbrüche sendet. Wenn PHP mit dem Parsen beginnt, kann dies nicht gesendet werden ein beliebiger Header.

Wenn Ihre Datei mehr als einen <?php ... ?>Codeblock enthält, sollten Sie keine Leerzeichen dazwischen haben. (Hinweis: Sie könnten mehrere Blöcke haben, wenn Sie Code hätten, der automatisch erstellt wurde.)

Stellen Sie außerdem sicher, dass Ihr Code keine Byte-Bestellmarken enthält, z. B. wenn die Codierung des Skripts UTF-8 mit Stückliste ist.

Verwandte Fragen:


2
Wenn Sie WordPress verwenden, überprüfen Sie die Themendateien. Als ich eine Site auf eine neue Version von WordPress aktualisiert habe, konnte ich das Thema nicht aktualisieren, da es seit mehreren Jahren nicht mehr aktualisiert wurde. Dieses Problem trat auf. Es stellte sich heraus, dass die Datei functions.php mehr als eine <? ?> Block mit Leerzeichen dazwischen.
Roy Leban

2
@ RoyLeban "Wenn Ihre Datei mehr als einen Block enthält ..." Ich bin mir nicht sicher, was dies bedeutet. Was ist ein "Block"? Würde ein Block bestehen <?php ?>und so wäre "mehr als ein Block" <?php ?> <?php ?>?
Andrew Fox

2
Aktivieren Sie nach Möglichkeit die Funktion "Ausgabepufferung" in der PHP.ini-Konfigurationsdatei. Sie wird zum Beheben dieses Problems verwendet. Die HTML-Datei wird im Ausgabepuffer gespeichert und erst nach dem Stoppen des Skripts an den Client gesendet Header werden an einer anderen Stelle ausgegeben, dann wird der alte Header durch einen neuen Header ersetzt.
Nidhin David

191

Schwerwiegender Fehler: Aufruf einer Mitgliedsfunktion ... für ein Nichtobjekt

Passiert mit Code ähnlich dem, xyz->method()wo xyzkein Objekt ist und daher methodnicht aufgerufen werden kann.

Dies ist ein schwerwiegender Fehler, der das Skript stoppt (Hinweis zur Vorwärtskompatibilität: Ab PHP 7 wird es zu einem abfangbaren Fehler).

Meistens ist dies ein Zeichen dafür, dass im Code fehlende Überprüfungen auf Fehlerbedingungen vorliegen. Überprüfen Sie, ob 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(...);

In dem obigen Beispiel kann die Abfrage nicht bereit sein und prepare()wird zuweisen falsezu $statement. Der Versuch, die execute()Methode aufzurufen , führt dann zu einem schwerwiegenden Fehler, da falsees sich um ein "Nicht-Objekt" handelt, da der Wert ein Boolescher Wert ist.

Finden Sie heraus, warum Ihre Funktion einen Booleschen Wert anstelle eines Objekts zurückgegeben hat. Überprüfen Sie das $pdoObjekt beispielsweise auf den letzten aufgetretenen Fehler. Details zum Debuggen hängen davon ab, wie Fehler für die betreffende Funktion / das betreffende Objekt / die betreffende Klasse behandelt werden.

Wenn selbst das ->preparefehlschlägt, wurde Ihr $pdoDatenbankhandle-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 Bereich frei.

Ein weiteres Problem kann darin bestehen, ein Objekt bedingt zu erstellen und dann zu versuchen, eine Methode außerhalb dieses bedingten Blocks aufzurufen. Zum Beispiel

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

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

Verwandte Fragen:


115

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

Auch als White Page Of Death oder White Screen Of Death bekannt . Dies geschieht, wenn die Fehlerberichterstattung deaktiviert ist und ein schwerwiegender Fehler (häufig ein Syntaxfehler) aufgetreten ist.

Wenn Sie die Fehlerprotokollierung aktiviert haben, finden Sie die konkrete Fehlermeldung in Ihrem Fehlerprotokoll. Dies befindet sich normalerweise in einer Datei mit dem Namen "php_errors.log", entweder an einem zentralen Ort (z. B. /var/log/apache2in 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. Auf der weißen Seite wird dann die Fehlermeldung angezeigt. Seien Sie vorsichtig, da diese Fehler für jeden Besucher der Website sichtbar sind.

Dies kann einfach erreicht werden, indem oben im Skript der folgende PHP-Code hinzugefügt wird:

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

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

Da das ini_set()zur Laufzeit ausgeführt wird, hat es 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 display_startup_errorsDirektive auf setzen true. Tun Sie dies entweder in der php.inioder in einer .htaccessoder einer anderen Methode, die die Konfiguration vor der Laufzeit beeinflusst .

Mit denselben Methoden können Sie die Anweisungen log_errors und error_log festlegen , um Ihren eigenen Speicherort für die Protokolldatei auszuwählen.

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

Verwandte Fragen:

Verwandte Fehler:


3
error_reporting(~0);warum nicht -1? Das wird ~0bewertet und ist viel weniger kryptisch.
Fabrício Matté

3
Ich denke, beide sind ähnlich kryptisch. ~0ist expliziter IMO: negiere das leere Bit gesetzt, dh aktiviere alle Flags. -1 soll nicht wie in strpos () in C für «nicht gefunden» stehen, sondern als Bitset mit allen gesetzten Flags, da -1 binär ist 1111'1111'1111'1111(für 32 Bits).
Nalply

2
Ups, 1111'1111'1111'1111ist wirklich 16 Bit, aber ich hoffe du verstehst was ich meine.
Nalply

3
@IvanSolntsev, sorry nein, für Versionen vor 5.4 E_STRICTist nicht enthalten in E_ALL. php.net/manual/en/errorfunc.constants.php und scrollen Sie nach unten zu E_STRICT.
Nalply

102

Hinweis: Undefinierter Index

Passiert, wenn Sie versuchen, über einen Schlüssel, der im Array nicht vorhanden ist, auf ein Array zuzugreifen.

Ein typisches Beispiel für eine Undefined IndexBenachrichtigung wäre ( Demo )

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

Beide spinachund 1sind im Array nicht vorhanden, wodurch ein E_NOTICEausgelöst wird.

Die Lösung besteht darin, sicherzustellen, dass der Index oder Offset vorhanden ist, bevor Sie auf diesen Index zugreifen. 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 testen müssen , ob die Indizes sind mit array_key_existsoder isset:

$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">
    ...

wird dann $_POST['message']nicht gesetzt, 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 Array-Index vorhanden. Dies überprüfen Sie normalerweise mit:

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

Verwandte Fragen:


Ich neige dazu,if(!empty($_POST['message'])){ //do stuff }
kurdtpage

85

Warnung: mysql_fetch_array () erwartet, dass Parameter 1 eine Ressource ist, boolescher Wert

Zuallererst:

Bitte verwenden Sie keine mysql_*Funktionen in neuem Code . Sie werden nicht mehr gewartet und sind offiziell veraltet . Sehen Sie die rote Box ? Erfahrenmehr über vorbereitete Anweisungen statt, und verwenden Sie PDO oder MySQLi - dieser Artikel wird Ihnen helfen, entscheidenwelche. Wenn Sie sich für PDO entscheiden, finden Sie hier ein gutes Tutorial .


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

Dies ist eine Warnung und stoppt das Skript nicht, führt jedoch zu einem falschen Programm.

Sie müssen das von mysql_queryvon zurückgegebene Ergebnis überprüfen

$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.


5
Nur eine Notiz. Wenn mysql_queryes nicht schlimm genug ist, führt das Hinzufügen dazu or diezu einer Beleidigung der Verletzung.
Madaras Geist

Das Problem, auf das ich stoße, ist die $res = mysql_query($query)Rückgabe 1, wenn die Abfrage erfolgreich ist und daher als wahr angesehen wird. Daher zeigt sich bei der Weitergabe das Ergebnis mysql_query an mysql_fetch_array() die Bekanntmachung.
Mboy

@mboy Für SELECT-, SHOW-, DESCRIBE-, EXPLAIN- und andere Anweisungen, die eine Ergebnismenge zurückgeben, gibt mysql_query () eine Ressource bei Erfolg oder FALSE bei Fehler zurück. Bei anderen Arten von SQL-Anweisungen, INSERT, UPDATE, DELETE, DROP usw., gibt mysql_query () bei Erfolg TRUE oder bei Fehler FALSE zurück.
Xdazz

@xdazz Das ist das Problem , das ich bin vor, Insert - Update gibt TRUE zurück , so dass ich nicht von diesem Fehler loswerden können mysql_fetch_array() expects parameter 1 to be resource, boolean given in select Sie sehen - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Jeder Vorschlag für diesen Fehler git los?
Mboy

2
@mboy mysql_fetch_array()dient zum Auswählen von Abfragen. Zum Einfügen und Aktualisieren müssen Sie die Ergebnismenge nicht abrufen (und es gibt keine Ergebnismenge, mit der Sie abrufen können).
Xdazz

79

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

$thisist eine spezielle Variable in PHP, die nicht zugewiesen werden kann. Wenn in einem Kontext darauf zugegriffen wird, in dem es nicht vorhanden ist, wird dieser schwerwiegende Fehler ausgegeben.

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();

    So beheben Sie das Problem: Überprüfen Sie Ihren Code erneut,$thiskönnen Sie ihn nur in einem Objektkontext verwenden und sollten Sie ihn niemals in einer statischen Methode verwenden. Außerdem sollte eine statische Methode nicht auf die nicht statische Eigenschaft zugreifen. Verwenden Sieself::$static_propertydieseOption,um auf die statische Eigenschaft zuzugreifen.

  2. Wenn Code aus einer Klassenmethode in eine normale Funktion oder nur in den globalen Bereich kopiert wurde und die $thisspezielle Variable beibehalten wird.
    So beheben Sie das Problem: Überprüfen Sie den Code und ersetzen Sie ihn $thisdurch eine andere Substitutionsvariable.

Verwandte Fragen:

  1. Rufen Sie die nicht statische Methode als statisch auf: PHP Schwerwiegender Fehler: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext befinden
  2. Über Code kopieren: Schwerwiegender Fehler: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext befinden
  3. Alle Fragen zu Stackoverflow "Verwenden von $ this, wenn nicht im Objektkontext"

2
Vielleicht möchten Sie auch erwähnen, wie dies mit Verschlüssen funktioniert (auch bei nicht statischen Methoden) und wie es in 5.4 "behoben" wird.
Kendall Hopkins

2
@hakre Ich sprach über einen statischen Anruf in einem Closure. Wie $closure = function() { self::method(); }.
Kendall Hopkins

2
@KendallHopkins: Das ist ein anderer Fehler: " Schwerwiegender Fehler: Zugriff auf self :: nicht möglich, wenn kein Klassenbereich aktiv ist" Mit $thiskönnen Sie jedoch das bespoken " Schwerwiegender Fehler: Verwenden von $ this, wenn nicht im Objektkontext"$closure = function() { $this->method(); };
auslösen

75

Schwerwiegender Fehler: Aufruf der undefinierten Funktion XXX

Passiert, 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 - Deklaration der bedingten Funktion

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

In diesem Fall fn()wird nie deklariert, weil $someConditionnicht wahr ist.

Beispiel 2 - Funktion in der Funktionsdeklaration

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

In diesem Fall fnwird nur deklariert, wenn einmal createFn()aufgerufen wird. Beachten Sie, dass nachfolgende Aufrufe von createFn()einen Fehler bezüglich der erneuten Deklaration einer vorhandenen Funktion auslösen.

Sie können dies auch für eine in PHP integrierte Funktion sehen. Versuchen Sie, im offiziellen Handbuch nach der Funktion zu suchen , und überprü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 den Installationsanweisungen im PHP-Handbuch. Möglicherweise können Sie die Erweiterung auch über Ihren Paketmanager (z. B. aptin Debian oder Ubuntu, yumin Red Hat oder CentOS) oder über ein Bedienfeld aktivieren oder installieren in einer Shared Hosting-Umgebung.

Wenn die Funktion in einer neueren Version von PHP von dem, was Sie verwenden, 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 darüber, warum, da dies möglicherweise nicht mehr erforderlich ist.

Stellen Sie bei fehlenden Includes sicher, dass Sie die Datei einschließen, die die Funktion deklariert, bevor Sie die Funktion aufrufen.

Beheben Sie bei Tippfehlern den Tippfehler.

Verwandte Fragen:


73

Analysefehler: Syntaxfehler, unerwarteter T_XXX

Passiert, wenn Sie ein T_XXXToken an einem unerwarteten Ort haben, unausgeglichene (überflüssige) Klammern, die Verwendung eines kurzen Tags, ohne es in der php.ini zu aktivieren, und vieles mehr.

Verwandte Fragen:

Weitere Hilfe finden Sie unter:


70

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

Dies geschieht normalerweise, wenn Sie eine Funktion direkt mit verwenden empty.

Beispiel:

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

Dies liegt daran, dass emptyes sich um ein Sprachkonstrukt und nicht um eine Funktion handelt. In PHP-Versionen vor 5.5 kann es nicht mit einem Ausdruck als Argument aufgerufen werden. Vor PHP 5.5 muss das Argument to empty()eine Variable sein , in PHP 5.5+ ist jedoch ein beliebiger Ausdruck (z. B. ein Rückgabewert einer Funktion) zulässig.

emptyprü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 wird hier emptynur geprüft, ob sie gleich false sind. Sie könnten empty()hier durch !zB ersetzen if (!is_null(null))oder explizit mit false vergleichen, z if (is_null(null) == false).

Verwandte Fragen:


64

MySQL: Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von ... at line ...

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

Ein Beispiel dafür, was nicht 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 in einer Seite mit einem zu übermittelnden Formular mit einer URL wie http://example.com/edit.php?id=10 enthalten sein (um den Beitrag Nr. 10 zu bearbeiten).

Was passiert, wenn der eingereichte Text einfache Anführungszeichen enthält? $querywird enden mit:

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

Wenn diese Abfrage an MySQL gesendet wird, wird beanstandet, 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 immer maskieren, bevor Sie sie in einer Abfrage verwenden.

Das Escaping von Daten vor der Verwendung in einer SQL-Abfrage ist ebenfalls sehr wichtig, da Ihr Skript für SQL-Injektionen geöffnet ist, wenn Sie dies nicht tun. Eine SQL-Injection kann zu Änderungen, Verlusten oder Modifikationen eines Datensatzes, einer Tabelle oder einer gesamten Datenbank führen. Dies ist ein sehr ernstes Sicherheitsproblem!

Dokumentation:


3
Wenn Sie dies nicht tun, wird Ihre Website automatisch von Bots gehackt
apscience

2
@gladoscc Klicken Sie auf "Bearbeiten" und ändern Sie die Antwort. Mir ist bewusst, dass es verbessert werden kann.
Jocelyn

2
Oder verwenden Sie eine vorbereitete SQL-Abfrage.
Matej

53

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

Es ist nicht genügend Speicher vorhanden, um Ihr Skript auszuführen. PHP hat das Speicherlimit erreicht und beendet die Ausführung. Dieser Fehler ist schwerwiegend, das Skript wird gestoppt. Der Wert des Speicherlimits kann entweder in der php.iniDatei oder mithilfe ini_set('memory_limit', '128 M');des Skripts konfiguriert werden (wodurch der in definierte Wert überschrieben wird php.ini). Der Zweck des Speicherlimits besteht darin, zu verhindern, dass ein einzelnes PHP-Skript den gesamten verfügbaren Speicher verschlingt und den gesamten Webserver herunterfährt.

Das erste, was Sie tun müssen, ist, den Speicherbedarf Ihres Skripts zu minimieren. Wenn Sie beispielsweise eine große Datei in eine Variable einlesen oder viele Datensätze aus einer Datenbank abrufen und alle in einem Array speichern, kann dies viel Speicherplatz beanspruchen. Ändern Sie Ihren Code, um stattdessen die Datei zeilenweise zu lesen oder Datenbankdatensätze einzeln abzurufen, ohne sie alle im Speicher zu speichern. Dies erfordert ein gewisses konzeptionelles Bewusstsein dafür, was sich hinter den Kulissen abspielt und wann Daten im Speicher gespeichert werden, im Vergleich zu anderen.

Wenn dieser Fehler aufgetreten ist, als Ihr Skript keine speicherintensive Arbeit ausgeführt hat, müssen Sie Ihren Code überprüfen, um festzustellen, ob ein Speicherverlust vorliegt. Die memory_get_usageFunktion ist dein Freund.

Verwandte Fragen:


53

Analysefehler: Syntaxfehler, unerwarteter T_ENCAPSED_AND_WHITESPACE

Dieser Fehler tritt am häufigsten auf, wenn versucht wird, einen Array-Wert mit einem in Anführungszeichen gesetzten Schlüssel für die Interpolation innerhalb einer Zeichenfolge in doppelten Anführungszeichen zu referenzieren, wenn nicht das gesamte komplexe Variablenkonstrukt 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 in doppelten Anführungszeichen ermöglicht PHP die Verwendung von Array-Schlüsselzeichenfolgen ohne Anführungszeichen und gibt keine aus E_NOTICE. Das Obige könnte also 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 eingeschlossen {}werden. In diesem Fall sollten sie in Anführungszeichen gesetzt werden, um eine zu vermeiden E_NOTICE. Die PHP-Dokumentation 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 ist die Alternative zu jeder ist von der oben die Feldvariable zu verketten , anstatt es in der Interpolations - :

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

Eine Referenz finden Sie im Abschnitt zum Parsen von Variablen auf der Handbuchseite zu PHP-Strings


45

Warnung: [Funktion] : Stream konnte nicht geöffnet werden: [Grund]

Es passiert , wenn Sie eine Datei rufen in der Regel durch include, requireoder fopenund PHP konnte die Datei nicht oder nicht genügend Berechtigung , die Datei zu laden finden.

Dies kann verschiedene Gründe 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 besteht darin, keinen absoluten Pfad zu verwenden. Dies kann leicht gelöst werden, indem ein vollständiger Pfad oder magische Konstanten wie __DIR__oder verwendet werden dirname(__FILE__):

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

oder:

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

Die Sicherstellung, dass der richtige Pfad verwendet wird, ist ein Schritt zur Behebung dieser Probleme. Dies kann auch mit nicht vorhandenen Dateien, Rechten des Dateisystems, die den Zugriff verhindern, oder offenen Einschränkungen durch PHP selbst zusammenhängen.

Der beste Weg, um dieses Problem schnell zu lösen, besteht darin, die unten stehende Checkliste zur Fehlerbehebung zu befolgen.

Verwandte Fragen:

Verwandte Fehler:


44

Analysefehler: Syntaxfehler, unerwartetes T_PAAMAYIM_NEKUDOTAYIM

Der Bereichsauflösungsoperator wird vom hebräischen פעמיים נקודתיים auch "Paamayim Nekudotayim" genannt. was bedeutet "Doppelpunkt".

Dieser Fehler tritt normalerweise auf, wenn Sie versehentlich ::Ihren Code eingeben.

Verwandte Fragen:

Dokumentation:


Der einfachste Weg, diesen Fehler auszulösen, ist a()::b;oder $a=::;.
Ismael Miguel

43

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 als Konstante erscheint, eine Konstante mit diesem Namen jedoch nicht definiert ist.

Eine der häufigsten Ursachen für diesen Hinweis ist das Versagen, eine Zeichenfolge anzugeben, die als assoziativer Array-Schlüssel verwendet wird.

Zum Beispiel:

// Wrong
echo $array[key];

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

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

// Wrong
echo varName;

// Right
echo $varName;

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

// Wrong
$foo = fasle;

// Right
$foo = false;

Dies kann auch ein Zeichen dafür sein, dass eine benötigte PHP-Erweiterung oder Bibliothek fehlt, wenn Sie versuchen, auf eine von dieser Bibliothek definierte Konstante zuzugreifen.

Verwandte Fragen:


2
Ich würde sagen, die häufigste Ursache ist das Vergessen von $ vor einer Variablen, nicht vor Arrays.
Overv

42

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

Schwerwiegender Fehler: [Funktionsname] kann nicht neu deklariert werden

Dies bedeutet, dass Sie entweder denselben Funktions- / Klassennamen zweimal verwenden und einen von ihnen umbenennen müssen, oder dies liegt daran, dass Sie requireoder verwendet haben oder includewo Sie require_onceoder verwenden sollten include_once.

Wenn eine Klasse oder eine Funktion in PHP deklariert wird, 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()erzeugt den obigen Fehler. Durch den Wechsel requirezu require_oncekönnen wir sicher sein, dass die Datei, die die Definition von enthält MyClass, nur einmal geladen wird und der Fehler vermieden wird.


3
Ist es erwähnenswert, Autoloading zu verwenden, und Standards wie PSR-4 oder sogar das jetzt veraltete PSR-0 beseitigen dies so ziemlich, indem Sie sich vor der Notwendigkeit schützen, sich selbst zu benötigen / einzuschließen (abgesehen von einigen bizarren Randfällen).
DanielM

39

Hinweis: Undefinierte Variable

Passiert, 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 zuvor nicht definiert $counterhaben, löst der obige Code den Hinweis aus.

Der richtige Weg wäre, die Variable vor der Verwendung festzulegen, auch wenn es sich nur um eine leere Zeichenfolge handelt

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

Hinweis: Undefinierte Eigenschaft

Dieser Fehler bedeutet fast dasselbe, bezieht sich jedoch auf eine Eigenschaft eines Objekts. Bei erneuter Verwendung des obigen Beispiels würde dieser Code den Fehler auslösen, da die counterEigenschaft nicht festgelegt wurde.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Verwandte Fragen:


35

Analysefehler: Syntaxfehler, unerwarteter T_VARIABLE

Mögliches Szenario

Ich kann anscheinend nicht feststellen, wo mein Code schief gelaufen ist. Hier ist mein vollständiger Fehler:

Analysefehler: Syntaxfehler, unerwartetes T_VARIABLE in Zeile x

Was ich versuche

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

Antworten

Analysefehler: Ein Problem mit der Syntax Ihres Programms, z. B. das Weglassen eines Semikolons am Ende einer Anweisung oder das Fehlen des .Operators , wie im obigen Fall . Der Interpreter beendet die Ausführung Ihres Programms, wenn ein Analysefehler auftritt.

In einfachen Worten, dies ist ein Syntaxfehler, was bedeutet, dass Ihr Code etwas enthält, das verhindert, dass er korrekt analysiert wird und daher ausgeführt wird.

Was Sie tun sollten, ist sorgfältig in den Zeilen zu überprüfen, in denen der Fehler auf einfache Fehler zurückzuführen ist.

Diese Fehlermeldung bedeutet, dass der PHP-Interpreter in Zeile x der Datei eine offene Klammer erwartet hat, aber stattdessen auf etwas namens gestoßen ist T_VARIABLE. Das T_VARIABLEDing heißt a token. Auf diese Weise kann der PHP-Interpreter verschiedene grundlegende Teile von Programmen ausdrücken. 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 ein T_VARIABLEToken in der Liste des Interpreters.

Gut gelesen: Liste der Parser-Token

Stellen Sie also sicher, dass Sie mindestens E_PARSEin Ihrem aktivieren php.ini. Analysefehler sollten in Produktionsskripten nicht vorhanden sein.

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

error_reporting(E_ALL);

PHP-Fehlerberichterstattung

Es ist auch eine gute Idee, eine IDE zu verwenden, die Sie über Tippfehler beim Tippen informiert. Sie können verwenden:

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

Verwandte Fragen:


34

Hinweis: Nicht initialisierter String-Offset: *

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

Betrachten Sie, versuchen Sie, jeden Buchstaben von zu zeigen $string

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

Das obige Beispiel generiert ( Online-Demo ):

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

Und sobald das Skript das Echo beendet Dhat, wird der Fehler angezeigt, da for()Sie PHP innerhalb der Schleife angewiesen haben, Ihnen das Zeichen vom ersten bis zum fünften String anzuzeigen, von 'ABCD'dem existiert, aber da die Schleife zu zählen beginnt 0und hallt DWenn es erreicht ist 4, wird ein Versatzfehler ausgegeben.

Ähnliche Fehler:


32

Hinweis: Es wird versucht, die Eigenschaft eines Nicht-Objektfehlers abzurufen

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

Ein typisches Beispiel für eine Nicht-Objekt-Benachrichtigung wäre

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

In diesem Fall $usershandelt es sich um ein Array (also kein Objekt) und es hat keine Eigenschaften.

Dies ähnelt dem Zugriff auf einen nicht vorhandenen Index oder Schlüssel eines Arrays (siehe Hinweis: Undefinierter Index ).

Dieses Beispiel ist stark vereinfacht. Meistens signalisiert ein solcher Hinweis einen ungeprüften Rückgabewert, z. B. wenn eine Bibliothek zurückkehrt, NULLwenn ein Objekt nicht vorhanden ist, oder nur einen unerwarteten Nicht-Objektwert (z. B. in einem Xpath-Ergebnis JSON-Strukturen mit unerwartetem Format, XML mit unerwartetem Format usw.). Der Code prüft jedoch nicht auf eine solche Bedingung.

Da diese Nichtobjekte häufig weiter verarbeitet werden, tritt beim Aufrufen einer Objektmethode für ein Nichtobjekt häufig ein schwerwiegender Fehler auf (siehe: Schwerwiegender Fehler: Aufruf einer Mitgliedsfunktion ... für ein Nichtobjekt ), wodurch das angehalten wird Skript.

Dies kann leicht verhindert werden, indem nach Fehlerbedingungen gesucht wird und / oder dass eine Variable einer Erwartung entspricht. Hier ein solcher 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 nodeValueEigenschaft (das Feld) des ersten Elements zuzugreifen , während nicht überprüft wurde, ob es in der $resultSammlung vorhanden ist oder nicht . Stattdessen lohnt es sich, den Code expliziter zu gestalten, indem den Objekten, mit denen der Code arbeitet, 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:


1
json_decodejetzt gibt eine Instanz stdclassstandardmäßig, so dass der Beispielcode würde tatsächlich funktionieren.
Hugo Zink

@HugoZink: Es gibt tatsächlich (und immer) ein Array für dieses Beispiel zurück: 3v4l.org/SUDe0 - Können Sie auch eine Referenz für Ihr Schreiben angeben , das " json_decodejetzt stdclassstandardmäßig eine Instanz von zurückgibt " ? Ich kann das nicht im Changelog finden.
hakre

Laut der Seite des PHP-Handbuchs zu json_decode ist der assocParameter standardmäßig auf false gesetzt. Dieser Parameter entscheidet, ob die Funktion ein stdclassanstelle eines assoziativen Arrays zurückgibt .
Hugo Zink

json_decode('[{"name": "hakre"}]', true)wird ein Array zurückgeben, andernfalls ein stdclassObjekt
zanderwar

29

Warnung: Die Einschränkung für open_basedir ist wirksam

Diese Warnung kann mit 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 macht nichts kaputt, aber meistens funktioniert ein Skript nicht richtig, wenn der Dateizugriff verhindert wird.

Das Update besteht normalerweise darin, die PHP-Konfiguration zu ändern . Die entsprechende Einstellung wird aufgerufen open_basedir.

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

Verwandte Fragen:


1
Dies tritt am häufigsten auf einem gemeinsam genutzten Host auf. Normalerweise sperren sich die
Benutzer

28

Error: Syntax Error, unerwartet '['

Dieser Fehler tritt in zwei Varianten auf:

Variation 1

$arr = [1, 2, 3];

Diese Array-Initialisierersyntax wurde nur in PHP 5.4 eingeführt. Bei früheren Versionen wird ein Parserfehler ausgelöst. 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.


23

Warnung: [Funktion] erwartet, dass Parameter 1 eine Ressource ist, boolescher Wert

(Eine allgemeinere Variante von Warning: mysql_fetch_array () erwartet, dass Parameter 1 eine Ressource ist, boolescher Wert )

Ressourcen sind ein Typ in PHP (wie Zeichenfolgen, Ganzzahlen oder Objekte). Eine Ressource ist ein undurchsichtiger Blob ohne eigenen inhärenten Wert. Eine Ressource ist spezifisch für einen bestimmten Satz von PHP-Funktionen oder -Erweiterungen und wird durch diese definiert. Beispielsweise definiert die MySQL-Erweiterung zwei Ressourcentypen :

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

Die Erweiterung cURL definiert zwei weitere Ressourcentypen :

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

Wenn var_dumped, sehen die Werte folgendermaßen aus:

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

resource(1) of type (curl)

Das ist alles, was die meisten Ressourcen sind, eine numerische Kennung ( (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. In der Regel weisen diese Funktionen bestimmte Daten im Hintergrund zu, und eine Ressource ist nur eine Referenz, mit der sie diese Daten intern verfolgen.


Der Fehler " ... erwartet, dass Parameter 1 eine Ressource ist, boolescher Wert " ist normalerweise das Ergebnis einer ungeprüften Operation, die eine Ressource erstellen sollte, aber falsestattdessen zurückgegeben wurde. Zum Beispiel hat die fopenFunktion diese Beschreibung:

Rückgabewerte

Gibt bei Erfolg oder FALSEFehler eine Dateizeigerressource zurück .

In diesem Code $fpwird also entweder a resource(x) of type (stream)oder false:

$fp = fopen(...);

Wenn Sie nicht überprüfen , ob die fopenOperation erfolgreich war oder fehlgeschlagen ist und somit , ob $fpeine gültige Ressource oder falseund übergeben $fpan eine andere Funktion , die eine Ressource erwartet, können Sie die obige Fehlermeldung erhalten:

$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 möglicherweise fehlschlagen :

$fp = fopen(...);

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

$data = fread($fp, 1024);

Verwandte Fehler:


22

Warnung: Unzulässiger String-Offset 'XXX'

Dies geschieht, wenn Sie versuchen, auf ein Array-Element mit der Syntax in eckigen Klammern zuzugreifen, dies jedoch für eine Zeichenfolge und nicht für ein Array, sodass die Operation eindeutig keinen Sinn ergibt .

Beispiel:

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

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


20

Code läuft nicht / wie es aussieht, werden Teile meines PHP-Codes ausgegeben

Wenn Sie kein Ergebnis von Ihrem PHP-Code sehen und / oder Teile Ihres wörtlichen PHP-Quellcodes auf der Webseite ausgeben, können Sie ziemlich sicher sein, dass Ihr PHP nicht tatsächlich ausgeführt wird. Wenn Sie View Source in Ihrem Browser verwenden, sehen Sie wahrscheinlich die gesamte PHP-Quellcodedatei wie sie ist. Da PHP-Code in <?php ?>Tags eingebettet ist , versucht der Browser, diese als HTML-Tags zu interpretieren, und das Ergebnis sieht möglicherweise etwas verwirrt aus.

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 über den Webserver auf Ihre .php-Datei zuzugreifen

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

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

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

Dadurch wird jeder Webserver, den Sie möglicherweise ausführen, vollständig umgangen, und die Datei wird nicht interpretiert. Sie müssen die URL der Datei auf Ihrem Webserver besuchen, wahrscheinlich wie folgt:

http://localhost/my/file.php

Möglicherweise möchten Sie auch überprüfen, ob Sie stattdessen kurze offene Tags <?verwenden <?phpund Ihre PHP-Konfiguration kurze offene Tags deaktiviert hat.

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


18

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

Diese Warnung wird angezeigt, wenn Sie eine Verbindung zu einem MySQL / MariaDB-Server mit ungültigen oder fehlenden Anmeldeinformationen (Benutzername / Kennwort) herstellen. Dies ist also normalerweise kein Codeproblem, sondern ein Problem bei der Serverkonfiguration.

  • Beispiele finden Sie auf der Handbuchseite mysql_connect("localhost", "user", "pw").

  • Überprüfen Sie, ob Sie tatsächlich ein $usernameund verwendet haben $password.

    • Es ist ungewöhnlich, dass Sie ohne Passwort Zugriff erhalten - was passiert ist, als die Warnung: sagte (using password: NO).
    • Nur der lokale Testserver erlaubt normalerweise die Verbindung mit dem Benutzernamen root, keinem Passwort und dem testDatenbanknamen.

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

    • Benutzername und Passwort unterscheiden zwischen Groß- und Kleinschreibung und Leerzeichen werden nicht ignoriert. Wenn Ihr Passwort Metazeichen wie enthält $, maskieren Sie diese oder setzen Sie das Passwort in einfache Anführungszeichen .

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

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

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

    • Wenn Sie Ihre Anmeldeinformationen nicht reparieren können, hat die Aufforderung an das Internet, "Bitte helfen", keine Auswirkung. Nur Sie und Ihr Hosting-Anbieter verfügen über Berechtigungen und ausreichenden Zugriff, um Probleme zu diagnostizieren und zu beheben.

  • Stellen Sie sicher, dass Sie den Datenbankserver mit dem von Ihrem Anbieter angegebenen Hostnamen erreichen können :
    ping dbserver.hoster.example.net

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

    • Oft möchten Sie nur den Servernamen "localhost", der normalerweise einen lokalen Socket mit Namen verwendet, sofern verfügbar. Andernfalls können Sie es "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 Fernhilfe möglich.)

  • Wenn Sie Konstanten wie z. B. DB_USERoder verwenden DB_PASSWORD, überprüfen Sie, ob sie tatsächlich definiert sind .

    • Wenn Sie ein "Warning: Access defined for 'DB_USER'@'host'"und ein bekommen "Notice: use of undefined constant 'DB_PASS'", dann ist das Ihr Problem.

    • xy/db-config.phpStellen Sie sicher, dass Ihr eg tatsächlich enthalten war und was auch immer.

  • Überprüfen Sie, ob die GRANTBerechtigungen korrekt festgelegt wurden .

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

    • Jedes MySQL / MariaDB-Konto kann über eine Reihe von Berechtigungen verfügen.

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

    • Die Warnung "Zugriff verweigert" kann daher auch für mysql_queryAnrufe angezeigt werden , wenn Sie keine Berechtigungen für SELECTeine bestimmte Tabelle oder INSERT/ UPDATEund häufiger für DELETEirgendetwas haben.

    • Sie können die Kontoberechtigungen anpassen, wenn Sie über einen Befehlszeilenclient eine Verbindung herstellen, indem Sie das Administratorkonto mit einer Abfrage wie der folgenden verwenden:
      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 von php.ini vorkonfiguriertes Konto / Kennwort-Paar .

    • Überprüfen Sie das mysql.default_user=und mysql.default_password=haben Sie aussagekräftige Werte.

    • Oft ist dies eine Provider-Konfiguration. Wenden Sie sich daher an den Support für Fehlanpassungen.

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

  • Beachten Sie, dass Sie möglicherweise auch den verfügbaren Verbindungspool aufgebraucht haben . Bei zu vielen gleichzeitigen Verbindungen erhalten Sie Warnungen wegen Zugriffsverweigerung. (Sie müssen das Setup untersuchen. Dies ist ein Problem bei der Serverkonfiguration außerhalb des Themas, keine Programmierfrage.)

  • Ihre libmysql-Clientversion ist möglicherweise nicht mit dem Datenbankserver kompatibel . 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 oder erheblich veralteten Datenbankserver haben, kann die Nichtübereinstimmung der Version Verbindungen verhindern. (Nein, Sie müssen sich selbst untersuchen. Niemand kann Ihr Setup erraten.)

Weitere Referenzen:

Übrigens möchten Sie wahrscheinlich keine mysql_*Funktionen mehr verwenden . Neuankömmlinge migrieren häufig zu mysqli , was jedoch genauso mühsam ist. Lesen Sie stattdessen die gU und die vorbereiteten Anweisungen .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql ermöglicht die automatische Verbindung über die PHP-INI-Einstellungen. Anschließend wird dieselbe Fehlermeldung mit dem unterschiedlichen Befehl vorangestellt, z. B. "Warnung: mysql_query (): Zugriff für Benutzer '' @ 'localhost' verweigert (mit Kennwort: NO) in. .. " - nur zur Kenntnis nehmen.
hakre

Ha, das habe ich total vergessen! (Vermutlich zuletzt mit PHP3 oder so verwendet ..)
Mario

18

Hinweis: Konvertierung von Array in Zeichenfolge

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 echomit einer Zeichenfolge verknüpft oder verkettet werden, da das Ergebnis nicht genau definiert ist. PHP verwendet die Zeichenfolge "Array" anstelle des Arrays und löst den Hinweis aus, dass dies wahrscheinlich nicht beabsichtigt ist und dass Sie Ihren Code hier überprüfen sollten. Sie möchten wahrscheinlich stattdessen so etwas:

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

Oder schleifen Sie das Array:

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, von der Sie dachten, dass sie eine Zeichenfolge ist, tatsächlich ein Array ist. Das heißt, Sie haben einen Fehler in Ihrem Code, der diese Variable zu einem Array anstelle der erwarteten Zeichenfolge macht.


12

Warnung: Division durch Null

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

$value = @(2 / 0);

Wie bei jeder Warnung besteht der beste Ansatz darin, die Ursache der Warnung aufzuspüren und zu beheben. Die Ursache für die Warnung liegt in jedem Fall, in dem Sie versuchen, durch 0 zu teilen, eine Variable gleich 0 oder eine Variable, die nicht zugewiesen wurde (weil NULL == 0), weil das Ergebnis 'undefiniert' ist.

Um diese Warnung zu korrigieren, sollten Sie Ihren Ausdruck neu schreiben, um zu überprüfen, ob der Wert nicht 0 ist. Wenn dies der Fall ist, führen Sie etwas anderes aus. Wenn der Wert Null ist, sollten Sie entweder nicht teilen oder den Wert in 1 ändern und dann teilen, damit die Division das Äquivalent ergibt, nur durch die zusätzliche Variable geteilt zu haben.

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:


Wenn Sie auf 1 setzen, wenn es 0 ist, wird der Fehler gestoppt. Ist dies wirklich besser als die Unterdrückung, von der Sie sagten, dass sie nicht verwendet werden sollte (dem stimme ich zu)? Ich würde meistens vorschlagen, dass wahrscheinlich eine andere Nachricht oder ein anderer Wert zurückgegeben wird.
James

Für dieses Beispiel , wenn $var1tut == 0 , dann können Sie nur einstellen $var3zu $var2. Auch wenn dies nicht der Fall ist, wird das else überhaupt nicht benötigt, da die Zuweisung in beiden Fällen gleich ist, also kein else und außerhalb desif
James

8

Strenge Standards: Nicht statische Methoden [<Klasse> :: <Methode>] sollten nicht statisch aufgerufen werden

Tritt auf, wenn Sie versuchen, eine nicht statische Methode für eine Klasse aufzurufen, da diese statisch war, und Sie haben auch das E_STRICTFlag in Ihren error_reporting()Einstellungen.

Beispiel:

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

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

Sie können tatsächlich diesen Fehler vermeiden , indem nicht das Hinzufügen E_STRICTzu error_reporting(), zB

error_reporting(E_ALL & ~E_STRICT);

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

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

oder rufen Sie die Funktion konventionell auf:

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

Verwandte Fragen:


7

Veraltet: Die Syntax für den Offset-Zugriff von Arrays und Zeichenfolgen mit geschweiften Klammern ist veraltet

Auf String-Offsets und Array-Elemente konnte {}vor PHP 7.4.0 mit geschweiften Klammern zugegriffen werden:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

Dies ist seit PHP 7.4.0 veraltet und generiert eine Warnung:

Veraltet: Die Syntax für den Offset-Zugriff von Arrays und Zeichenfolgen mit geschweiften Klammern ist veraltet

Sie müssen eckige Klammern verwenden, []um auf String-Offsets und Array-Elemente zuzugreifen:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

Der RFC für diese Änderung ist mit einem PHP- Skript verknüpft, das versucht, dies mechanisch zu beheben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.