Problem mit Timeout[geloest]

  • Themenstarter Themenstarter sw33tlull4by
  • Beginndatum Beginndatum
S

sw33tlull4by

Guest
Hi!
Ich habe ein Skript was Daten aus einer Mysqldatenbank ausliest, den Table leoscht und neu erstellt, die ergebnisse in einen Array schreibt, diesen in $_SESSION speichert und dann auf eingaben vom Benutzer wartet.
Problem damit ist nur das alle Eintraege im Array nach Moeglichkeit auch wieder in den neuen Table kommen sollen, nachdem sie veraendert wurden/oder auch nicht.
Aber wenn der Benutzer aus welchem Grund auch immer nun keine Verbindung mehr bekommt liegen die Daten da im Array in $_SESSION und der Table ist gelockt.
Gibt es eine Moeglichkeit in dieser Situation,also einem Event-getriggertem Skript,einen Timeout zu erkennne und entsprechende Aktionen einzuleiten?
set_time_limit() kenn ich zwar aber das ist in diesem fall nicht hilfreich.
mfg

sw33t
 
Da ich nicht hellsehen kann, kann ich nur vermuten:

set_time_limit() setzt lediglich die maximale Ausführungszeit deines Scriptes. Dein Problem wird ehr die Session-Dauer sein.

Gegenfrage: Du dropst jedes mal den kompletten Table? Wo steckt da der Sinn? Wozu gibt es denn die UPDATE-Funktion?...
Was genau steht in der Tabelle drin?
Wieviele Daten sind es, die da in der Session zwischengespeichert werden? (man sollte auch immer drauf achten, die Session nicht größer als nötig zu machen...)

Ich denke mal, die sinnvollere Lösung wäre in deinem Fall nicht das Heraufsetzen der Session-Zeit, sondern das komplette Überdenken deiner Vorgehensweise?!
 
Aber wenn der Benutzer aus welchem Grund auch immer nun keine Verbindung mehr bekommt liegen die Daten da im Array in $_SESSION und der Table ist gelockt.

Lockst du den selbst oder glaubst du nur dass er gelockt ist?

beavisbee ist prinzipiell nichts mehr hinzuzufügen. Was man natürlich trotzdem machen könnte ist die Daten sobald sie in das Array kommen auch irgendwo anders zwischenzuspeichern, so dass auch ein anderes Script jederzeit (später noch) zugreifen kann. Beispielsweise /tmp/file oder einfach eine temporäre Tabelle. Macht aber in deinem Fall sicher wenig Sinn.
 
Das Problem dabei ist folgendes:
1.Der Benutzer erstellt den Inhalt
2.Es muss auch moeglich sein den Inhalt zu loeschen
3.Der gesamte inhalt muss veraenderbar sein

Das positive dabei, die Tables die ich droppe und erstelle sind nicht besonders gross, ca 20-40 Eintraege maximal.

Punkt 2 macht es extrem schwer id's zu fuehren, ich muesste extrem viel aufwand betreiben, nur um die ids im Auge zu behalte.
Punkt3 verhindert praktisch das ich die updatefunktion einsetzen kann, da ich nicht weiss was oder wo geaendert wird.

Da das einfuegen und veraendern und auslesen von eintraegen in 3 verschiedenen Skripten statt findet, welche redundanz so weit wie moeglich unterbinden, kann ich auch nicht ohne weiteres eine Query abschicken und dann jeweils nur das aktuelle element entfernen.
Letzteres wollte ich eigentlich nicht machen, da ich einiges umstellen muss, aber wie es scheint habe ich keine andere wahl.
Es behebt aber nicht das Problem mit dem Lock.
Vielen dank
mfg

sw33t

//edit:
Der Benutzer lockt den Table
 
schreib mal bitte, was genau du überhaupt vor hast... (incl. Sinn und Struktur deiner Tabellen etc.) ich versteh noch immer nicht, warum du unbedingt komplette Table dropst...

Was genau bringt dir das in deinem konkreten Fall für Vorteile gegenüber reinen UPDATE, INSERT und DELETE Querries?
 
Also folgendes:
2 Benutzergruppen:
1.greift nur lesen auf den Inhalt zu , kein Problem
2. erstellt, editiert den Inhalt,hier ist mein Problem.
Der Inhalt der Eintraege des Tables werden in ein HTML-Dokument geparst.
Die Eintraege bestehen aus 3 Feldern.
Typen:LongText LongText Text
Im Ersten steht nur text, im 2. ist ein serialisierter Array, von variabler Laenge,gespeichert und im 3 normaler Text.

Die Anzahl der Eintraege pro Table koennen variieren.
Ich koennte nun sagen:ich spendiere den Eintraegen eine zusaetzlichen Eintrag,was in meinem Konzept nicht vorgesehen war.
Dann haette ich das Problem wenn die Eintraege geloescht werden das bei meinetwegen 5 Eintraegen, ich trotzdem bei 8 anfangen muss weil 2 geloescht wurden und die IDs 6 und 7 nicht eindeutig sind.
Das im Auge zu behalten bedarf eines grossen Aufwandes,, und einfach raufzaehlen ist zwar ne Moeglichkeit,Problem dabei ist nur das ich nicht weiss wie viele Eintraege vorgenommen werden(sollten zwar nicht zuviele sein aber,ich sehe die Moeglichkeit trotzdem nicht gerne,obwohl es die Alternative mit den wenigsten aenderungen ist)

Die Update-Funktion von mysql nuetzt mir nichts, da alle Eintraege frei veraenderbar sein muessen und die ID im schlimmsten fall nicht eindeutig ist.
Delete ist in sofern schwierig, als das ich meinen ganzen Code umschreiben muss da in Skript 1 alle eintraege aus einem Table gesichert werden, in Skript 2 werden die Eintraege erstellt/bearbeitet und in Skript 3 wird alles eingefuegt.
Diese Situation macht es sehr schwirieg einzelne Eintraege zu loeschen.

Mit Insert an sich habe ich keine Probleme, nur damit das dann einige Sachen doppelt drin stehen, bzw einmal vor der Modifikation und einmal danach.
Das ist auch der grund wiso ich den ganzen table droppe, um doppelte Eintraege zu vermeiden.

Und wie schon gesagt, mein problem ist ja nicht meine Vorgehensweise, sondern nur die spezielle Konstellation das evtl ein Verbindungsabbruch erfolgt und dann alle Eintraege eines Tables weg sind.
mfg

sw33t



//edit:
ich glaub ich hab eine Loesung, ich muss mich erst daran gewoehnen das eine query die Datensaetze praktisch dupliziert,und das was $mysql_session->query() zurrueckt gibt, eigentlich nur eine Kopie der Daten ist.(wenn es sich dabei um query("select * from table") handelt,danke beavisbee)
Pseudocode(bitte berichtigen wenn falsch):
Speichere query in $_SESSION
hole ersten eintrag aus query und speichere 1.Element in $_SESSION
editiere Eintrag
Identifiziere editierten Eintrag mittels gespeichertem 1.Element in $_SESSION und fuehre update aus.
 
Original von sw33tlull4by
Also folgendes:
2 Benutzergruppen:
1.greift nur lesen auf den Inhalt zu , kein Problem
2. erstellt, editiert den Inhalt,hier ist mein Problem.

Der Inhalt der Eintraege des Tables werden in ein HTML-Dokument geparst.

klingt, als wolltest du ein ContentManagementSystem coden.
Deinen Aussagen entnehme ich aber, dass du mit Datenbanken nicht so wirklich vertraut bist.

Daher: hast du mal geschaut, ob es nicht schon ein CMS gibt, was deine Anforderungen erfüllt?

http://www.cmsmatrix.org/



Original von sw33tlull4by
Die Eintraege bestehen aus 3 Feldern.
Typen:LongText LongText Text
Im Ersten steht nur text, im 2. ist ein serialisierter Array, von variabler Laenge,gespeichert und im 3 normaler Text.
kein Primary Key drin?
außerdem: ein serialisiertes Array ist, genau wie eine Komma-separierte Liste, nicht so wirklich toller Stil.
Wozu genau brauchst du das unbedingt so?



Original von sw33tlull4by
Dann haette ich das Problem wenn die Eintraege geloescht werden das bei meinetwegen 5 Eintraegen, ich trotzdem bei 8 anfangen muss weil 2 geloescht wurden und die IDs 6 und 7 nicht eindeutig sind.
Das im Auge zu behalten bedarf eines grossen Aufwandes,

Wo hast du da Aufwand?
du erstellst einfach ein Feld, vom Typ Integer, als Primärschlüssel und der Option auto_increment.


Original von sw33tlull4by
Die Update-Funktion von mysql nuetzt mir nichts, da alle Eintraege frei veraenderbar sein muessen und die ID im schlimmsten fall nicht eindeutig ist.

was verstehst du unter "frei veränderbar sein"... und die IDs wären eindeutig, wenn du einen Primärschlüssel verwendest und noch dazu diesen auf auto_inc stellst.


Original von sw33tlull4by
Delete ist in sofern schwierig, als das ich meinen ganzen Code umschreiben muss da in Skript 1 alle eintraege aus einem Table gesichert werden, in Skript 2 werden die Eintraege erstellt/bearbeitet und in Skript 3 wird alles eingefuegt.
Diese Situation macht es sehr schwirieg einzelne Eintraege zu loeschen.

oooookay... da ich noch immer nicht genau weiß, was genau du wo speicherst, löschst, etc. komm ich da nicht ganz nach.

Aber das, was du vorhast, ist echt eine Vergewaltigung der Datenbank.
Da schreib's lieber nochmal neu.



Original von sw33tlull4by
Mit Insert an sich habe ich keine Probleme, nur damit das dann einige Sachen doppelt drin stehen, bzw einmal vor der Modifikation und einmal danach.
Das ist auch der grund wiso ich den ganzen table droppe, um doppelte Eintraege zu vermeiden.

Neue Inhalte mit INSERT, bearbeiten mit UPDATE, da ist dann doch nix doppelt drin?!



Original von sw33tlull4by
Und wie schon gesagt, mein problem ist ja nicht meine Vorgehensweise, sondern nur die spezielle Konstellation das evtl ein Verbindungsabbruch erfolgt und dann alle Eintraege eines Tables weg sind.

das Problem löst sich, wenn du mit der Datenbank sauber umgehst....



Original von sw33tlull4by
//edit:
ich glaub ich hab eine Loesung, ich muss mich erst daran gewoehnen das eine query die Datensaetze praktisch dupliziert,und das was $mysql_session->query() zurrueckt gibt, eigentlich nur eine Kopie der Daten ist.

What???
Eine Query dupliziert keine Datensätze, sondern macht das, was du in der Query sagst.... INSERT fügt freilich was neues ein, UPDATE bearbeitet einen oder mehrere bestehende Beiträge, je nachdem, wieviele Datensätze auf die WHERE-Klausel zutreffen, etc.



Fazit: beschäftige dich erstmal ausführlich mit dem Thema Datenbanken (relationale Datenbanken, DBMS, Normalisierung von Datenbanken - also die verschiedenen Normalformen, etc.)
 
ja, ich bin recht unerfahren mit Datenbanken.
So wusste ich zB nicht das man ein Feld auf automatisch,vom DatenbankManagmentSystem, erhoehen lassen kann.
Und ja, ich glaube man kann meine herangehensweise als Vergewaltigung bezeichnen, denn ich benutze die Datenbank nur als Container mit zugriffsrechten.

Den (serialisierten)Array brauche ich, weil die HTMLseite dynamisch auf den Inhalt und die Anzahl der eintraege reagiert, und da bietet es sich ja an mittels foreach ueber den Array zu iterieren.
Unabhaengig davon, was waere eine alternative zu einem serialisierten Array,sprich besser als eine Komma-seperierte Liste?

Meine Aussage mit query war etwas unsauber formuliert.
Ich meinte eine Query mit "select * from table" gibt eine Kopie der Datensaetze im Table zurrueck und veraenderungen an den Daten betreffenden Table nicht und genau an diesen Aspekt habe ich gar nicht gedacht als du update erwaehnt hast.

Ueber das nochmal schreiben denke ich ernsthaft nach, aber erst nach etwas mehr theorie,bis dahin behalte ich erstmal das bei(notgedrungen).
Vielen dank fuer die Hilfe und die Kritik.
mfg

sw33t

//edit
Aus der art und weise wie die Diskussion hier gelaufen ist schlisse ich mal das es in meinem Fall keine moeglichkeit gibt einen Timeout in php zu erkennen.
(bitte berichtigen falls falsch)
 
Original von sw33tlull4by
Und ja, ich glaube man kann meine herangehensweise als Vergewaltigung bezeichnen, denn ich benutze die Datenbank nur als Container mit zugriffsrechten.

Einsicht ist der erste Weg zur Besserung... ;-)


Original von sw33tlull4by
Den (serialisierten)Array brauche ich, weil die HTMLseite dynamisch auf den Inhalt und die Anzahl der eintraege reagiert, und da bietet es sich ja an mittels foreach ueber den Array zu iterieren.
Unabhaengig davon, was waere eine alternative zu einem serialisierten Array,sprich besser als eine Komma-seperierte Liste?

Um was für ein Array handelt es sich denn?
Einfach quasi als Liste, nur mit Zahlen-Indizes, oder verschiedene Inhalte mit assoziativem Array ($daten["title"]="Blub"; $daten["text"]="blablabla"; )

Wenn's nur ne Liste ist, dann lös das einfach über ne zweite Tabelle:
id (int, primary_key, autoincrement)
owner (int, hier drin steht die ID von dem Element, zu dem es gehört. dieses Feld wird auch Fremdschlüssel, oder englisch: foreign key, genannt.)
daten (text / int / was immer da an Daten rein muss)


Original von sw33tlull4by
Meine Aussage mit query war etwas unsauber formuliert.
Ich meinte eine Query mit "select * from table" gibt eine Kopie der Datensaetze im Table zurrueck und veraenderungen an den Daten betreffenden Table nicht und genau an diesen Aspekt habe ich gar nicht gedacht als du update erwaehnt hast.

genau. du bekommst ein Abbild der Daten zurück, die du angefordert hast, veränderte Daten kommen dann mit UPDATE-Queries wieder in die Datenbank.

Du kannst mit SELECT-Querries sogar Daten ausgeben, die gar nicht in der Tabelle stehen, Statistik-Funktionen, Gruppierungen, Berechnungen, Daten aus anderen Tabellen (Stichwort JOINs)

Wenn du willst, das Daten direkt in der Datenbank geändert werden, wenn die Daten geändert werden, dann solltest du dich mal mit ORM - objekt-relationalem Mapping - beschäftigen.

Hier gibt es eine Manager-Klasse, welche Zugriffe auf die Tabelle managed und persistente Objekte, welche genau einen Datensatz darstellen.

Aber mit solchen Themen solltest du dich erst beschäftigen, wenn du an sich weißt, wie genau Datenbanken so funktionieren.



Original von sw33tlull4by
Aus der art und weise wie die Diskussion hier gelaufen ist schlisse ich mal das es in meinem Fall keine moeglichkeit gibt einen Timeout in php zu erkennen.
(bitte berichtigen falls falsch)

Dazu musst du einfach nur das Thema Sessions verstehen...
Du startest eine Session, dabei wird eine SessionID erzeugt, über welche die Session eindeutig identifizierbar ist.
Auf dem Server liegt dann eine Datei, welche alle Daten der Session speichert.
Clientseitig wird diese ID meist in einem Cookie gespeichert.

Wenn auf eine Datei innerhalb einer bestimmten Zeit (eben dem Session-TimeOut) nicht zugegriffen wird, dann wird diese gelöscht und die Session ist damit weg. Die Daten sind demzufolge dann pfutsch.
 
Zurück
Oben