Klasse extenden, Methode extenden/andere Methode vorschalten?

lay-z-cow

Erfahrenes Mitglied
Hi,

ich möchte eine mySQL-Klasse extenden mit dem Zweck, dass vor jedem Query ein zusätzlicher Query (this->query("SET NAMES 'utf8'");) automatisch abgeschickt wird.

Gibt es in PHP5 eine Möglichkeit abzufangen, wenn eine Methode aufgerufen wird um z.B. meinen zusätzlichen Query vorher abzusenden?

Die Klasse selbst möchte ich nicht umschreiben, da wiederum andere Klassen auf ihr aufbauen.

Hat jemand einen Einfall, wie man das am elegantesten bewerkstelligen könnte?


Gruß

.:lay-z-cow..
 
Man kann mit parent:: auf Funktionen der übergeordneten Klasse zugreifen:

PHP:
class mySQL {
	function query($str) {
		// inhalt..
	}
}

class mySQL_utf8 extends mySQL {
	function query($str) {
		mysql_query("SET NAMES 'utf8'");
		
		parent::query($str);
	}
}
 
Die SET NAMES Direktive gilt für die komplette Zeit der Verbindung, du musst dieses Query also nur ein einziges Mal an die Datenbank übergeben, wenn es denn überhaupt notwendig ist.
 
Hi,

vielen dank. Beide Antworten sind sehr aufschlußreich. :)

@maeTimmae: In welchem Fall kann man es sich denn sparen?


Gruß

.:lay-z-cow:.
 
Wenn die Datenbank entsprechend konfiguriert und eingerichtet ist, verwertet sie Anfragen als UTF8-encodiert und gibt auch UTF8 zrück. Sollte das nicht möglich sein (zB nur beschränkte Rechte), reicht eine einmalige Ausführung dieses Querys zB direkt nach dem Aufbau der Datenbankverbindung.
 
Ok.
Die einmalige Festlegung scheint zu funktionieren. Ich sende den SET NAMES Query jetzt mit dem Konstruktor der erweiterten Klasse ab.

Allerdings frage ich mich, warum es nicht ohne diesen Query funktioniert.

Laut PHP-Admin:
MySQL-Zeichensatz: UTF-8 Unicode (utf8)
Zeichensatz / Kollation der MySQL-Verbindung: utf8_unicode_ci

Datenbank:
Typ: MyISAM
Kollation: utf8_unicode_ci

Tabelle und Spalte ebenfalls
Kollation: utf8_unicode_ci

Was fehlt denn da noch?


Gruß

.:lay-z-cow:.
 
Anscheinend hat die MySQL(i) Erweiterung in PHP ein paar Eigenheiten, so steht als Kommentar zu [phpf]mysqli_connect[/phpf] folgendes:
A quick word about the connection encoding for this extension. It doesn't appear to be documented anywhere that I can find, but this defaults to latin1 encoding for the connection, regardless of PHP's or MySQL's settings. I run in a completely UTF-8 setup, and spent days trying to discover the cause of corrupted characters from the Db. If, like me, you need to work with other than latin1, use the set_charset function/method to switch to your encoding of choice.
Oder auch
Yes, it's totally odd that php.ini doesn't seem to allow you to global specify the client connection as utf-8. You might try this in the
my.cnf file
Code:
[client]
default-character-set=utf8

[ mysqld]
default-character-set=utf8

Demnach scheint die SET NAMES Direktive die einzig sinnvolle Lösung für den Moment zu sein. Werde selbst aber auch nochmal ein wenig durch die Sources und Konfigurationen wühlen.
 
Hmm... auf das Ergebnis deiner Recherche bin ich gespannt.

Momentan werde ich aber wahrscheinlich bei SET NAMES bleiben, da die Klasse möglichst portabel sein soll und man ja nicht weiß, ob man auch in Zukunft überall in den Konfigurationsdateien rumschreiben kann. ;)

Gruß

.:lay-z-cow:.
 
Zurück