Dynamische "Manipulation" von ID's

diggity

Erfahrenes Mitglied
Hallo Leute,
Ich schreibe auch grad nen kleines (aber feines +g+) CMS, da brauch ich diese Funktion zum "Hinauf- und hinabschieben" der Navigationspunkte. Zur Erklärung: In diesem CMS (nicht meins) kann man mit den Pfeilen die Einträge hinauf- oder hinabschieben.
Nun wüsste ich gerne wie der funktioniert, da müssen ja dann immer gleich alle ID's geändert werden, oder? Gleiche ID's darfs natürlich auch nicht geben, welche Lösung gibt's dafür?

Ich hoffe ihe versteht mein Anliegen,
Danke
 
mit den IDs sollte das nichts zu tun haben, denn diese sollen einen Datensatz ja eindeutig identifizieren und somit sollte man sie nicht mehr ändern.
Mach dir einfach eine Spalte "Reihenfolge". Auf diese musst du dann halt ein Update fahren, wenn ein Datensatz verschoben wird.

Gruß
yson
 
Ja, danke für den Tipp. Hab mir schon fast gedacht dass das ohne die ID's zu ändern schöner ist. Von der Umsetzung her ist es aber genau das Gleiche wie wenn ichs mit den ID's gemacht hätte. Sprich: Ich weiß net wie ;)
 
wenn ich es richtig sehe, verschiebst du ja immer nur um eine Position!?

Dann hier ein rudimentäres Beispiel:

Du brauchst als erstes die aktuelle Position des Datensatzes, der verschoben werden soll:
$query = "SELECT `rank` FROM `tabelle` WHERE id = ". $GET["id"];
$rs = mysql_query($query);
$row = mysql_fetch_object($rs);

Dann machst du zwei Updates:

Den Datensatz um eine Position nach oben verschieben:
"UPDATE `tabelle` SET `rank` = `rank` - 1 WHERE id ". $GET["id"];

Den darüber liegenden Datensatz einen nach unten verschieben:
"UPDATE `tabelle` SET `rank` = ".$row->rank." WHERE rank ". $row->rank - 1;

So oder so ähnlich sollte es gehen.

Gruß
yson
 
Bei mir sieht das nur so aus, hat nichts mit nested sets zu tun(nur so als Anmerkung):

link 1
link 2
link 3
link 4
.
.
.
Und neben jedem Link ist ein button "hinauf" und "hinunter".
Es gibt also keine Verschachtelungen, nur die Links sollen ihre Position ändern.

Deinen Ansatz sehe ich mir gleich an, sieht schonmal super aus!
 
So, funktionieren tut es, aber leider etwas "unschön".

Hab jetzt ein Feld namens "position" in der Tabelle, das den Standardwert "1" hat. wenn ich nun einen Punkt hinaufschiebe, erhält dieser den Wert "2".
Ist blöd zum Erklären, jedenfalls gehen die Punkte am Anfang nicht einen Schritt nach oben, sondern sprunghaft um mehrere. Der Eintrag mit der position "1", der ganz unten steht, springt z.B. dann sprunghaft ganz rauf, weil er die höchste position hat, nämlich "2".

Es würde doch gut funktionieren wenn ich als Standardwert für das Feld "position" nicht 1 nehmen würde, sondern die ID, die jeder Eintrag mit auto_increment erhält. Wie kann ich das machen?

Mein funktionierendes Script sieht jezt so aus:
PHP:
<?php //rubrikseinträge verschieben
if($_GET["cat"] && $_GET["sort"] && $_GET["id"]) {
		$id = $_GET["id"];
		require("inc/db.php");	
		mysql_connect($dbhost,$dbuser,$dbpass) or die ("Keine Verbindung zur db moeglich");
		mysql_select_db($dbbase) or die ("db gibts net");    
		
		$query = "SELECT position FROM navigationen WHERE id = '$id'";
		$rs = mysql_query($query);
		$row = mysql_fetch_object($rs);
		//2 Updates machen
		
		if($_GET["sort"] == "up") {
			//Den Datensatz um eine Position nach oben verschieben:
			mysql_query("UPDATE navigationen SET position = position + 1 WHERE id = '$id'");
			
			//Den darüber liegenden Datensatz einen nach unten verschieben:
			mysql_query("UPDATE navigationen SET position = '$row->position' WHERE position = '$row->position - 1'");
		}
		if($_GET["sort"] == "down") {
			//Den Datensatz um eine Position nach unten verschieben:
			mysql_query("UPDATE navigationen SET position = position - 1 WHERE id = '$id'");
			
			//Den darüber liegenden Datensatz einen nach oben verschieben:
			mysql_query("UPDATE navigationen SET position = '$row->position' WHERE position = '$row->position + 1'");
		}
		header("Location: index.php?cat=$cat");
	}
?>
 
Zuletzt bearbeitet:
ich würde es an deiner Stelle anders machen.
Ich würde mir immer die höchste Position aus der DB holen und eins addieren.
Anschließend fügst du den neuen Datensatz ein. Mit den IDs würde ich da nicht arbeiten.
 
Wenn du einen Eintrag nach oben bewegst musst du den oberen aber auch noch ändern. Sonst haben dann 2 die gleiche Position.
Das gleich beim hinunterbewegen mit dem Unteren ;)

MFG
redX
 
redX hat gesagt.:
Wenn du einen Eintrag nach oben bewegst musst du den oberen aber auch noch ändern. Sonst haben dann 2 die gleiche Position.
Das gleich beim hinunterbewegen mit dem Unteren ;)

MFG
redX
Und wie mach ich das?
 
Zurück