Webstatt.org - Community seit 2006 - 2012 (2024?)

move up / move down - Sortierung

Avatar user-118
28.05.2006 10:35

Hallo liebe Community Fettes Grinsen

Ich habe mal wieder ein Problem. Diesmal ein eher logisches.

Ihr kennt sicherlich die Funktion bei Foren, dass man diese und ihre Kategorien in der Reihenfolge verändern kann. Im PhpBB2 bspw. Geht das mit einem move up und einem move down link.

Sowas brauche ich nun auch.

Allerdings fehlt mir da der entscheidende Schritt zur Lösung.

Ich habe mir das bis jetzt wie folgt gedacht:

Nehmen wir an ich haben 3 Kategorien.


Kategorien Cat_id Cat_order
------------------------------------------------
Cat 1 1 1
Cat 2 2 2
Cat 3 3 3


Cat ist die Kategorienbezeichnung.
Cat_id ist die Kategorienid.
Cat_order ist die Position der Kategorie. ( SELECT *... ORDER by cat_order )

Nun zu meinem Problem.

Nehmen wir an ich rufe meine Funktion zum ändern der Reihenfolge so auf

<a href="...&move=-1&c=2">Ein tiefer</a>
<a href="...&move=1&c=2">Ein höher</a>

Nun komme ich zu meinem problem

Wie tausche ich nun den Datensatz des zu bewegenden Forums / der zu bewegenden Kategorie mit dem nächst höheren bzw. niedrigaren aus?

    $move = $_GET['move'];
$cat_id = $_GET['c'];
$query=mysql_query("SELECT `cat_order` FROM `categories` WHERE `cat_id` = '$cat_id'"zwinkern;
$row = mysql_fetch_object($query);
$query2=mysql_query("SELECT `cat_order` FROM `categories` WHERE `cat_id` = '$cat_id+$move'"zwinkern;
$row2 = mysql_fetch_object($query2);
$query3 = ("UPDATE `categories` SET `cat_order` = '$row->cat_order+$move' WHERE `cat_id` = '$cat_id'"zwinkern;


Das habe ich bis jetzt ... nun die Frage, wie bekomme ich raus welches der nächst höhere bzw. nächst tiefere Datensatz ist und wie kann ich nun sagen, dass der Datensatz in cat_order von der zu bewegenden Kategorie mit der Kategorie, mit der die zu bewegende Kategorie den Platz tauschen soll tauscht?

Nachher , wenn wir davon ausgehen, das Kategorie 2 um -1 verschoben wird soll es so aussehen.


Kategorien Cat_id Cat_order
------------------------------------------------
Cat 1 1 1
Cat 3 3 2
Cat 2 2 3


Ich hoffe es ist halbwegs verständlich was ich machen möchte und mir kann jemand helfen.

vielen dank schonmal im vorraus

mfg

Alex

Ich brauche keine Signatur
user-137
28.05.2006 10:45

"Order by", und ne while Schleife, damit müste es doch gehen, oder?

Avatar user-118
28.05.2006 10:47

es geht nicht um die Ausgabe sondern das ändern der Order Nummer in der DB

Ich brauche keine Signatur
user-273
28.05.2006 10:51

Ich weis nicht ob ich jetzt richtig denk aber wenn du sagst...

SELECT `cat_order` FROM `categories` WHERE `cat_id` < '$cat_id' LIMIT 1 bzw.
SELECT `cat_order` FROM `categories` WHERE `cat_id` > '$cat_id' LIMIT 1

müsste es doch funken...


EDIT: ORDER BY musst du halt noch angeben...

Avatar user-118
28.05.2006 10:55

Original von user-273
Ich weis nicht ob ich jetzt richtig denk aber wenn du sagst...

SELECT `cat_order` FROM `categories` WHERE `cat_id` < '$cat_id' LIMIT 1 bzw.
SELECT `cat_order` FROM `categories` WHERE `cat_id` > '$cat_id' LIMIT 1

müsste es doch funken...


Es geht dabei um das Order und nicht um die Cat id... d.h. das Eine Kategorie nciht zwingend eine id höher ist, nur weil sie 1 order höher ist als eine darunter stehender , es könnte auch so aussehen.


Kategorien      Cat_id       Cat_order
------------------------------------------------
Cat 1 1 1
Cat 2 5 2
Cat 3 9 3
Cat 4 7 4
Cat 5 6 5
Cat 6 2 6
Cat 7 4 7
Cat 8 3 8
Cat 9 8 9



Verstehst du wie ich das meine ?

mfg Alex

Ich brauche keine Signatur
user-273
28.05.2006 10:59

dann musst du halt statt cat_id cat_order nehmen suchst den höheren bzw. kleineren und du hast den Effekt den ich bisher verstanden hab. lächeln

Avatar user-317
28.05.2006 11:00

Besorg dir die mommentane cat_order und schau ob´s nen moveup oder movedown sein soll. Bei moveup rechnest du dann einfach -1 und vergibst dem Eintrag die errechnete ID. Der Eintrag der drüber war bekommt einfach die alte cat_order vom verschobenen Eintrag. Pseudo-Code :
<?php
$sql = "SELECT blablabla....";
$qry = mysql_query ($sql) OR die (mysql_error ());

$row = mysql_fetch_array ($qry, MYSQL_ASSOC);
$n_order = $row['cat_order']--; // Oder halt ++
mysql_query ("UPDATE cats SET cat_order-1 WHERE cat_order='$n_order'"zwinkern
mysql_query ("UPDATE cats SET cat_order+1 WHERE cat_id='". $row['cat_id'] . "'"zwinkern;


Hoffe der Ansatz hilft dir.

Avatar user-118
28.05.2006 11:37

Boah es sollte echt mal wieder mit Rätseln anfagen ...
Ich krieg einfach keine Struktur rein ...

Der Ansatz von dir hat mich schon weiter gebracht.
danke

mfg Alex

Ich brauche keine Signatur
Avatar user-317
28.05.2006 11:39

Bitte. Wenn ich noch weiter ausholen muss, sags.

Avatar user-118
28.05.2006 11:44

Ich probier mal bis 2 Uhr weiter und wenn ich dann keine Lösung habe , dass poste ich mal das was ich bis dahin habe. Fettes Grinsen

mfg Alex

ich merk jetzt schon, dass wird nichts...

das habe ich bisher

$move = $_GET['move'];  // move up = -1 / move down = 1
$cat_id = $_GET['c']; // cat_id
$query_cat_order_from_cat_id = mysql_query("SELECT `cat_order` FROM `categories` WHERE `cat_id` = '$cat_id'"zwinkern or die(mysql_error()); // Cat_order , die zur Cat_id gehört holen.
$row_cat_order_from_cat_id = mysql_fetch_assoc($query_cat_order_from_cat_id);
echo $row_cat_order_from_cat_id['cat_order']; //cat_order, der zu verschiebenden cat.
$query_cat_order_aendern_1 = mysql_query("UPDATE `categories` SET `cat_order-1` WHERE `cat_order` = '".$row_cat_order_from_cat_id['cat_order']."'"zwinkern or die(mysql_error());
// Im Klartext: Setze cat_order auf cat_order-1 wo cat_order der cat_order der zu verschiebenen cat entspricht


Folgender Fehler kommt:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `cat_order` = '1'' at line 1


Mit anderen Worten, weiter ausholen wäre super ! Fettes Grinsen




edit2://

Ich habe nun sowas zusammengebastelt, aber irgendwo ist trotzdem noch nen dreher drin..


if ($mode == "cat_order"zwinkern {
$move = $_GET['move']; // move up = -1 / move down = 1
$cat_id = $_GET['c']; // cat_id
$query = mysql_query("SELECT * FROM `categories` WHERE `cat_id` = '$cat_id'"zwinkern or die(mysql_error());
$row = mysql_fetch_assoc($query);
echo $row['cat_order']; //cat_order, der zu verschiebenden cat.
$new_cat_order = $row['cat_order']+$move;
echo $new_cat_order;
$query1 = mysql_query("UPDATE `categories` SET `cat_order` = 'row->cat_order' WHERE `cat_order` = '$new_cat_order'"zwinkern or die(mysql_error());
$query2 = mysql_query("UPDATE `categories` SET `cat_order` = '".$new_cat_order."' WHERE `cat_id` = '$cat_id'"zwinkern or die(mysql_error());
}

Ich brauche keine Signatur
Avatar user-317
28.05.2006 13:02

So, schau dir das mal an lächeln
<?php
// Variablen aus der URL, z.b. categories.php?id=21&action=up
$teh_id = $_GET['id'];
$teh_action = $_GET['action'];

// Hole die aktuelle Nummer von Cat_order der Kategorie
$sql = "SELECT Cat_order FROM `categories` WHERE Cat_id='$teh_id'";
$qry = mysql_query ($sql) OR die (mysql_error ());
$row = mysql_fetch_array ($qry, MYSQL_ASSOC);

// Fallüberprüfung und Berechnung der neuen Cat_order sowie dem Updaten der Einträge
switch ($teh_action) {
case 'up':
$n_order = $row['cat_order']++; // Berechne die neue Cat_order (Aktuelle + 1)
mysql_query ("UPDATE cats SET Cat_order-1 WHERE Cat_order='$n_order'"zwinkern // Setze Cat_order vom darüberliegenden Eintrag cat_order - 1
mysql_query ("UPDATE cats SET Cat_order+1 WHERE Cat_id='$teh_id'"zwinkern; // Setze Cat_order vom Eintrag cat_order + 1
break;
case 'down':
$n_order = $row['cat_order']--; // Berechne die neue Cat_order (Aktuelle - 1)
mysql_query ("UPDATE cats SET Cat_order+1 WHERE Cat_order='$n_order'"zwinkern // Setze Cat_order vom darunterliegenden Eintrag cat_order + 1
mysql_query ("UPDATE cats SET Cat_order-1 WHERE Cat_id='$teh_id'"zwinkern; // Setze Cat_order vom Eintrag cat_order - 1
break;
}
?>

Avatar user-118
28.05.2006 13:11

Danke schön.

ich habe es nun angepasst:

if ($mode == "cat_order"zwinkern {
// Variablen aus der URL, z.b. categories.php?id=21&action=up
$cat_id = $_GET['c'];
$move = $_GET['move'];

// Hole die aktuelle Nummer von Cat_order der Kategorie
$sql = "SELECT cat_order FROM `categories` WHERE cat_id='$cat_id'";
$qry = mysql_query ($sql) OR die (mysql_error ());
$row = mysql_fetch_array ($qry, MYSQL_ASSOC);

// Fallüberprüfung und Berechnung der neuen Cat_order sowie dem Updaten der Einträge
switch ($move) {
case 'up':
$n_order = $row['cat_order']++; // Berechne die neue Cat_order (Aktuelle + 1)
mysql_query ("UPDATE `categories` SET `cat_order-1` WHERE `cat_order`='$n_order'"zwinkern or die(mysql_error()); // Setze Cat_order vom darüberliegenden Eintrag cat_order - 1
mysql_query ("UPDATE `categories` SET `cat_order+1` WHERE `cat_id`='$cat_id'"zwinkern or die(mysql_error()); // Setze Cat_order vom Eintrag cat_order + 1
break;
case 'down':
$n_order = $row['cat_order']--; // Berechne die neue Cat_order (Aktuelle - 1)
mysql_query ("UPDATE `categories` SET `cat_order+1` WHERE `cat_order`='$n_order'"zwinkern or die(mysql_error()); // Setze Cat_order vom darunterliegenden Eintrag cat_order + 1
mysql_query ("UPDATE `categories` SET `cat_order-1` WHERE `cat_id`='$cat_id'"zwinkern or die(mysql_error()); // Setze Cat_order vom Eintrag cat_order - 1
break;
}
}


glaube aber dabei keine Fehler gemacht zu haben und es kommt folgende fehlermeldung.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `cat_order`='1'' at line 1



Darf man überhaupt, den Wert den man verändert in der WHERE Abfrage mit drin haben ?

Ich brauche keine Signatur
Avatar user-317
28.05.2006 13:23

`cat_order-1` kann so nicht funktionieren. Einfach so lassen wie ichs hatte.

Avatar user-118
28.05.2006 14:12

Erstmal vielen dank user-317, durch deinen Code, habe ich auch endlich gerafft, wie ich das machen muss...
Es sieht nun so aus:

if ($mode == "cat_order"zwinkern {
// Variablen aus der URL, z.b. categories.php?id=21&action=up
$cat_id = $_GET['c'];
$move = $_GET['move'];

// Hole die aktuelle Nummer von Cat_order der Kategorie
$sql = "SELECT cat_order FROM `categories` WHERE cat_id='$cat_id'";
$qry = mysql_query ($sql) OR die (mysql_error ());
$row = mysql_fetch_array ($qry, MYSQL_ASSOC);

// Hole die id der Kategorie, die über der zu verschiebenden liegt : cat_order-1
$sql_up = "SELECT * FROM `categories` WHERE cat_order = '".($row['cat_order']-1)."' ";
$qry_up = mysql_query ($sql_up) OR die (mysql_error ());
$row_up = mysql_fetch_array ($qry_up, MYSQL_ASSOC);
// Min cat_order
$sql_up_min = "SELECT MIN(cat_order) FROM `categories`";
$qry_up_min = mysql_query ($sql_up_min) OR die (mysql_error ());
$row_up_min = mysql_fetch_array ($qry_up_min, MYSQL_ASSOC);

// Hole die id der Kategorie, die unter der zu verschiebenden liegt : cat_order+1
$sql_down = "SELECT * FROM `categories` WHERE cat_order = '".($row['cat_order']+1)."' ";
$qry_down = mysql_query ($sql_down) OR die (mysql_error ());
$row_down = mysql_fetch_array ($qry_down, MYSQL_ASSOC);
// Max cat_order
$sql_down_max = "SELECT MAX(cat_order) FROM `categories`";
$qry_down_max = mysql_query ($sql_down_max) OR die (mysql_error ());
$row_down_max = mysql_fetch_array ($qry_down_max, MYSQL_ASSOC);

// Fallüberprüfung und Berechnung der neuen Cat_order sowie dem Updaten der Einträge
if ($move == "down"zwinkern {
if ($row_down['cat_order'] != $row_down_max['cat_order']) {
mysql_query ("UPDATE `categories` SET `cat_order` = '".($row_down['cat_order']-1)."' WHERE `cat_id` = '".$row_down['cat_id']."'"zwinkern or die(mysql_error());
mysql_query ("UPDATE `categories` SET `cat_order` = '".($row['cat_order']+1)."' WHERE `cat_id` = '".$cat_id."'"zwinkern or die(mysql_error());
}
}
if ($move == "up"zwinkern {
if ($row_up['cat_order'] != $row_up_min['cat_order']) {
mysql_query ("UPDATE `categories` SET `cat_order` = '".($row_up['cat_order']+1)."' WHERE `cat_id` = '".$row_up['cat_id']."'"zwinkern or die(mysql_error());
mysql_query ("UPDATE `categories` SET `cat_order` = '".($row['cat_order']-1)."' WHERE `cat_id` = '".$cat_id."'"zwinkern or die(mysql_error());
}
}
}

Ich brauche keine Signatur
Avatar user-255
28.05.2006 14:42

Sollten nicht 2 Anfragen reichen?
'update categories set cat_order = cat_order '.($a=='up'?'-':'+'zwinkern.' 1 where cat_id = '.$cat_id;
'update categories set cat_order = cat_order '.($a=='up'?'+':'-'zwinkern.' 1 where cat_id = '.($a=='up'?($cat_id-1)traurig$cat_id+1));

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-317
28.05.2006 14:44

Bin auch der Meinung das da ziemlich viel zu viel ist frech
Wenns für dich funktioniert und du dich daran nicht störst ist´s ok.

Avatar user-118
28.05.2006 14:46

Kann sein, obwohl deine Code wieder mit den Cat_ids arbeitet und da um 1 erhöht bzw. abzieht und das kann nicht richtig sein.

mfg alex


edit:// ja das reicht für mich aus Fettes Grinsen

Ich brauche keine Signatur
Avatar user-255
28.05.2006 14:52

Original von user-118
Kann sein, obwohl deine Code wieder mit den Cat_ids arbeitet und da um 1 erhöht bzw. abzieht und das kann nicht richtig sein.

Und was macht dann user-317 mit seiner Kanone? Die Matrix ändern? ...

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-118
28.05.2006 14:58

Original von user-255
Original von user-118
Kann sein, obwohl deine Code wieder mit den Cat_ids arbeitet und da um 1 erhöht bzw. abzieht und das kann nicht richtig sein.

Und was macht dann user-317 mit seiner Kanone? Die Matrix ändern? ...


Er ändert immer nur die cat_order , du hast jedoch , soweit ich das richtig verstehe

.($a=='up'?($cat_id-1)traurig$cat_id+1));


die cat_id entweder +1 oder -1 genommen. Da die Cat_id aber im Grunde keinen Einfluss auf die cat_order hat, kann das nicht stimmen.

du hast an dieser Stelle sicherlich cat_order gemeint, oder ?

mfg Alex

Ich brauche keine Signatur
Avatar user-317
28.05.2006 14:59

Das stimmt so wie ich das gemacht hab. Nur mein Code ändert gleichzeitig die Matrix :/

Avatar user-255
28.05.2006 15:05

Jetz versteh ich, was du meinst... Verdammt, eine Anfrage mehr frech

'update categories set cat_order = cat_order '.($a=='up'?'-':'+'zwinkern.' 1 where cat_id = '.$cat_id;
$order_id = 'select cat_order from categories where cat_id = '.$cat_id;
$nachbar = $a=='up' ? ($order_id-1) : ($order_id+1);
'update categories set cat_order = cat_order '.($a=='up'?'+':'-'zwinkern.' 1 where order_id = '.$nachbar;

Achtung, Pseudo-Code zwinkern
Außerdem musst drauf achten, dass die order_id auch negativ werden kann, also keine unsigned int verwenden!

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm