STam
Tue. 10. July 2007, 10:44
Hi,
es gibt seit MySQL 4.0 die Möglichkeit das Verhalten von MySQL beim Umgang mit Anfragen über die Systemvariable sql_mode zu steuern.
Bei
MySQL 4.0 musste dies bei der Konfiguration des Servers noch fest eingebunden werden.
Seit
MySQL 4.1.1 kann der sql_mode
auch zur Laufzeit geändert werden. Mit
MySQL 5.0.2 wurde der sql_mode
STRICT_TRANS_TABLESals Standardwert eingestellt.
Was macht dieser STRICT_TRANS_TABLES-Modus? Nun, er sorgt dafür, dass MySQL die ihm übergebenen Daten sorgfältig überprüft und bei Fehlern die weitere Verarbeitung des ihm übergebenen Aufrufes abbricht.
Ein Fehler könnte z.B. sein, wenn versucht wird einen String in ein als integer deklariertes Feld zu speichern.
Ohne Strict-Mode wandelt MySQL den String in eine "0" um und speichert diesen Wert ab. Im Strict-Mode hingegen bricht MySQL die Anfrage mit einem Fehler ab.
Dies betrifft u.a. auch als NOT_NULL deklarierte Felder in denen ein Wert erwartet wird. Bei SF <= 1.4 sind die meisten Felder als NOT_NULL deklariert,
was im erwähnten STRICT MODE zu Fehlern führt. Außerdem sind viele Übergabeparameter als String maskiert was eigentlich als eine vorbeugende Maßnahme
zum Schutz vor Mysql-Injections gedacht ist.
Die Lösung liegt im abschalten des STRICT MODE. Dies kann mit dieser Änderung erreicht werden (File:
/backend/external/phplib/local.php:
QUELLTEXT
function DB_cms() {
global $cfg_cms;
$this->Host = $cfg_cms['db_host'];
$this->Database = $cfg_cms['db_database'];
$this->User = $cfg_cms['db_user'];
$this->Password = $cfg_cms['db_password'];
$this->PConnect = $cfg_cms['db_mysql_pconnect'];
parent::DB_Sql("SET sql_mode = 'MYSQL40'");
}
... wer Spaß daran hat SF mal zu debuggen kann ja mal die eingefügte Zeile nach
QUELLTEXT
parent::DB_Sql("SET sql_mode = 'TRADITIONAL'");
ändern.
Referenz:
Mysql-Server sql_modeZITAT
(Quelle: MySQL - The definitive guide to using, programming, and administrating MySQL 4.1 and 5.0 (ISBN: 0-672-32673-6))
Dieses Buch betrachtet MySQL nur bis Version 4.1.9 und 5.0.3
Achtung dieser Befehl ist grundsätzlich
nicht für alle SF-Installationen (beachte Mysql-Version) gedacht sondern nur in diesem Fall anzuwenden!
Gruß
P.S.: habs zwar getestet gebe aber keine Garantie ob das auf deinem Server auch erlaubt ist zu ändern!