Datensätze umsortieren

Moritz123

Erfahrenes Mitglied
Hallo!

ich habe folgendes kleines Problemchen: In meinem CMS habe ich eine Tabelle, in dem die Seiteninhalte abgelegt sind. Diese hat folgende Struktur (verkürzt):
Code:
id | pid | inhalt | dataorder
Das Feld dataorder beimnhaltet eine fortlaufende Ordnungszahl, die die Bildschirmausgabe später sortiert. Genau hier liegt das Problem: Um das fortlaufende zu gewährleisten habe ich mir einer Funktion geschrieben, die mir beim Einfügen eines neuen Datensatzes abhängig von einer angebenen Beziehung zu einem Bestehenden die Datenbank umsortiert. Vielleicht ein kleines Beispiel zum verdeutlichen:
Folgende Tabelle sei gegeben:
Code:
id | pid | inhalt | dataorder
1  |  1  | test1  | 1
2  |  1  | test3  | 2
Nun will ich folgenden Inhalt
Code:
3 | 1 | test2
mit der Beziehung "nach test1 einordnen" mit folgendem Funktionsaufruf
PHP:
$dataorder = reorderCat(1,"nach", 1);

function reorderCat($pid, $pos, $dataorder){
	global $config;
	if($pos == "vor") $qZus = " AND dataorder >= ".$dataorder;
	else $qZus = " AND dataorder > ".$dataorder;
	
	$abfrage = "SELECT * 
				FROM ".$config['DBstructuretable'].
			   " WHERE pid = ".$pid.$qZus;
	echo $abfrage."<br>";	
	$ausgabe = mysql_query($abfrage); 
	$num = mysql_num_rows($ausgabe); 
	if ($num > 0) { 
		while ($row = mysql_fetch_object($ausgabe)){
			$newDO = 0;
			$newDO = ($row->dataorder) + 1;
			$aendern = "UPDATE ".$config['DBstructuretable'].
					   " SET dataorder = '$newDO'
					   WHERE id = ".$row->id;
			if (!$update = mysql_query("$aendern")) return errorHandler(23, $aendern);	
		}
	}
	mysql_free_result($ausgabe);
    return $dataorder;
}
hinzufügen. Daraufhin sieht die Tabelle (ORDER BY 'dataorder') so aus:
Code:
id | pid | inhalt | dataorder
1  |  1  | test1  | 1
3  |  1  | test2  | 2
2  |  1  | test3  | 3
Das funktioniert auch soweit wie es soll. Allerdings möchte ich nun gerne einen Datensatz umsortieren; zb. ID2 vor ID3 kopieren. Und hier beginnt das Problem - ich nutze die selbe Funktion wie zum einfügen und diese schmeißt alles durcheinander bzw vergibt dataorder-Zahlen nach mir nicht nachzuvollziehenden Kriterien.

Und nun meine eigentliche Frage ;)
Wie schaffe ich es einen Datensatz vor/nach einen anderen zu kopieren und die Ordnungszahlen im Feld 'dataorder' entsprechend umzuschreiben?
 
Das geht doch auch einfacher:
PHP:
<?php

$dataorder = reorderCat(1,"nach", 1);

function reorderCat($pid, $pos, $dataorder){
    global $config;

	$query = '
		UPDATE
			`'.$config['DBstructuretable'].'`
		SET
			`dataorder` = `dataorder` + 1
		WHERE
			`pid` = '.$pid.'
			AND `dataorder` >'.($pos == 'vor' ? '=' : '').' '.$dataorder;

	if (!mysql_query($query)) return errorHandler(23, $query);

	return $dataorder;
}

?>

Moritz123 hat gesagt.:
Wie schaffe ich es einen Datensatz vor/nach einen anderen zu kopieren und die Ordnungszahlen im Feld 'dataorder' entsprechend umzuschreiben?
Meinst du kopieren oder verschieben?
 
Hallo!

erst einmal danke für deinen Hinweis!
Füge ich einen neuen Datensatz ein, funktioniert obige Funktion einwandfrei. Will ich aber einem bestehenden Datensatz einen neuen Wert für 'dataorder' zuweisen(also die Datensätze für die Ausgabe neu sortieren) funktioniert die Funktion nicht. Problem ist hier, dass ich ja einen Datensatz praktisch entfernen muss und so an dessen Stelle ein 'Loch' entsteht. Dieses hat wiederum zur Folge, dass die Datensätze, die nach dem 'Loch' kommen, fälschlicherweise auch erhöht werden. Ich weiß aber nicht nicht, wie ich das vermeiden soll/kann.
Ich hoffe, mein Anliegen ist nun verständlicher. Vielen Dank im Vorraus und einen schönen Sonntag.
 
Zurück