PHP SQL: connection or die

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Da ich mich mit Datenbanken bzw. MySQL noch nicht so gut auskenne "fange erst an", hätte ich da eine Frage an die Experten hier.

Ist es möglich wenn z.B. die Datenbank nicht erreichbar ist z.B. Wartung seitens Hoster usw., das man anstatt der typischen Fehlermeldung auf eine anderen Seite umleitet?

Meistens macht es ja eigentlich einfach so:

PHP:
   if (! ($this->db_link = mysql_connect($mysql_host, $mysql_user, $mysql_pass))) {
   die('Could not connect to database');
 }
//das ist jetzt nur ein Auszug aus einer meiner Klassen

Würde es funktionieren wenn ich hier anstatt die(); einen header setze und auf einer anderen Seite umleite? oder geht es wegen der System eigenen Fehlermeldung bzw. Warnings nicht?

Danke.
 
Klar geht das. Du bist der Programmierer und kannst entscheiden was passieren soll, wenn die Datenbank nicht erreichbar ist. Das die(); ist nur eine von vielen Möglichkeiten was man machen kann oder auch nicht.
 
Aha, Danke, ich dachte halt nur das es bei Datebanken eventuell andere Gesetze gibt, weil man sieht ja meistens in diversen Scripten immer nur ein die();.
Wie gesagt, ich fange mit der Materie erst an und es ist mir halt noch nicht alles klar.
 
Wenn du noch weiterleiten willst, kannst du zum Beispiel folgenden HTML-Befehl per PHP-Befehl (echo,print) ausgeben:

PHP:
echo("<meta http-equiv='refresh' content='5; URL=http://de.selfhtml.org/'>");

Nun wird der Besucher nach 5 Sekunden auf die Webseite http://de.selfhtml.org umgeleitet. Der Code ist von dieser Seite.

Viele Grüße
 
die() sagt dem Webserver nur, dass das Skript hier endet (bzw. "stirbt") und er nichts mehr weiter zu tun braucht. Wenn man das nicht will, muss man auch kein die() verwenden.
 
...und verhindert somit auch das der Fehler einem auf der Webseite ins Gesicht springt, und dann auch noch schön die Pfade anzeigt. Wenn man als Webmaster weiterleitet, die Seite ansurft und das sieht, dann weiß man ja was Sache ist, ich verstehe deshalb nicht warum viele Seite immer die Fehler jedem zu sehen geben? man kann das doch schön elegant auch mit einer Mail an der Webmaster machen damit man sofort weiß was los ist.

Verstehe manche Programmierer nicht :D
 
Hab es gerade ausprobiert. Funktioniert problemlos:

PHP:
@mysql_connect($host,$user,$pw) or header('Location: http://www.google.de');

Nahja, welche Seiten hast du denn angesehen? Wenn es um die Verarbeitung irgendwelchen Inhaltes geht und nur nebensächlich um die Datenverbindung ist's einfach unnötig.

Du bringst mich aber gerade auf die Idee für einen Skript:
Falls DB nicht erreichbar, einmalig (!) eine E-Mail an den Webmaster
Falls sie wieder NACH einem Abbruch erreichbar ist, eine neue E-Mail an den Webmaster (evtl. inkl. Ausfallzeit).
Ansonsten kriegst du ja eine Spam-Flut :-) Da die DB nicht erreichbar ist, muss man wohl hier auf das Dateisystem und kleine Text-Dateien setzen.

Was meinst du mit den Fehler sehen? Bei meinem CMS wäre hier grundsätzlich "Schluss" mit der Seite, also kann ich entweder einen Fehler zeigen oder eine andere Seite erscheinen lassen, wo drin steht das ein Fehler da ist ;-)
Oder das selbe mit einer Funktion die(report_error(5)) [5 = keine DB-Verbindung] und fertig das selbe kommt raus^^.
 
Zuletzt bearbeitet:
?
Wenn ich so durchs Web flitze sehe ich halt bei der einen oder anderen "auch größeren Seiten" hin und wieder WARNING! could not connect to database usw..... meistens immer ganz oben in einer Seite aber auch mal irgendwo auf der Seite. Und nach dieser Warning kommt dann diese die(blabla); die der Programmierer definiert hat.

Hast du sowas noch nie gesehen?

Und genau darum geht es mir, es passiert schon öfter das die Datenbank nicht erereichbar ist und dann gibt es halt bei vielen Seiten diese Fehlerausgaben zu sehen die aber nicht nötig sind "keine". Das ist 1. unprofesionell 2. unschön und 3. macht man es eventuellen Hackern leichter da er dann diverse Pfade sehen kann.

Dann leite ich doch jeden derartigen Fehler komplett auf einer Wartungsseite um und gut.

Ok, manchmal kann man den Header nicht normal senden weil manche Seiten hauptsächlich aus includes bestehen die in die index eingefügt werden, doch auch dafür gibt es eine Lösung, zwar nicht gerade schön aber stört niemanden ob_start();
Ergänzung ()

Oder die saubere Methode, man prüft am Anfang der index ob die Datenbanken erreichbar sind, wenn nicht -> Wartungsseite, wenn ja ... normal weiter parsen. Hat zwar auch einen Haken und zwar das dann nonstop beim surfen auf der Seite geprüft wird ob Datenbank erreichbar aber da finde ich bestimmt auch noch eine brauchbare Lösung.
 
Zuletzt bearbeitet:
nein.
Das ist ein falsch eingestelltes das error_reporting().

Wenn ein die() danach stehen würde und die Funktion sehr früh aufgerufen wurde, dann würde vermutlich gar nix unter dem Fehler stehen.
Ehrlich gesagt bin ich mir gerade gar nicht sicher, ob eine Fehlermeldung abgeschickt wird wenn ein or die() dahinter steht.

Ja es ist unprofessionel und ist mir bis dato nie bei großen *seriösen* Seiten aufgetaucht.
Durch meinen Ausführung ein @ vor dem Befehl zu setzen wird dafür sorgen, dass nie so ein Fehler ausgegeben wird (selbst wenn error_reporting(E_ALL) gesetzt ist.

In meinem CMS siehts etwas komplizierter aus, da ich u.U. mehrere verschiedene Datenbanken ansprechen muss.^^:
PHP:
<?php

$MySQL['count_connections'] = 0;

foreach($Config["MySQL"] AS $MySQL['Key'] => $MySQL['Connections']) {
	if($MySQL['Connections']['Status']) {
		$MySQL['count_connections']++;
		
		$MySQL["Connection"][$MySQL['Key']] = @mysql_connect($MySQL['Connections']["Host"],$MySQL['Connections']["User"],$MySQL['Connections']["Password"]) or die (report_error(1));
		$MySQL["Database"][$MySQL['Key']] = @mysql_select_db($MySQL['Connections']["Name"],$MySQL["Connection"][$MySQL['Key']]) or die (report_error(2)); 
		mysql_query('SET NAMES utf8');
		mysql_query("SET CHARACTER SET utf8");
		
		if($MySQL['count_connections'] == 1) {
			define('MYSQL_ADMIN_CONNECTION',$MySQL["Connection"][$MySQL['Key']]);
		}
	}
}

?>
 
Zuletzt bearbeitet:
Eagle-PsyX- schrieb:
Hab es gerade ausprobiert. Funktioniert problemlos:

PHP:
@mysql_connect($host,$user,$pw) or header('Location: http://www.google.de');

hui.. schlechte idee das so zu machen!

der header-aufruf terminiert die ausführung nämlich nicht. ein anschließendes die() ist hier dringend geboten!
 
Die Fehlermeldungen habe ich im Live-Betrieb immer deaktiviert. ;)

Wenn man meta-refresh und die() kombiniert sollte doch alles abgedeckt sein. :freaky:
PHP:
// Alle Fehler ausblenden
error_reporting(0);
ini_set("display_errors", 0);

if(!($this->db_link = mysql_connect($mysql_host, $mysql_user, $mysql_pass))) {
    die("<meta http-equiv=\"refresh\" content=\"5; URL=http://de.selfhtml.org/\">
<pre>Connection to the database server couldn't be made.\nMySQL-Error: <i>".mysql_error()."</i></pre>");
}
 
IceMatrix schrieb:
hui.. schlechte idee das so zu machen!
der header-aufruf terminiert die ausführung nämlich nicht. ein anschließendes die() ist hier dringend geboten!
Es ist ein Beispiel.

PHP:
$sql = @mysql_connect($host,$user,$pw);
if($sql) {
*/ Weiter normaler betrieb */
} else {
 header('Location: http://www.google.de');
 die();
}
r15ch13's Variante lässt sich ja auch kombinieren, falls der Klient nicht auf den Header hört^^.

Der Grund wieso dir das Nicht-Abbrechen nicht gefiehl, ist weil vermutlich weil du mit folgenden Befehlen/Daten aus der Datenbank ausgehst. Da hast du zwar recht, sofern aber auch nur keine interne Prüfung vor dem Aufruf jeglicher abhängigen Funktion aufgerufen wird.
Du kannst natürlich auch nach dem verschickten Header den Skript abbrechen - widerspricht sich ja nicht. Interessiert den Klienten zwar nicht, der Parser sollte aber abbrechen.
 
Zuletzt bearbeitet:
Zurück
Oben