• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Muss Datenbank explizit gesperrt werden

FreddyS

Neues Mitglied
Ich habe eine grundsätzliche Frage, hoffe, jemand kann mir helfen.

Ich möchte dem Anwender eine Suchfunktion zur Verfügung stellen, die folgendermassen ablaufen soll:

1.Schritt: Anwender gib t Suchkriterien ein
2.Schritt: Ich selektiere die Datensätze, auf die die Suchkriterien zutreffen, aus verschiedenen Datenbanken und gebe diese in eine Zwischendatei aus
3.Schritt: Ich lese die Zwischendatei ein und gebe die Informationen aus.

Bei einem Anwender kein Problem, aber was ist, wenn mehrere User gleichzeitig die Suchfunktion aufrufen.

Ist die DB (Zwischendatei) gesperrt, bis ein Suchvorgang abgeschlossen und die Informationen ausgegeben sind oder muss ich hier explizit etwas tun (wenn ja was), damit die Daten nicht vermischt werden.

Ich wäre sehr dankbar, wenn mir hier jemand grundsätzlcih weiterhelfen könnte; besten Dank schon jetzt
 
Wieos eine Zwischenspeicherung in einer Datei? Kannst du die Daten nicht schon aufbereitet in einem Array ablegen? Weil dann kannst du dir dieses Thema und auch einen zwischenschritt sparen :D
 
hallo gilles, danke

dann müsste ich das ergebnis der selektion (1:1 zur datei bzw. datenbank) in einem array ablegen, damit ich die aufbereitung (habe ich fertig für eine andere funktion und würde diese gerne wieder verwenden, da recht umfangreich und speziell) nicht noch einmal komplett neu machen müsste.

Gibt es da mengenmässig(array) begrenzungen
 
Hallo gilles,

ich habe seit gestern mein programm entsprechend deinem vorschlag abgeändert (Zwischendatei entfernt, daten in ein array..).

Jetzt habe ich aber ein problem, hoffe du kannst mir helfen.
Bisher habe ich mit folgendem php-code dafür gesorgt, dass ab einem bestimmten id jeweils nur eine bestimmte menge datensätze (sortiert) angezeigt wurde:
PHP:
$sqlab = "select * from $tblDB";
$sqlab .= " order by ANR desc";
$sqlab .= " limit ". ($id * $proseite - $proseite) .", ".$proseite;
[/code]

Wie löse ich das mit einem array

Sortierung, Aufsetzen bei id (Blättern) und bestimmte anzahl datensätze

Muss ich das jetzt alles selbst händisch bewerkstelligen oder wie kann man vorstehenden code möglichst elegant anpassen, damit mit einem array der gleiche zweck erfüllt wird.

Ich hoffe, ich konnte mein problem einigermassen verständlich rüberbringen
 
Hallo gilles,

ich habe seit gestern mein programm entsprechend deinem vorschlag abgeändert (Zwischendatei entfernt, daten in ein array..).

Jetzt habe ich aber ein problem, hoffe du kannst mir helfen.
Bisher habe ich mit folgendem php-code dafür gesorgt, dass ab einem bestimmten id jeweils nur eine bestimmte menge datensätze (sortiert) angezeigt wurde:
PHP:
$sqlab = "select * from $tblDB";
$sqlab .= " order by ANR desc";
$sqlab .= " limit ". ($id * $proseite - $proseite) .", ".$proseite;

Wie löse ich das mit einem array; $proseite enthält die Anzahl Datensätze pro seite

Sortierung, Aufsetzen bei id (Blättern) und bestimmte anzahl datensätze

Muss ich das jetzt alles selbst händisch bewerkstelligen oder wie kann man vorstehenden code möglichst elegant anpassen, damit mit einem array der gleiche zweck erfüllt wird.

Ich hoffe, ich konnte mein problem einigermassen verständlich rüberbringen
 
Ganz doofe Frage, aber wieso sollte das jetzt nicht mehr funktionieren? :D Könntest du das Problem etwas genauer beschreiben? Denn ich sehe da kein Problem drin :)
Gibt übrigens ne Edit Funktion falls du beim nächsten mal die Code Tags vergessen solltest ;)
 
Ich möchte daten aus einem array statt einer db einlesen ein und bin davon ausgegangen (vielleicht doof, aber ich weiss es nicht besser), dass ich dann den befehl mit limit usw.. nicht mehr verwenden kann.

Liege ich da falsch, kann ich daten aus einem array analog sortieren und mit limit verarbeiten
 
Das ist leider nicht möglich. Das von dir geschriebene Query kann nur in einer Datenbank funktionieren. :)
Du hast ja gesgat du hast mehrere Datenbanken (nehmen wir mal an 2)
Du kannst dort die Daten auslesen mit einem limit und in ein Array eintragen. Dann liest du die zweite Datenbank ebenso mit einem Limit aus und fügst sie auch dem Array hinzu.
Oder hast du irgend welche Abhängigkeiten zwischen Datenbank 1 und 2? Heisst: Kannst du kein Limit festlegen ohne Beide vollständigen Datensätze zu kennen?

Ansonsten sollte es kein problem sein

PHP:
 while($row = mysql_fetch_array($query, MYSQL_ASSOC)) {      
   // Daten  dem Array hinzufügen
   array_push($arrayAusgabe['data1'], $row['data1']);   
   array_push($arrayAusgabe['data2'], $row['data2']);       
 }

Und dann beim Abfragen der 2. Datenbank genau die selbe Prozedur :)
Hoffe das hilft dir ;)
 
Leider nein, ich muss alle datenbanken lesen, daraus datensätze selektieren und diese nach datum absteigend sortieren.

Erst wenn ich weiss, wie viele datensätze insgesamt vorhanden sind (Suchfunktion/ Treffer), kann ich ermitteln, wie viele Seiten (habe ich, kein Problem) angezeigt werden müssen.

Und auch das Anzeigen von x-Datensätzen pro Seite soll kein Problem sein.

Aber ich muss (zum Blättern) immer den ersten Datensatz pro Seite ermitteln, und das (sowie das entsprechende Aufsetzen/Anzeigen) habe ich bisher mit dem limit-befehl gelöst
 
Puh. Du hast also mehrere Datenbanken und die haben alle Daten mit jeweils einem Datum und du willst alle zusammen schmeißen und dei nach dem Datum sortieren. Das ist echt mal ne harte Nuss :D Wie es in einer Datenbank ginge wüsste ich. Wie es über mehrere geht weiß ich grade leider auch nicht (Noch nie mit mehr als einer Datenbank auf einmal gearbeitet bisher ^^). Hätte das jetzt dann probiert innerhalb von PHP zu sortieren. Du kannst dir Daten auch als unix timestamp ausgeben lassen in Mysql MySQL :: MySQL 5.1 Referenzhandbuch :: 12.5 Datums- und Zeitfunktionen. Danach müsstest du das php array irgend wie mit PHP: sort - Manual oder mit PHP: usort - Manual sortieren können. Für genauere Aussagen müsste ich mir mal was zeit dafür nehmen (Die ich leider grade nicht habe). Vielleicht hat das mal jemand gemacht.
Es gäbe noch eine andere Methode die das ganze recht leicht machen würde, wenn einige Kriterien erfüllt wären :D
Man müsste wissen. Wie oft aktualisieren sich die Datensätze?
Wenn nicht oft könntest du dir eine Datenbank aufsetzen, die Datensätze aus DB1 lesen und in deine DB schreiben. Das selbe mit DB2. Dann hättest du nur noch eine Datenbank aus der du lesen müsstest und könntest auch einfacher sortieren und auch einfach ein Limit erstellen. Haste leider nur Datenredundanz. Wie gesgat vielelicht kennt wer eine bessere Lösung. Bin mit meinem latein vorerst am Ende ;) Sorry
 
Nochmal zum besseren verständnis:

Normalerweise werden die daten immer aus einer datenbank angezeigt, was ich mit dem schon erwähnten befehlt (limit ...) tue.

Nun will ich eine suchfunktion integrieren, die über mehrere datenbanken geht; alle daten aus der selektion wollte ich in eine zwischen-db schreiben (dann hätte ich wieder zum anzeigen nur eine eingabe-db gehabt und meine entsprechenden befehle (Sortieren, blättern, indizieren usw.) , die alle funktionieren, verwenden können.

Und deswegen auch meine ursprünglichen fragen zur sperrung bei mehreren usern usw.;

Kannst du meine ursprüngliche anfrage beantworten (da schwimme ich), da es ja so aussieht, dass ich wohl doch den weg mit der zwischendatei gehen muss.

Oder kann ich in einem array mit indizes arbeiten und (je nachdem was der user eingibt) an einem bestimmten datensatz aufsetzen( habe ich noch nie gemacht).
 
Du Kannst sogenannte Views erstellen. Views sind (@ Mysql-Profis: Bitte nicht hauen) temporäre Tabellen MySQL :: MySQL 5.1 Referenzhandbuch :: 21.2 CREATE VIEW . Du könntest eine Tabelle mit Zufallszahlen erstellen (Zumindest keine statischen Namen). Könntest da die Daten reinschreiben und nachdem du alle Operationen gemacht hast, löschst du den View wieder. Die Wahrscheinlichkeit, dass User dann den gleichen View benutzen ist mikroskopisch klein ^^ (Genau wie 2 Passwörter, die den selben md5 Schlüssel haben :P) Wäre jetzt mein Lösungsansatz. Aber vielelicht hat da wer nen besseren Ansatz :)
 
Hallo gilles, jetzt komme ich noch einmal auf das ganze zurück.

Meiner Meinung nach müsste das ganze doch über ein array (wie von dir vorgeschlagen) statt einer zwischendatei zu lösen sein.

Wenn ich weiss, wie viele datensätze ich habe und wie viele ich pro seite ausgeben will, kann ich die anzahl der seiten ermitteln.

Und über die jeweils aufgerufene seitenzahl kann ich doch ermitteln, ab dem wie vielten datensatz ich x Sätze anzeigen muss.

Und wenn ich weiss, ich brauche zum beispiel ab datensatz 124 die nächsten 5 Datensätze, müsste dies doch auch mit einem array zu bewerkstelligen sein , d.h.
datensatz mit index 124-1 in array lesen usw.

Und wenn dann z. B. statt der seite 5 die seite 11 aufgerufen wird, kann ich doch wieder errechnen, der wievielte satz (Index) das ist.

Kann das zwar momentan programmiertechnisch noch nicht umsetzen, aber prinzipiell müsste das doch ein weg sein.
 
Das was du geschrieben hast, ist auch "einfach" möglich.
Du hast irgend wo den Wert gespeichert, wieviele Seiten auf einmal angezeigt werden sollen.
Du hast dein Array mit allen Datensätzen (z.B. 100 Datensätze)
Jetzt hast du als variable: $anzeigenProSeite = 10; (als Beispiel)
als aktuelle Seiten Zahl hast du immer 0 ( Heisst als Startwert einer schleife den Wert 0)

Du lässt dir dann folgende Daten Anzeigen:
PHP:
for( $i = ($aktuelleSeite * $anzeigenProSeite); $i < (($aktuelleSeite+1) * $anzeigenProSeite && $i < count($datenSaetze); $i++) {
  // Tu was
}

So könnte das für die Daten aussehen. Dann gibt es ja noch die Anzeige der Seitenzahlen.
Hier wird die Seitenzahl als GET Parameter in einem Link mitgegeben.
Beispiel:
HTML:
 <a href="daten.php?seite=2">2</a>
[HTML]

Auf der Seite fragst du dann erst mal ab:
Wie viele Datensätze habe ich? (100)
Wieviele maximal pro Seite? (10)

Nun rechnest du
[CODE]
100/10 -> 10
[/CODE]

heisst du hast 10 Seiten. Nun gibt es folgendes Problem. Nehmen wir an du hast 105 Datensätze.

[CODE]
105/10 -> 10,5
[/CODE]

Heists wir brauchen eine elfte Seite. Um das hinzukriegen Musst du die zahlen immer hochrunden.

Hoffe das hilft dir etwas ;)
 
Zurück
Oben