Verwirrender PHP Objekt Fehler
Verfasst: 02.02.2007 16:40
Ich rätsele gerade an einem ziemlich verwirrenden Fehler herum. Das ganze hat nicht direkt mit PHPbb zu tun, daher bitte keine Kommentare wie "Die Funktion gibt's nicht" oder so.
Situation:
ich habe ein sehr kurzes Testscript geschrieben, welches eine SQL Fehlermeldung provoziert (Einfach SQL Abfrage mit "Diese Abfrage produziert einen Fehler"
). Die Abfrage wird von einem Datenbankobjekt ausgeführt, welches im Fehlerfall die Fehlermeldungen sofort abfragt und in einem Array speichert. Dieses Datenbankobjekt besitzt außerdem eine Funktion, mit der ich diese Fehlermeldung formatiert zurückgeliefert bekomme, also Array -> String. Außerdem gibt es ja die PHP Fehlerbehandlung, welche ich mit einer eigenen überschreibe.
Der Effekt ist jetzt folgender:
Wenn hierbei eine komplette Kopie angelegt würde, dann würde das logischerweise bedeuten, dass ich beim Datenbankupdate mit dem error_handler keine Änderung an den Variablen des globalen Datenbankobjekts vorgenommen habe, sondern nur an den Variablen des Lokalen Objekts. Da beim Kopieren des Objekts die Verbindung bereits hergestellt war und die Verbindungsdaten im Objekt lagen, dürfte sich bei der Interaktion mit der Datenbank kein Unterschied ergeben. Wenn es aber um lokale Daten im Objekt geht schon.
Wobei sich dann wiederum PHP 5 blödsinnig verhalten würde, denn wenn mein globales Datenbankobjekt nicht dasselbe ist wie das, welches ich im Error Handler benutze (da ich ja eine Kopie erzeuge), dann dürfte die Abfrage im Error Handler keine Fehlermeldungen löschen.
Ich erzeuge die Kopie (oder Referenz?) mit diesem Code:
Meine Vermutung wäre: PHP 5 legt nur eine Referenz an und benutzt weiterhin das übergebene (in diesem Fall globale) Objekt.
PHP 4 Interpretiert das "wörtlich" und kopiert das Objekt vollständig, so dass 2 unabhängige Objekte entstehen.
Hier noch als Beispiel mein T[codeestcode:
Config.php übernimmt in diesem Fall die Initialisierung usw.
Ausgabe von PHP4 ist diese:
Situation:
ich habe ein sehr kurzes Testscript geschrieben, welches eine SQL Fehlermeldung provoziert (Einfach SQL Abfrage mit "Diese Abfrage produziert einen Fehler"

Der Effekt ist jetzt folgender:
- PHP 5 verhält sich exakt so wie man es erwarten sollte (auch wenn es ein wenig gebraucht hat meinen "mental error" zu finden, denn ich hielt erst PHP 5 für falsch). Nachdem ich den Fehler verursacht habe wird dieser in einer Variablen gespeichert. Dann benutze ich trigger_error(). Im Zuge dieser Funktion passiert ein Datenbankaufruf, der Fehlerfrei vonstatten geht (Log ist keine Datei sondern eine Datenbanktabelle). Daher ist danach kein Fehler mehr da (letzte Aktion wird jeweils gespeichert) und ich bekomme, wenn ich die Fehlermeldung neu Abfrage kein Ergebnis mehr.
- In PHP 4 dagegen bekomme ich eine Fehlermeldung in die erste Variable (sollte so auch sein) ich bekomme eine in die Datenbank (auch gut) aber ich bekomme danach immer noch die Fehlermeldung geliefert, obwohl ja die letzte Datenbankabfrage offenbar geklappt haben muss.
Wenn hierbei eine komplette Kopie angelegt würde, dann würde das logischerweise bedeuten, dass ich beim Datenbankupdate mit dem error_handler keine Änderung an den Variablen des globalen Datenbankobjekts vorgenommen habe, sondern nur an den Variablen des Lokalen Objekts. Da beim Kopieren des Objekts die Verbindung bereits hergestellt war und die Verbindungsdaten im Objekt lagen, dürfte sich bei der Interaktion mit der Datenbank kein Unterschied ergeben. Wenn es aber um lokale Daten im Objekt geht schon.
Wobei sich dann wiederum PHP 5 blödsinnig verhalten würde, denn wenn mein globales Datenbankobjekt nicht dasselbe ist wie das, welches ich im Error Handler benutze (da ich ja eine Kopie erzeuge), dann dürfte die Abfrage im Error Handler keine Fehlermeldungen löschen.
Ich erzeuge die Kopie (oder Referenz?) mit diesem Code:
Code: Alles auswählen
function set_db_object($db_object,$db_tabelle = '')
{
if($db_object)
{
$this->db = $db_object;
if($db_tabelle)
{
$this->db_table = $db_tabelle;
}
elseif(!$this->db_tabelle)
{
$this->db_tabelle = 'error_logfile';
}
$this->log_type = 'db';
}
else
{
$this->log_type = 'file';
}
}
PHP 4 Interpretiert das "wörtlich" und kopiert das Objekt vollständig, so dass 2 unabhängige Objekte entstehen.
Hier noch als Beispiel mein T[codeestcode:
Code: Alles auswählen
include(ROOTPATH . 'basis/config.php');
$db->sql('Diese Abfrage produziert einen Fehler');
$fehler = $db->error();
trigger_error(strip_tags($db->error()),E_USER_WARNING);
$fehler2 = $db->error();
$fehler3 = print_r($db->error,true);
echo "<br>\n<span style='color:green'>FEHLER:</span> $fehler <br> \n <span style='color:green'>FEHLER2:</span> $fehler2";
echo "<br>\n<span style='color:green'>FEHLER3: </span>$fehler3 ";
Ausgabe von PHP4 ist diese:
Die Ausgabe von PHP 5 diese:FEHLER: SQL Error NR: 1064
Errortext: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'Diese Abfrage produziert einen Fehler' at line 1
Fehlerhaftes Query: Diese Abfrage produziert einen Fehler
FEHLER2: SQL Error NR: 1064
Errortext: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'Diese Abfrage produziert einen Fehler' at line 1
Fehlerhaftes Query: Diese Abfrage produziert einen Fehler
FEHLER3: Array ( [TEXT] => You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'Diese Abfrage produziert einen Fehler' at line 1 [NR] => 1064 [QUERY] => Diese Abfrage produziert einen Fehler )
Hat jemand vielleicht noch eine andere Idee, oder kann das bestätigen? Das wird vermutlich nicht an der Tatsache liegen, dass es sich um ein Objekt mit Datenbankinteraktionen handelt, ich vermute es geht auch mit jedem beliebigen anderen Objekt als beispiel.FEHLER: SQL Error NR: 1064
Errortext: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Diese Abfrage produziert einen Fehler' at line 1
FEHLER2:
FEHLER3: Array ( )