2008-09-17 3 views
0

Wir haben kürzlich einen seltsamen Fehler behoben. Eine Lösung wurde gefunden, aber die Lösung ist nicht vollständig zufriedenstellend.MDB2 trennt und vergisst die Zeichensatzeinstellung, wenn die Verbindung wiederhergestellt wird

Wir verwenden IntSmarty, um unsere Website zu lokalisieren und die lokalisierten Strings mit unserem eigenen Wrapper in einer Datenbank zu speichern. In seinem Destruktor speichert IntSmarty alle neuen Zeichenfolgen, die es möglicherweise hat, was zu einem Datenbankaufruf führt.

Wir verwenden eine Singleton-Instanz von MDB2, um Abfragen für MySQL auszuführen, und nach der Verbindung haben wir die SetCharset() - Funktion verwendet, um den Zeichensatz in UTF-8 zu ändern. Wir haben festgestellt, dass Strings, die von IntSmarty gespeichert wurden, beim Erstellen der letzten Inserts als ISO-8859-1 interpretiert wurden. Wir haben uns das Abfrageprotokoll genau angesehen und festgestellt, dass die Verbindung zu MySQL unterbrochen wurde, bevor IntSmartys Destruktor aufgerufen wurde. Es wurde dann wiederhergestellt, aber es wurde keine Abfrage "SET NAMES utf8" für die neue Verbindung ausgegeben. Dies führte dazu, dass die gespeicherten Strings von MySQL als ISO-8859-1 interpretiert wurden.

Es scheint keine Optionen zu geben, die den Standardzeichensatz für MDB2 festlegen. Unsere Lösung für dieses Problem bestand darin, die MySQL-Serverkonfiguration zu ändern, indem Sie my.cnf zu

hinzufügen. Das löst nur das Problem, dass unser Zeichensatz immer gleich ist.

Also, gibt es eine Möglichkeit, dass ich verhindern kann, dass die Verbindung abgebrochen wird, bevor alle Abfragen ausgeführt wurden? Kann ich erzwingen, dass die MDB2-Instanz nach allem anderen zerstört wird?

Permanente Verbindungen aktivieren funktioniert, ist aber keine erwünschte Antwort.

Antwort

1

Von der PHP5 Dokumentation:

Die Destruktormethode wird so schnell aufgerufen werden wie alle Verweise auf ein bestimmtes Objekt entfernt werden, oder wenn das Objekt explizit zerstört oder in beliebiger Reihenfolge in Abschaltsequenz.

PHP documentation

(Hervorhebung von mir)

Was wohl passiert, ist, dass Ihr Skript nicht zerstört das Objekt explizit, und so, wenn PHP zum Ende des Skripts wird es beginnt Aufräumen Dinge in welcher Reihenfolge es sich anfühlt - was in Ihrem Fall den Datenbanklink zuerst schließt.

Wenn Sie das IntSmarty-Objekt vor dem eigentlichen Ende des Skripts explizit zerstören, sollte das Ihr Problem lösen.

Verwandte Themen