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