mysql error - Referenz-Was bedeutet dieser Fehler in PHP?



handling best (25)

Notice: Trying to get property of non-object error

Happens when you try to access a property of an object while there is no object.

A typical example for a non-object notice would be

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

In this case, $users is an array (so not an object) and it does not have any properties.

This is similar to accessing a non-existing index or key of an array (see Notice: Undefined Index ).

This example is much simplified. Most often such a notice signals an unchecked return value, eg when a library returns NULL if an object does not exists or just an unexpected non-object value (eg in an Xpath result, JSON structures with unexpected format, XML with unexpected format etc.) but the code does not check for such a condition.

As those non-objects are often processed further on, often a fatal-error happens next on calling an object method on a non-object (see: Fatal error: Call to a member function ... on a non-object ) halting the script.

It can be easily prevented by checking for error conditions and/or that a variable matches an expectation. Here such a notice with a DOMXPath example:

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

The problem is accessing the nodeValue property (field) of the first item while it has not been checked if it exists or not in the $result collection. Instead it pays to make the code more explicit by assigning variables to the objects the code operates on:

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

Related errors:

  • Hinweis: Undefinierter Index
  • Fatal error: Call to a member function ... on a non-object

Was ist das?

Dies ist eine Anzahl von Antworten auf Warnungen, Fehler und Hinweise, die Sie beim Programmieren von PHP kennen lernen können und keine Ahnung haben, wie Sie diese beheben können. Dies ist auch ein Community-Wiki, so dass jeder eingeladen wird, diese Liste hinzuzufügen und zu pflegen.

Warum ist das?

Fragen wie "Bereits gesendete Header" oder "Aufruf eines Mitglieds eines Nicht-Objekts" werden häufig in angezeigt. Die Ursache dieser Fragen ist immer dieselbe. Die Antworten auf diese Fragen wiederholen sie in der Regel und zeigen dann die OP, welche Zeile in ihrem speziellen Fall geändert werden soll. Diese Antworten fügen der Site keinen Wert hinzu, da sie nur für den jeweiligen Code des OP gelten. Andere Benutzer mit dem gleichen Fehler können die Lösung nicht einfach auslesen, da sie zu lokal sind. Das ist traurig, denn sobald Sie die Ursache erkannt haben, ist das Beheben des Fehlers trivial. Daher versucht diese Liste, die Lösung allgemein zu erklären.

Was soll ich hier machen?

Wenn Ihre Frage als ein Duplikat markiert wurde, finden Sie unten Ihre Fehlermeldung und wenden Sie das Update auf Ihren Code an. Die Antworten enthalten in der Regel weitere Links, die zu untersuchen sind, falls die allgemeine Antwort nicht klar sein sollte.

Wenn Sie etwas beitragen möchten, fügen Sie bitte Ihre "Lieblings" -Fehlermeldung, Warnung oder Hinweis, eine pro Antwort, eine kurze Beschreibung, was es bedeutet (auch wenn es nur Begriffe auf ihre Handbuchseite hervorhebt), eine mögliche Lösung oder Debugging-Ansatz und eine Auflistung vorhandener Q & A, die wertvoll sind. Fühlen Sie sich auch frei, vorhandene Antworten zu verbessern.

Die Liste

Siehe auch


Parse-Fehler: Syntaxfehler, unerwarteter T_ENCAPSED_AND_WHITESPACE

Dieser Fehler tritt am häufigsten auf, wenn versucht wird, einen Matrixwert mit einem Schlüssel in Anführungszeichen für die Interpolation in einer Zeichenfolge mit doppelten Anführungszeichen zu referenzieren, wenn das gesamte komplexe Variablenkonstrukt nicht in {} .

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 ohne E_NOTICE und gibt kein E_NOTICE . Also 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 der / die Schlüssel können in {} . In diesem Fall sollten sie in Anführungszeichen gesetzt werden, um eine E_NOTICE zu vermeiden. 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 besteht die Alternative zu den oben genannten Möglichkeiten darin, die Array-Variable in 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 Variablenpartitionierung in der Manualpage PHP Strings


Hinweis: Verwendung von undefinierter Konstante XXX - angenommen 'XXX'

oder, in PHP 7.2 oder später:

Warnung: Verwendung von undefinierter Konstante XXX - angenommen 'XXX' (dies wirft einen Fehler in einer zukünftigen Version von PHP)

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

Eine der häufigsten Ursachen für diese Benachrichtigung ist die fehlende Angabe einer Zeichenfolge, die als assoziativer Array-Schlüssel verwendet wird.

Beispielsweise:

// 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 Keyword falsch geschrieben:

// Wrong
$foo = fasle;

// Right
$foo = false;

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

Verwandte Fragen:


Parse-Fehler: Syntaxfehler, unerwarteter T_PAAMAYIM_NEKUDOTAYIM

Der Scope-Resolution-Operator wird auch "Paamayim Nekudotayim" aus dem Hebräischen פעפעיםם נקנקדדיםם genannt. was "doppelter Doppelpunkt" oder "doppelter Doppelpunkt" bedeutet.

Dieser Fehler tritt normalerweise auf, wenn Sie versehentlich :: in Ihren Code einfügen.

Verwandte Fragen:

Dokumentation:


Schwerwiegender Fehler: Aufruf zu undefinierter Funktion XXX

Tritt auf, wenn Sie versuchen, eine Funktion aufzurufen, die noch nicht definiert ist. Häufige Ursachen sind fehlende Erweiterungen und Includes, bedingte Funktionsdeklarationen, Funktion in der Funktionsdeklaration oder einfache Tippfehler.

Beispiel 1 - Conditional Function Declaration

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

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

Beispiel 2 - Funktion in der Funktionserklärung

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

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

Sie können dies auch für eine integrierte PHP-Funktion sehen. Versuchen Sie im offiziellen Handbuch nach der Funktion zu suchen und prüfen Sie, welcher "Erweiterung" (PHP-Modul) sie angehört und welche PHP-Versionen sie unterstützen.

Im Fall einer fehlenden Erweiterung installiere diese Erweiterung und aktiviere sie in der php.ini. In den Installationsanweisungen im PHP-Handbuch finden Sie die Erweiterung, in der Ihre Funktion angezeigt wird. Möglicherweise können Sie die Erweiterung auch mit Ihrem Paketmanager aktivieren oder installieren (z. B. apt in Debian oder Ubuntu, yum in Red Hat oder CentOS) oder a Systemsteuerung 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 in dem Handbuch oder seinem Kommentarabschnitt. Wenn es aus PHP entfernt wurde, suchen Sie nach Informationen zu den Gründen, da dies möglicherweise nicht mehr erforderlich ist.

Stellen Sie bei fehlenden Includes sicher, dass die Datei, die die Funktion deklariert, vor dem Aufruf der Funktion eingefügt wird.

Im Falle von Tippfehlern, korrigieren Sie den Tippfehler.

Verwandte Fragen:

  • https://.com/search?q=Fatal+error%3A+Call+to+undefined+function

Warning: Division by zero

The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. Beispielsweise:

$value = @(2 / 0);

But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.

To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you should not divide, or change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.

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:


Parse-Fehler: Syntaxfehler, unerwarteter T_VARIABLE

Mögliches Szenario

Ich kann nicht finden, wo mein Code falsch gelaufen 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 error: Ein Problem mit der Syntax Ihres Programms, z. B. das Lassen eines Semikolons am Ende einer Anweisung oder, wie im obigen Fall, das Fehlen der . Operator. Der Interpreter beendet das Programm, wenn ein Parse-Fehler auftritt.

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

Was Sie tun sollten, ist sorgfältig zu überprüfen, wo der Fehler für einfache Fehler liegt.

Diese Fehlermeldung bedeutet, dass der PHP-Interpreter in der Zeile x der Datei eine offene Klammer erwartet hat, aber stattdessen auf etwas namens T_VARIABLE . Diese T_VARIABLE Sache wird als token . Es ist die Art und Weise, wie der PHP-Interpreter 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 T_VARIABLE , gibt es in der Liste des Interpreters ein T_VARIABLE Token.

Gut zu lesen: Liste der Parser-Token

Stelle also sicher, dass du mindestens E_PARSE in deiner php.ini . Parse-Fehler sollten in Produktionsskripten nicht vorhanden sein.

Ich habe immer empfohlen, die folgende Aussage hinzuzufügen, während ich codiere:

error_reporting(E_ALL);

PHP Fehlerberichte

Es ist auch eine gute Idee, eine IDE zu verwenden, mit der Sie während der Eingabe Fehler parsen können. Sie können verwenden:

  1. NetBeans (schöne Schönheit, kostenlose Software) (meiner Meinung nach das Beste)
  2. PhpStorm (Onkel Gordon liebe das: P, bezahlter Plan, enthält proprietäre und freie Software)
  3. Eclipse (Schöne und das Biest, freie Software)

Verwandte Fragen:

  • Referenz: PHP Parse / Syntax Fehler; und wie man sie löst?

Notice: Array to string conversion

This simply happens if you try to treat an array as a string:

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

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

An array cannot simply be echo 'd or concatenated with a string, because the result is not well defined. PHP will use the string "Array" in place of the array, and trigger the notice to point out that that's probably not what was intended and that you should be checking your code here. You probably want something like this instead:

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

Or loop the array:

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

If this notice appears somewhere you don't expect, it means a variable which you thought is a string is actually an array. That means you have a bug in your code which makes this variable an array instead of the string you expect.


MySQL: Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version entspricht, für die richtige Syntax, die in der Nähe von ... at line verwendet werden soll ...

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

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 eine Seite mit einem Formular zum Einreichen mit einer URL wie http://example.com/edit.php?id=10 (um den Beitrag Nr. 10 zu bearbeiten) http://example.com/edit.php?id=10

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

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

Und wenn diese Abfrage an MySQL gesendet wird, wird es sich beschweren, dass die Syntax falsch ist, weil es ein zusätzliches einfaches Anführungszeichen in der Mitte gibt.

Um solche Fehler zu vermeiden, MÜSSEN Sie die Daten immer vor der Verwendung in einer Abfrage ausschließen.

Es ist auch sehr wichtig, dass Daten vor der Verwendung in einer SQL-Abfrage entschlüsselt werden. Wenn Sie dies nicht tun, ist Ihr Skript für SQL-Injektionen offen. Eine SQL-Injektion kann zu Änderungen, Verlusten oder Änderungen eines Datensatzes, einer Tabelle oder einer gesamten Datenbank führen. Dies ist ein sehr ernstes Sicherheitsproblem!

Dokumentation:


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

Es passiert, wenn Sie eine Datei normalerweise durch include , require oder fopen und PHP die Datei nicht finden kann oder nicht genug Berechtigungen hat, um die Datei zu laden.

Dies kann aus verschiedenen Gründen geschehen:

  • Dateipfad ist falsch
  • 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 dirname(__FILE__) :

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

oder:

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

Sicherstellen, dass der richtige Pfad verwendet wird, ist ein Schritt bei der Behebung dieser Probleme. Dies kann auch mit nicht vorhandenen Dateien zusammenhängen, Rechte des Dateisystems, die den Zugriff verhindern oder die von PHP selbst offengelegt werden.

Der beste Weg, um dieses Problem schnell zu lösen, ist die folgende Checkliste zur Fehlerbehebung.

Verwandte Fragen:

Zugehörige Fehler:


Fatal error: [TraitA] and [TraitB] define the same property ([$x]) in the composition of [ClassC]

Occurs when a class attempts to use multiple Traits , where two or more of those Traits have defined a property by the same name, and with the property having differing initial values.

Beispiel:

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

Problematic: While it's possible to resolve conflicts between competing methods , there is currently no syntax that would resolve a conflict between two competing properties. The only solution at this time is to refactor ; ie, avoid a conflict between property names that produces a fatal error.

Verwandte Fragen:


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

Auch bekannt als die Weiße Seite des Todes oder White Screen Of Death . 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 wird normalerweise in einer Datei namens "php_errors.log" sein, entweder an einem zentralen Ort (zB /var/log/apache2 in vielen Linux-Umgebungen) oder im Verzeichnis des Skripts selbst (manchmal in einer Shared-Hosting-Umgebung).

Manchmal kann es einfacher sein, 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 sichtbar, der die Website besucht.

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 wird die Anzeige von Fehlern aktivieren und die Berichterstattung auf die höchste Stufe setzen.

Da das ini_set() zur Laufzeit ausgeführt wird, hat es keine Auswirkungen auf Syntax- / 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 Anweisung display_startup_errors auf true . Tun Sie dies entweder in der php.ini oder in einem .htaccess oder mit einer anderen Methode, die die Konfiguration vor der Laufzeit beeinflusst .

Sie können dieselben Methoden verwenden, um die Direktiven log_errors und error_log , um Ihren eigenen Speicherort für Protokolldateien auszuwählen.

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

Verwandte Fragen:

Ähnliche Fehler:


Strict Standards: Non-static method [<class>::<method>] should not be called statically

Occurs when you try to call a non-static method on a class as it was static, and you also have the E_STRICT flag in your error_reporting() settings.

Beispiel:

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

HTML::br() or $html::br()

You can actually avoid this error by not adding E_STRICT to error_reporting() , eg

error_reporting(E_ALL & ~E_STRICT);

since as for PHP 5.4.0 and above, E_STRICT is included in E_ALL [ ref ]. But that is not adviceable. The solution is to define your intended static function as actual static :

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

or call the function conventionally :

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

Related questions :


Schwerwiegender Fehler: Kann den Funktionsrückgabewert im Schreibkontext nicht verwenden

Dies geschieht normalerweise, wenn eine Funktion direkt mit empty .

Beispiel:

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

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

empty , trotz seines Namens, prüft nicht wirklich, ob eine Variable "leer" ist. Stattdessen wird überprüft, ob eine Variable nicht existiert, oder == false . Ausdrücke (wie is_null(null) in dem Beispiel) werden immer als vorhanden betrachtet, so dass hier empty nur geprüft wird, ob es gleich falsch ist. Du könntest empty() hier mit ersetzen ! zB if (!is_null(null)) oder explizit mit false vergleichen, zB if (is_null(null) == false) .

Verwandte Fragen:


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

Schwerwiegender Fehler: Kann [Funktionsname] nicht erneut deklarieren

Dies bedeutet, dass Sie entweder den gleichen Funktions- / Klassennamen zweimal verwenden und einen davon umbenennen müssen, oder weil Sie require_once oder include_once oder 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:

Klasse.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() wird den obigen Fehler erzeugen. Durch das Ändern von require in require_once können wir sicher sein, dass die Datei, die die Definition von MyClass , nur einmal geladen wird und der Fehler vermieden wird.


Hinweis: Undefinierter Index

Tritt auf, wenn Sie versuchen, auf ein Array mit einem Schlüssel zuzugreifen, der nicht im Array vorhanden ist.

Ein typisches Beispiel für einen Undefined Index Hinweis 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_WARNING ausgelöst wird.

Die Lösung besteht darin, sicherzustellen, dass der Index oder Offset vor dem Zugriff auf diesen Index existiert. 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 mit array_key_exists oder isset :

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

Wenn Sie Code wie haben:

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

dann wird $_POST['message'] nicht gesetzt, wenn diese Seite zum ersten Mal geladen wird, und Sie erhalten den obigen Fehler. Nur wenn das Formular übergeben wird und dieser Code ein zweites Mal ausgeführt wird, existiert der Array-Index. Normalerweise überprüfen Sie dies mit:

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

Verwandte Fragen:


Schwerwiegender Fehler: Aufruf einer Member-Funktion ... bei einem Nicht-Objekt

Es passiert mit einem Code ähnlich wie xyz->method() wobei xyz kein Objekt ist und daher diese method nicht aufgerufen werden kann.

Dies ist ein schwerwiegender Fehler, der das Skript stoppt (Vorwärtskompatibilitätshinweis: Es wird ein abfangbarer Fehler, der mit PHP 7 beginnt).

In den meisten Fällen ist dies ein Zeichen dafür, dass der Code keine Überprüfungen auf Fehlerbedingungen enthält. Überprüfen Sie, ob ein Objekt tatsächlich ein Objekt ist, bevor Sie seine Methoden aufrufen.

Ein typical 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 der $statement . Der Versuch, die execute() -Methode aufzurufen execute() führt dann zum Fatal Error, weil false ein "Nicht-Objekt" ist, weil der Wert ein boolescher Wert ist.

Finden Sie heraus, warum Ihre Funktion einen booleschen Wert anstelle eines Objekts zurückgegeben hat. Überprüfen Sie zum Beispiel das $pdo Objekt auf den letzten aufgetretenen Fehler. Details darüber, wie Sie dies debuggen können, hängen davon ab, wie Fehler für die jeweilige Funktion / das fragliche Objekt / die betroffene Klasse gehandhabt werden.

Wenn sogar die ->prepare fehlschlägt, dann wurde Ihr $pdo Datenbank-Handle-Objekt nicht in den aktuellen Bereich übernommen . Finde heraus, wo es definiert wurde. Dann übergeben Sie es als Parameter, speichern Sie es als Eigenschaft, oder teilen Sie es über den globalen Bereich.

Ein anderes Problem kann bedingt sein, ein Objekt zu erstellen und dann zu versuchen, eine Methode außerhalb dieses bedingten Blocks aufzurufen. Beispielsweise

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

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

Verwandte Fragen:

  • Ruft eine Member-Funktion für ein Nicht-Objekt auf
  • Listet alle PHP auf "Fataler Fehler: Aufruf einer Member-Funktion ... auf einem Nicht-Objekt" Fragen zu

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

Das passiert, wenn Ihr Skript versucht, einen HTTP-Header an den Client zu senden, aber bereits zuvor ausgegeben wurde, was dazu führte, dass die Header bereits an den Client gesendet wurden.

Dies ist ein E_WARNING und 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 Funktion session_start() versucht, Header mit dem Sitzungscookie an den Client zu senden. Aber PHP hat bereits Header gesendet, als es das <html> -Element in den Ausgabestream geschrieben hat. Sie session_start() nach oben verschieben.

Sie können dies lösen, indem Sie die Zeilen vor dem Code durchgehen, der die Warnung auslöst, und prüfen, wo sie ausgegeben wird. Verschieben Sie einen Header, der Code vor diesem Code sendet.

Eine oft übersehene Ausgabe sind neue Zeilen nach dem Schließen von PHP ?> . Es ist eine Standardmethode, um sie wegzulassen ?> Wenn es das Letzte in der Datei ist. Eine andere häufige Ursache für diese Warnung ist, wenn die öffnung <?php ein leeres Leerzeichen, eine Zeile oder ein unsichtbares Zeichen davor hat, was dazu führt, dass der Webserver die Header und die Whitespace / Newline sendet, wenn PHP das Parsen startet um einen Header zu senden.

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 hatten, der automatisch konstruiert wurde)

Stellen Sie außerdem sicher, dass in Ihrem Code keine Byte-Bestellmarkierungen vorhanden sind, z. B. wenn die Codierung des Skripts UTF-8 mit BOM lautet.

Verwandte Fragen:


Parse-Fehler: Syntaxfehler, unerwarteter T_XXX

Es passiert, wenn Sie ein T_XXX Token an einem unerwarteten Ort haben, unsymmetrische (überflüssige) Klammern, die Verwendung eines kurzen Tags, ohne es in php.ini zu aktivieren, und vieles mehr.

Verwandte Fragen:

Für weitere Hilfe siehe:


Warning: Illegal string offset 'XXX'

This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense .

Beispiel:

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

If you think the variable should be an array, see where it comes from and fix the problem there.


Schwerwiegender Fehler: Verwenden von $ this, wenn nicht im Objektkontext

$this ist eine spezielle Variable in PHP, die nicht zugewiesen werden kann. Wenn auf einen Kontext zugegriffen wird, in dem er nicht existiert, 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();
    

    Wie zu beheben: überprüfen Sie Ihren Code erneut, $this kann nur im Objektkontext verwendet werden, und sollte nie in einer statischen Methode verwendet werden. Außerdem sollte eine statische Methode 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 kopiert wurde und die Variable $this special beibehalten wird.
    So beheben Sie das Problem: Überprüfen Sie den Code und ersetzen Sie $this durch eine andere Substitutionsvariable.

Verwandte Fragen:

  1. Rufen Sie die nicht statische Methode als statisch auf: PHP Fataler Fehler: Verwenden Sie $ this, wenn Sie nicht im Objektkontext sind
  2. Kopieren Sie den Code: Schwerwiegender Fehler: Verwenden Sie $ this, wenn Sie nicht im Objektkontext sind
  3. Alles "Using $ this, wenn nicht im Objektkontext" Fragen zu

Hinweis: Undefinierte Variable

Tritt auf, 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 $counter nicht zuvor definiert haben, löst der obige Code die Benachrichtigung aus.

Der richtige Weg wäre, die Variable vor ihrer Verwendung zu setzen, auch wenn es nur eine leere Zeichenfolge ist

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

Verwandte Fragen:


Code doesn't run/what looks like parts of my PHP code are output

If you see no result from your PHP code whatsoever and/or you are seeing parts of your literal PHP source code output in the webpage, you can be pretty sure that your PHP isn't actually getting executed. If you use View Source in your browser, you're probably seeing the whole PHP source code file as is. Since PHP code is embedded in <?php ?> tags, the browser will try to interpret those as HTML tags and the result may look somewhat confused.

To actually run your PHP scripts, you need:

  • a web server which executes your script
  • to set the file extension to .php, otherwise the web server won't interpret it as such*
  • to access your .php file via the web server

* Unless you reconfigure it, everything can be configured.

This last one is particularly important. Just double clicking the file will likely open it in your browser using an address such as:

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

This is completely bypassing any web server you may have running and the file is not getting interpreted. You need to visit the URL of the file on your web server, likely something like:

http://localhost/my/file.php

You may also want to check whether you're using short open tags <? instead of <?php and your PHP configuration has turned short open tags off.

Also see PHP code is not being executed, instead code shows on the page


Warnung: open_basedir-Einschränkung 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 für einige Dateien der Zugriff verboten wurde.

Die Warnung selbst unterbricht nichts, aber meistens funktioniert ein Skript nicht richtig, wenn der Dateizugriff verhindert wird.

Der Fix ist normalerweise, um die PHP-Konfiguration zu ändern, die zugehörige Einstellung heißt open_basedir .

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

Verwandte Fragen:


Diese Hinweise basieren darauf, dass die verwendete Variable nicht defined und der Schlüssel my_index nicht in der Variablen $my_array ist.

Diese Benachrichtigungen wurden jedes Mal ausgelöst, weil Ihr code nicht korrekt ist, aber Sie haben wahrscheinlich keine Benachrichtigungen gemeldet.

Löse die Fehler:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

Eine andere Möglichkeit, dies herauszufinden:

ini_set("error_reporting", false)




php mysql debugging warnings