Hallo,
ich habe leider nichts vergleichbares gefunden. Sollten es soetwas bereits in Scriptform geben, würde ich mich freuen, wenn mir jemand die Adresse verrät.
Worum geht es?
Ich habe mir zwei Routinen geschrieben, die das Öffnen und Schließen meiner Datenbank vornehmen, damit man sich in allen anderen Funktionen schreibarbeit spart. Nebenher sollen die Routinen gewisse Datensätze noch manuell blockieren, damit auf diese nicht zugegriffen werden kann, wenn sie bearbeitet werden.
Leider treten hin und wieder folgende Probleme auf:
1. Ich rufe connectDB() auf und hinterher funktioniert mein mysql_query() nicht, weil scheinbar die $link VAriable nicht mehr richtig gesetzt ist (also ein Wert steht schon drin und der query ist 100% richtig, habs im phpMyAdmin getestet, nur der link scheint, vielleicht durch ein vorheriges close nicht mehr brauchbar zu sein.
2. vielleicht liegt dieses Problem auch daran, dass ich Funktionen und somit auch die connects und close geschachtelt aufrufe ...
3. Manchmal, wenn ich das connect bzw close mit dem PArameter $id aufrufe, kann close den Datensatz nicht schliessen, wieder selbes PRoblem wie in 1. beschrieben
Ich hoffe jemand hat eine Idee, wo das Problem liegen kann. Ich hab bereits den Tip bekommen, dass es daran liegen kann, das $link_db global ist, konnte damit jedoch nicht viel anfangen, weil ich nicht weiss was ich ändern könnte
ich habe leider nichts vergleichbares gefunden. Sollten es soetwas bereits in Scriptform geben, würde ich mich freuen, wenn mir jemand die Adresse verrät.
Worum geht es?
Ich habe mir zwei Routinen geschrieben, die das Öffnen und Schließen meiner Datenbank vornehmen, damit man sich in allen anderen Funktionen schreibarbeit spart. Nebenher sollen die Routinen gewisse Datensätze noch manuell blockieren, damit auf diese nicht zugegriffen werden kann, wenn sie bearbeitet werden.
Leider treten hin und wieder folgende Probleme auf:
1. Ich rufe connectDB() auf und hinterher funktioniert mein mysql_query() nicht, weil scheinbar die $link VAriable nicht mehr richtig gesetzt ist (also ein Wert steht schon drin und der query ist 100% richtig, habs im phpMyAdmin getestet, nur der link scheint, vielleicht durch ein vorheriges close nicht mehr brauchbar zu sein.
2. vielleicht liegt dieses Problem auch daran, dass ich Funktionen und somit auch die connects und close geschachtelt aufrufe ...
3. Manchmal, wenn ich das connect bzw close mit dem PArameter $id aufrufe, kann close den Datensatz nicht schliessen, wieder selbes PRoblem wie in 1. beschrieben
Ich hoffe jemand hat eine Idee, wo das Problem liegen kann. Ich hab bereits den Tip bekommen, dass es daran liegen kann, das $link_db global ist, konnte damit jedoch nicht viel anfangen, weil ich nicht weiss was ich ändern könnte
PHP-Code:
$count_db = 0;
$link_db = -1;
function connectDB($id = -1) {
global $db_table, $db_name, $db_login, $db_pass, $einstellung, $count_db, $link_db;
if (++$count_db > 1) {
return $link_db;
}
$link_db = @mysql_connect( $db_name, $db_login, $db_pass)
or die ("Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
$select_db = @mysql_select_db ( $db_table, $link_db )
or die ("Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");
if ($id != -1) {
// ändern anmelden beim eintritt in funktion
// wenn bereits geändert wird, warten bis der datensatz wieder verfügbar ist
// maximal 10 sekunden warten, dann abrechen und von einem Fehler ausgehen
$start = time();
do {
if (time() - $start > 10) {
$query = "SELECT couldnotload FROM spieler WHERE ID='$id' LIMIT 1";
$result = @mysql_query($query, $link_db)
or die ("Datenänderung kann nicht initialisiert werden: ".mysql_error());
$object = @mysql_fetch_object($result);
if($object->couldnotload >= 2) {
// bei zu vielen Versuchen Datensatz wieder freigeben
$query = "UPDATE spieler SET couldnotload=0, changing=0 WHERE ID='$id' LIMIT 1";
}
else {
$query = "UPDATE spieler SET couldnotload=couldnotload+1 WHERE ID='$id' LIMIT 1";
}
$result = @mysql_query($query, $link_db)
or die ("Datenänderung kann nicht initialisiert werden: ".mysql_error());
die ("Zeitüberschreitung der Anfrage. ");
}
// ändern anmelden, wenn möglich
$query = "UPDATE spieler SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";
$result = @mysql_query($query, $link_db)
or die ("Datenänderung kann nicht initialisiert werden: ".mysql_error());
}while( !@mysql_affected_rows($link_db) );
}
return $link_db;
}
function closeDB($link, $id = -1) {
global $connected, $count_db, $link_db;
if ($id != -1) {
$query = "UPDATE spieler SET changing=0 WHERE ID=$id LIMIT 1";
$result = mysql_query($query, $link_db)
or die(mysql_error()."dbC $count_db ".$GLOBALS["DIE1"].$id.$GLOBALS["DIE2"]);
}
if(--$count_db == 0) {
@mysql_close($link_db);
}
}
Kommentar