Willkommen in der Webstatt Zum Webstatt Blog und Stories
Al3x0r Al3x0r am 28.05.06 12:35

Hallo liebe Community :D

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'");
$row = mysql_fetch_object($query);
$query2=mysql_query("SELECT `cat_order` FROM `categories` WHERE `cat_id` = '$cat_id+$move'");
$row2 = mysql_fetch_object($query2);
$query3 = ("UPDATE `categories` SET `cat_order` = '$row->cat_order+$move' WHERE `cat_id` = '$cat_id'");


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

netcup.de Warum gibt es hier Werbung?
BNightSpeeder am 28.05.06 12:45

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

Al3x0r Al3x0r am 28.05.06 12:47

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

okraina am 28.05.06 12: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...

Al3x0r Al3x0r am 28.05.06 12:55

Quote
Original von okraina
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

okraina am 28.05.06 12: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. :)

Sven Sven am 28.05.06 13: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'")
mysql_query ("UPDATE cats SET cat_order+1 WHERE cat_id='". $row['cat_id'] . "'");


Hoffe der Ansatz hilft dir.

Al3x0r Al3x0r am 28.05.06 13: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

Sven Sven am 28.05.06 13:39

Bitte. Wenn ich noch weiter ausholen muss, sags.

Al3x0r Al3x0r am 28.05.06 13: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. :D

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'") 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']."'") 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 ! :D




edit2://

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


if ($mode == "cat_order") {
$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'") 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'") or die(mysql_error());
$query2 = mysql_query("UPDATE `categories` SET `cat_order` = '".$new_cat_order."' WHERE `cat_id` = '$cat_id'") or die(mysql_error());
}

Sven Sven am 28.05.06 15:02

So, schau dir das mal an :)
<?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'") // Setze Cat_order vom darüberliegenden Eintrag cat_order - 1
mysql_query ("UPDATE cats SET Cat_order+1 WHERE Cat_id='$teh_id'"); // 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'") // Setze Cat_order vom darunterliegenden Eintrag cat_order + 1
mysql_query ("UPDATE cats SET Cat_order-1 WHERE Cat_id='$teh_id'"); // Setze Cat_order vom Eintrag cat_order - 1
break;
}
?>

Al3x0r Al3x0r am 28.05.06 15:11

Danke schön.

ich habe es nun angepasst:

if ($mode == "cat_order") {
// 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'") 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'") 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'") 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'") 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 ?

Sven Sven am 28.05.06 15:23

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

Al3x0r Al3x0r am 28.05.06 16:12

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

if ($mode == "cat_order") {
// 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") {
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']."'") or die(mysql_error());
mysql_query ("UPDATE `categories` SET `cat_order` = '".($row['cat_order']+1)."' WHERE `cat_id` = '".$cat_id."'") or die(mysql_error());
}
}
if ($move == "up") {
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']."'") or die(mysql_error());
mysql_query ("UPDATE `categories` SET `cat_order` = '".($row['cat_order']-1)."' WHERE `cat_id` = '".$cat_id."'") or die(mysql_error());
}
}
}

milahu milahu am 28.05.06 16:42

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

Sven Sven am 28.05.06 16:44

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

Al3x0r Al3x0r am 28.05.06 16: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 :D

milahu milahu am 28.05.06 16:52

Quote
Original von Al3x0r
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 Sven mit seiner Kanone? Die Matrix ändern? ...

Al3x0r Al3x0r am 28.05.06 16:58

Quote
Original von milahu
[quote]Original von Al3x0r
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 Sven mit seiner Kanone? Die Matrix ändern? ...[/quote]

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

.($a=='up'?($cat_id-1):($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

Sven Sven am 28.05.06 16:59

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

milahu milahu am 28.05.06 17:05

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

'update categories set cat_order = cat_order '.($a=='up'?'-':'+').' 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'?'+':'-').' 1 where order_id = '.$nachbar;

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

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt