Willkommen in der Webstatt
User-1 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?
User-2 am 28.05.06 12:45

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

User-1 am 28.05.06 12:47

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

User-3 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...

User-1 am 28.05.06 12:55

Quote
Original von xyz-163
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

User-3 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. :)

User-4 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.

User-1 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

User-4 am 28.05.06 13:39

Bitte. Wenn ich noch weiter ausholen muss, sags.

User-1 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());
}

User-4 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;
}
?>

User-1 am 28.05.06 15:11

xyz-48ke 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 ?

User-4 am 28.05.06 15:23

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

User-1 am 28.05.06 16:12

Erstmal vielen dank xyz-207, 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());
}
}
}

User-5 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));

User-4 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.

User-1 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

User-5 am 28.05.06 16:52

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

User-1 am 28.05.06 16:58

Quote
Original von xyz-145
[quote]Original von xyz-8
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 xyz-207 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

User-4 am 28.05.06 16:59

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

User-5 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