|
|
|
 |
Wissen ist Machtnix wissen macht auch nix |
 |
SQL-OpenManager + SQL-ERRORlogger
800XE 11.2.2009 21:48
Bei größeren Projecten kommt der Zeitpunkt, das mehrere Datenbanken(nicht Tabellen) verwendet werden. Und dann kommt irgendwann der Fall das eine schon geöffnete Datanbank nicht mehr aktuel(aktiviert) ist, weil zwischendrin eine Routine eine Andere Datenbank geöffnet hat.
Ich hatte diese Situation. Erst umging ich das Problem dadurch, das ich einfach die Datenbanken nochmals öffnete. SQL denkt da mit und gibt einfach die alte "Kennung" zurück; das wuste ich wohl damals noch nicht, als ich mir einen "Mitdenker" programmierte.
Aber auch wenn es nicht nötig ist, so ist es besser, den jetzt habe ich überall nur einen 1Zeiler und keinen 3 bzw 4Zeiler.
Später hat sich dann noch ein Logbuch-Schreiber dazugesellt.
Am Anfang die Datei mit den SQL-Zugangsdaten in z.B. ini.php <?php /********************************************************************** * © Andy Zmuda ··· CMS800 ··· 800XE.NETwork * * ini.php ********************************************************************** * globale Informationen, die von allen Scripten geincludet werden **********************************************************************/ $_CMS800sql['counter']='3';
$_CMS800sql['line'][1]='0'; $_CMS800sql['host'][1]='localhost'; $_CMS800sql['user'][1]='web123'; $_CMS800sql['pass'][1]='geheim1'; $_CMS800sql['base'][1]='usr_web123_1'; $_CMS800sql['name'][1]='#base1';
$_CMS800sql['line'][2]='0'; $_CMS800sql['host'][2]='localhost'; $_CMS800sql['user'][2]='web123'; $_CMS800sql['pass'][2]='geheim2'; $_CMS800sql['base'][2]='usr_web123_2'; $_CMS800sql['name'][2]='#base2';
$_CMS800sql['line'][3]='0'; $_CMS800sql['host'][3]='localhost'; $_CMS800sql['user'][3]='web123'; $_CMS800sql['pass'][3]='geheim3'; $_CMS800sql['base'][3]='usr_web123_3'; $_CMS800sql['name'][3]='#base3'; ?>
[size=large]CMS800sql[][/size]
Die Variablen "Host, User, Pass und Base" sind die die sonst auch verwendung finden.
"Line" ist intern, dort wird die SQL-Kennung abgespeichert wenn die Datenbank geöffnet wurde.
"Counter" ist ein Zähler wieviele Datenbanken vorhanden sind bzw wieviele der Angegebenen genutzt werden sollen bzw dürfen. Wird im Beispiel oben der COunter von 3 auf 2 geändert, dann ist Datenbank 3 nichtmehr nutzbar; Auser sie wird auf dem herkömmlichen Wege geöffnet.
"Name" ist eine Alternative zum 1 2 3.
Also, im Gästebuch.php könnte auch ein CMS800sql( 'open',0,'#gBook' ) stehen.
[size=large]SQL-ERRORlogger[/size]
mysql_query( $query ) or die( $query, mysql_error() );
$query ist wie der Name ja sagt, ich habe mir angewöhnt den Query vorher in eine $Variable "aufzubauen", damit ich es im "or die" wiederverwenden kann.
$error ist die $Variable für die Meldung vom mysql_error() Befehl.
$path ist optional; benötigt, wenn unterschiedliche /ordner/datei.php Requestet werden;
Also, wenn die ausgeführten Scripte in unterschiedlichen /Ordnern/ liegen, dann kann(muß) damit der Pfad zur Logbuchdatei "korrigiert" werden.
Diese 2 Strings und eine Datum+Uhrzeit Info werden dann in die Datei geschrieben. Zwischen die Informationen kommt noch ein "Trennstring" damit es möglich ist mit einem Script das Logbuch auszulesen
Ich überlege noch, ob und inwieweit es möglich ist, zusätzlich noch den genauen Ort des fehlerhaften Querys ins Logbuch zu schreiben.
[size=large]CMS800sql[/size]
$do ist "(re)open", "close(all)" oder "info". Open und close dürfte klar sein; wobei das Script ja mitdenkt und einen "open" nur dann durchführt wenn die Datenbank laut Informationen noch nicht geöffnet ist.
"reopen" öffnet die Datenbank auch wenn sie laut Information schon geöffnet ist. Also wenn im "Line" eine Kennung vorhanden ist; reopen ist dafür da, fals ein frendes Script die Datenbank geschloßen hat.
"Info" liest die Informationen aus und gibt einen Text zurück.
<?php
include('../cms800/cms800ini.php');
/********************************************************************** * SQL-ERRORlogger © Andy Zmuda ··· CMS800 ··· 800XE.NETwork * * cms800Database.php ********************************************************************** * abfangen von "or die(mysql_error());" * und in Textdatei protokollieren * * $errorloger=0; = kein Protokoll = Debug=off **********************************************************************/ function CMS800sqlERROR( $query, $error, $path='' ) { $file='CMS800sqlERROR.txt'; $errorloger=1; $errorlog ="\n".date( 'd.m.Y·H·i·s·' ); $errorlog.="\n»»»CMS800sqlERROR»»»\n".$query; $errorlog.="\n»»»CMS800sqlERROR»»»\n".$error; if ( $errorloger ) { $handle=fopen($path.$file,'ab'); fwrite($handle,$errorlog."\n\n"); fclose($handle); } echo('<hr>'.nl2br($errorlog)); } /********************************************************************** * SQL-OpenManager © Andy Zmuda ··· CMS800 ··· 800XE.NETwork * * cms800Database.php ********************************************************************** * Management Modul zum kontrolierten öffnen und schließen von SQL-DBs ********************************************************************** * open | reopen = öffnen * close | closeall = schließen * * $sql = die DBnummer laut ini.php * $base = alterative zur DBnummer **********************************************************************/ function CMS800sql( $do, // action = open or close $sql=1, // DBnummer $base='' // DBname ) { global $_CMS800sql;
if ( $base ) { $sql=$i=0; while( !$sql && $i++<$_CMS800sql['counter'] ) { if ( !strcmp($base,$_CMS800sql['base'][$i]) ) $sql=$i; } } if ( $do=='info' ) { $i=0;$info=$NL=''; while( $i++<$_CMS800sql['counter'] ) { $info.=$NL.$i.'·'.$_CMS800sql['line'][$i].'·'.$_CMS800sql['name'][$i];$NL="\n"; } return($info); } elseif ( $do=='close' ) { if ( $_CMS800sql['line'][$sql] ) mysql_close($_CMS800sql['line'][$sql]); $_CMS800sql['line'][$sql]=0; } elseif ( $do=='closeall' ) { $i=0; while( $i++<$_CMS800sql['counter'] ) { if ( $_CMS800sql['line'][$i] ) mysql_close($_CMS800sql['line'][$i]); $_CMS800sql['line'][$i]=0; } } else { if ( $do=='reopen' || !$_CMS800sql['line'][$sql] ) { $_CMS800sql['line'][$sql] = mysql_connect($_CMS800sql['host'][$sql], $_CMS800sql['user'][$sql], $_CMS800sql['pass'][$sql]) or die(CMS800sqlERROR("Keine Verbindung möglich: ",mysql_error())); } mysql_select_db($_CMS800sql['base'][$sql]) or die(CMS800sqlERROR("Auswahl der Datenbank fehlgeschlagen",mysql_error())); return($_CMS800sql['line'][$sql]); } }
?>
Kommen wir zur Anwendung:
Den folgenden Code einfach in der cms800Database.php anhängen
Ich habe hier das "or die" ohne den "die". War ein Test, dachte die ganze Zeit der wäre nötig. Doch er ist nicht nötig, er ist ein exit() nach Ausgabe der Fehlermeldung. Ohne "die" läuft das Script weiter, höchstwahrscheinlich fehlerhaft.
$db=CMS800sql('open',$sql=1,$base=''); echo('<hr>'.nl2br(CMS800sql('info')));
$query = " SELECT * FROM $tabele"; $query .= " LIMIT 3"; $result= mysql_query($query) or CMS800sqlERROR($query,mysql_error()); while( $line= mysql_fetch_array($result, MYSQL_ASSOC)) { echo('<br>'.$line['titel']); }
$db=CMS800sql('close'); echo('<hr>'.nl2br(CMS800sql('info')));
echo('<hr><hr><hr>'.file_get_contents('CMS800sqlERROR.txt'));
Beitrag kommentieren:
|
|
Gast ····
···· Bookmark @
|