[php/mysql] Sortierreihenfolge

martin

Well-Known Member
Hi

ich habe ein kleines Problem mit der Reihenfolge der Elemente in einem Array. Eigentlich ist es ganz einfach:
PHP:
$test = Array(); //Array wo alle "Zeilen" der Datenbank zwischengespeichert werden
//Für jeden neuen Datensatz wird also folgendes gemacht!
array_push($test, Array('feld1'=>'wert1','feld2'=>'wert1','feld3'=>'wert1'));
array_push($test, Array('feld1'=>'wert2','feld2'=>'wert2','feld3'=>'wert2'));
array_push($test, Array('feld1'=>'wert3','feld2'=>'wert3','feld3'=>'wert3'));
...

Wie schon erwähnt ist das Array $test so aufgebaut wie die Daten später in der Datenbank. Soweit funktioniert alles wie es soll, bei dem Hinzufügen einer Zeile, wird diese im Object (also im Array) richtig dargestellt.
Soweit so gut. Wenn ich nun aber auf "speichern" klicke, dann werden die Daten vom Object in die Datenbank gespeichert:

PHP:
//vorher werden alle Datensätze in der DB gelöscht....dann folgt:
$stmt = $mysqli->prepare("INSERT INTO `testdb` (`feld1`, `feld2`, `feld3`) VALUES ( ?, ?, ?)");
$stmt->bind_param('sss', $feld1, $feld2, $feld3);

foreach ($test as $key => $value){

     $feld1 = $value['feld1'];
     $feld2 = $value['feld2'];
     $feld3 = $value['feld3'];                        
     $stmt->execute();

}
$stmt->close();

Das Ganze funktioniert zwar, aber mit einem Haken. Die Datensätze werden schön gespeichert, aber leider wird bei jedem Speichern die Reihenfolge umgedreht. Das ist seltsam, denn eigentlich sollte doch foreach aufsteigend die einzelnen keys hernehmen, oder?
Um es etwas verständlicher zu machen, hier kurz der Ablauf:
- Eingabe neuer Datensatz mit feld1->wert1 feld2->wert1 feld3->wert1
- Eingabe neuer Datensatz mit feld1->wert2 feld2->wert2 feld3->wert2
- Eingabe neuer Datensatz mit feld1->wert3 feld2->wert3 feld3->wert3
(Keys wurden überprüft, sind 0,1,2) soweit sogut
- Speichern in DB: Speichern funktioniert, wenn ich allerdings die Datenbank abfrage, ohne Sortierung, dann wird zuerst die letzte Zeile/Datensatz ausgegeben, dann die zweite, dann die erste.

Sollte nicht eigentlich der erste eingefügte Datensatz auch als erstes aufgelistet werden? Wie gesagt, ich verwende keine Sortierung!
 
Hi,

Löscht du zwischendurch wieder die Einträge aus der Datenbank? Mit delete oder mit Truncate?

MySQL (und auch andere RDBMS meine ich) garantieren dir nicht, dass du die Daten in der Reihenfolge wieder bekommst, in der die du reingesteckt hast, sondern packen die so rein, wie es gerade gut auf die Platte passt. Im Normalfall ist das natürlich in der Reihenfolge wie du die einfügst, aber wenn man Einträge löscht, kann es schon sein, dass ein späterer Eintrag den Platz eines gelöschten übernimmt.

Also auf die Reihenfolge beim Eintragen würde ich mich nicht verlassen, wenn das relevant ist, würde ich mit einem Auto-Increment-Primary Key arbeiten (den man typischerweise eigentlich sowieso immer hat), und nach dem sortieren (order by id etc.).

Gruß
oxy
 
Zurück
Oben