- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 01-12-2003, 23:16
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard MySQL - Synchronisation

folgendes: ich habe einen datensatz von user1

user1 kann diesen nun abrufen und ändern
genauso könnte aber user2 diese daten (teilweise) abrufen und ändern

wie verhindere ich nun das zb user2 einen teil der daten ändert, dann user1 die daten lädt und dann user2 den rest der daten ändert, so dass user1 teilweise veraltete daten erhalten hätte

ich hab eine funktion, um ne datensatz abzurufen und eine um den datensatz upzudaten

wenn php immer ne ganze funtkion durchläuft bevor es was anderes macht müsste das problem ja gelöst sein (hoffe ich), was aber wenn php im time sharing modus arbeitet (ka wie php den code mehrerer user abarbeitet) und jetzt einen teil für user1 abarbeitet dann nen teil für user2 und dann den rest für user1 ?

hoffe ihr versteht mein problem
Mit Zitat antworten
  #2 (permalink)  
Alt 01-12-2003, 23:22
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

beim updaten ein LOCK TABLES machen.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |



Geändert von Abraxax (01-12-2003 um 23:26 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 02-12-2003, 08:36
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

naja im prinzip net schlecht aber vielleicht nicht so ganz das was ich brauche, weil damit sperre ich ja ne ganze tabelle, mir reicht es wenn ich nur eine zeile (also alle daten einen benutzers) WHERE ID=$user_id sperre

ausserdem weiss ich (hab mir deinen link durchgelesen) net, was ich mache wenn die tabelle nun LOCKED ist und nen anderer prozess versucht drauf zuzugreifen, gibt das ne bestimmte fehlermeldung die man abfangen kann, so dass ich ne schleife um die abfrage bauen kann die solange läuft bis die tabelle nicht mehr gesperrt ist oder ein zeitlimit erreicht wurde ?
Mit Zitat antworten
  #4 (permalink)  
Alt 02-12-2003, 08:37
goth
  Moderator
Links : Onlinestatus : goth ist offline
Registriert seit: Mar 2002
Ort: Erde
Beiträge: 7.242
goth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dann mußt Du Dir halt 'nen InnoDB Handler installieren ... und den Datensatz mit einem
Code:
SELECT ... FOR UPDATE
sperren ...
__________________
carpe noctem

Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht!
Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung!

http://www.mysqldiff.org
Mit Zitat antworten
  #5 (permalink)  
Alt 02-12-2003, 16:19
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

müsste dann auf dem server meiner page installiert sein, da hab ich wohl keinen einfluss drauf ...
Mit Zitat antworten
  #6 (permalink)  
Alt 02-12-2003, 16:22
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.621
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

und was machst du jetzt?
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #7 (permalink)  
Alt 02-12-2003, 17:39
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

- gelöscht aktuelles siehe unten

Geändert von sEeb (02-12-2003 um 22:18 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 02-12-2003, 18:06
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

- nochmal gelöscht aktuelles siehe unten

Geändert von sEeb (02-12-2003 um 22:18 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 02-12-2003, 19:32
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

alle guten dinge sind drei

hier die fertigen funktionen
sry das ich jetzt so oft hintereinander gepostet hab, aber jetzt habt ihr zwei funktionen die was bringen
wie gesagt wenn ihr mir zustimmt das sie gut sind, poste ich sie im codeschnipsel bereich

PHP-Code:


    
// grundgerüst zum ändern von daten aus einer DB
    // beim starten der funtkion wird die entsprechende zeile (der datensatz) des users gesperrt
    // beim verlassen könnenn andere wieder drauf zugreifen
    //
    // DB-Werte
    //
    // changing werte: 
    //  0 wird nicht bearbeitet, datensatz kann abgerufen, verwendet werden
    //  1 wird gerade bearbeitet
    //
    // changed werte:
    //  0 datensatz wurde nicht geändert
    //  1 datensatz wurde geändert
    //
    // parameter
    // $id  id des datensatzes
    // $table name der zu ändernden tabelle als string "name"
    // $request spalten die geändert werden sollen, als string durch kommas getrennt ( "spalte1, spalte2, spalte3")
    //
    
function getDB($id$table$request) {
        global 
$db_name$db_login$db_pass$einstellung;

        
$ret_val "";
    
        
// anzahl bisheriger mitspieler herausfinden
        
$link mysql_connect$db_name$db_login$db_pass)
            or die (
"Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
        
$select_db mysql_select_db "finalwar"$link )
            or die (
"Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");
        
        
// ä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)
                die (
"Zeitüberschreitung der Anfrage. Bitte später nocheinmal versuchen. Sollte dieser Fehler öfters auftreten, bei einem Admin melden");

            
// ändern anmelden, wenn möglich
            
$query "UPDATE $table SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";
            
$result mysql_query($query$link)
                    or die (
"Datenabruf kann nicht initialisiert werden: ".mysql_error());

        }while( !
mysql_affected_rows($link) );

        
// wurden die daten geändert?
        
$query "SELECT changed FROM $table WHERE ID='$id' LIMIT 1";        
        
$result mysql_query($query$link)
                or die (
"Datenabruf kann nicht initialisiert werden: ".mysql_error());
        
$object mysql_fetch_object($result);
        
        if (
$object->changed) {
            
$query "SELECT ".$request." FROM $table WHERE ID='$id' LIMIT 1";        
            
$result mysql_query($query$link)
                    or die (
"Datenabruf kann nicht ausgeführt werden: ".mysql_error());
            
$ret_val mysql_fetch_object($result);
        }

        
// fertig, datensatz freigeben
        
$query "UPDATE $table SET changing=0, changed=0 WHERE ID=$id LIMIT 1";
        
$result mysql_query($query$link)
                or die (
"Fehler beim Verlassen einer DB-Funtkion, unbedingt einem Admin melden: ".mysql_error());

        
mysql_close($link);

        return 
$ret_val;        
    }






    
// grundgerüst zum abrufen von daten aus einer DB
    // beim starten der funtkion wird die entsprechende zeile (der datensatz) des users gesperrt
    // beim verlassen könnenn andere wieder drauf zugreifen
    //
    // DB-Werte
    //
    // changing werte: 
    //  0 wird nicht bearbeitet, datensatz kann abgerufen, verwendet werden
    //  1 wird gerade bearbeitet
    //
    // changed werte:
    //  0 datensatz wurde nicht geändert
    //  1 datensatz wurde geändert
    // parameter
    // $id  id des datensatzes
    // $table name der zu ändernden tabelle als string "name"
    // $changes spalten die geändert werden sollen, als string "spalte1=neue daten, spalte2=neue daten, spalte3=neue daten";
    
function setDB($id$table$changes) {
        global 
$db_name$db_login$db_pass$einstellung;
    
        
// anzahl bisheriger mitspieler herausfinden
        
$link mysql_connect$db_name$db_login$db_pass)
            or die (
"Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden");
        
$select_db mysql_select_db "finalwar"$link )
            or die (
"Die Datenbank wurde nicht gefunden. Wenden sie sich an den Admin");    
        
        
// ä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)
                die (
"Zeitüberschreitung der Anfrage. Bitte später nocheinmal versuchen. Sollte dieser Fehler öfters auftreten, bei einem Admin melden");

            
// ändern anmelden, wenn möglich
            
$query "UPDATE $table SET changing=1 WHERE ID='$id' AND changing=0 LIMIT 1";        
            
$result mysql_query($query$link)
                    or die (
"Datenänderung kann nicht initialisiert werden: ".mysql_error());

        }while( !
mysql_affected_rows($link) );

        
// daten ändern
        
$query "UPDATE $table SET ".$changes." WHERE ID='$id' LIMIT 1";
        
$result mysql_query($query$link)
                or die (
"Datenänderung kann nicht ausgeführt werden: ".mysql_error());
        
        
// fertig, datensatz freigeben
        
$query "UPDATE $table SET changing=0, changed=1 WHERE ID=$id LIMIT 1";
        
$result mysql_query($query$link)
                or die (
"Fehler beim Verlassen einer DB-Funtkion, unbedingt einem Admin melden: ".mysql_error());

        
mysql_close($link);    
    } 

Geändert von sEeb (02-12-2003 um 22:19 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

EM 2012 Tipp-Spiel ansehen EM 2012 Tipp-Spiel

Online Tipp-Spiel zur Fussball Europameisterschaft 2012, basierend auf php-Script mit hinterlegter mySql-Datenbank

27.05.2012 tippimnetz | Kategorie: PHP/ Spiele
Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:02 Uhr.