Menueeintraege neu nummerieren

Loddar1

Erfahrenes Mitglied
HiHo Ich habe ein kleines Problem,
Ich habe mir ein Menue erstellt mit sql wo ich per php meine Menueeintraege taetigen kann,
klappt auch alles wunderbar.
Wenn ich aber jetzt einen Menueeintrag an einer anderen Stelle haben will, will ich es neu nummerieren.
Dazu habe ich mir ein feld in der DB gemacht order_new
aber das sneu sortieren geht nicht, es kommt die Meldung: Fehler beim Umbenennen der Kategorie.
Hier mal die DB:
PHP:
$sqlquery[]= "CREATE TABLE `dyn_menu` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `label` VARCHAR(50) NOT NULL DEFAULT '',
  `link_url` VARCHAR(100) NOT NULL DEFAULT '',
  `parent_id` INT(11) NOT NULL DEFAULT '0',
  `order_new` INT(11) NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;";
$tbl_data[] = "INSERT INTO `dyn_menu` VALUES (1, 'Home','index.php?loc=sites/start.php', '0','1');";
$tbl_data[] = "INSERT INTO `dyn_menu` VALUES (2, 'Eigene Seite','index.php?loc=sites/eigene.php&jump=jump', '0','2');";
$tbl_data[] = "INSERT INTO `dyn_menu` VALUES (3, 'Seite erstellen','index.php?loc=sites/eigene.php&jump=1', '2','3');";
$tbl_data[] = "INSERT INTO `dyn_menu` VALUES (4, 'Offene/User Seite','index.php?loc=sites/eigene.php&jump=2', '2','4');";
$tbl_data[] = "INSERT INTO `dyn_menu` VALUES (5, 'Gruppen Seite','index.php?loc=sites/eigene.php&jump=3', '2','5');";
$tbl_data[] = "INSERT INTO `dyn_menu` VALUES (6, 'News','index.php?loc=sites/news.php', '0','6');";

Und hier mal der php Code:
PHP:
// Updateformular anzeigen 
if($action==umben)
{
echo'<form action="index.php?loc=admin/admin.php&amp;action=update" method="post"><table class="center">';
echo'<tr><td style="width:20px;">ID:</td><td style="width:150px;">Kategorie:</td><td style="width:70px;">Nummer:</td><td style="width:70px;">Neue Folge:</td></tr>';
$result=mysql_query("SELECT * FROM dyn_menu ORDER BY id ASC");
while ($l1 = mysql_fetch_array($result))
{
echo '<tr><td style="width:20px;">'.$l1[id].'</td><td style="width:150px;">'.$l1[label].'</td><td style="width:20px;">'.$l1[order_new].'</td><td style="width:20px;"><input name="order_neu" type="text" size="4" value="'.$l1[order_neu].'" /></td></tr>';
}
echo'<tr><td style="width:20px;"></td><td style="width:120px;"><input name="action" value="umbenennen" type="submit" /></td></tr></table></form>';
}
// Update schreiben 
if($action==update)
{
$update_main=mysql_query("UPDATE dyn_menu Set order_neu = '$_POST[order_new]' WHERE id='$_GET[id]'");
if ($update_main==true)
		{
		echo '<p class="center">Kategorienfolge wurde ge&auml;ndert !</p>';
		}
		else { echo '<p class="center">Fehler beim Umbenennen der Kategorie</p>';}
}

Sieht einer von euch einen Fehler?
würde mich sehr freuen...
 
Hallöle,
der Fehler liegt daran, dass du beim Erstellen der DB eine Spalte "order_new" nennst und diese dann im UPDATE mit "order_neu" betitelst (vertauscht).
Folglich müsste dein Code (hier nur im Ausschnitt) so aussehen:

PHP:
$update_main=mysql_query("UPDATE dyn_menu Set order_new = '$_POST[order_neu]' WHERE id='$_GET[id]'");

Kann auch sein, dass ich mich täusche - hab das ganze nur mal eben überflogen ;)
 
Habe es gerade ausprobiert, ist es leider nicht.
Das script gibt mir jetzt die Antwort: Kategorienfolge wurde geändert !
Aber die Zahlen in order_new bleiben die alten.
 
Habe bei genauerem Hinsehen gerade mal folgendes entdeckt:

PHP:
<input name="order_neu" type="text" size="4" value="'.$l1[order_neu].'" /></td></tr>';

Wird dann das Feld sein, welches die Reihenfolge neu definiert. Jedoch bekommt es als Wert das Ergebnis der DB-Abfrage, welche hier nicht existieren kann ($l1[order_neu]), da du keine solche Spalte mit dem Namen "order_neu" in deiner DB-Tabelle hast.

Als Alternative könnte man das ganze so machen:
Du zeigst die derzeitige Menünummerierung auf und lässt den Anwender seine neue festlegen (Bsp.: durch Kommata getrennt).
Dann wird das ganze aufgeschlüsselt und in einem Array gespeichert mit einer Schleife ausgelesen und in die DB eingetragen (UPDATE)...
Nur so als Vorschlag :-)
 
Bin leider kein php Guru,
das script ist aus dem Netz, ein Tutorial in englisch wo nur der code stand
wie erstellt man denn solche schleife?
 
(!) Das wird jetzt ein wenig umfangreich (!)
ich habe dein Script mal ein bisschen umgeschrieben (eigentlich komplett :-)). Den Code poste ich nachfolgend und eine Erklärung des Codes folgt danach:

Hier erstmal der Code an sich:
PHP:
<?php
$action = $_GET['action'];
//Formular anzeigen
if($action==umben) {
	echo"
	<form method='POST' action='$PHP_SELF'>
	<table border='0' cellspacing='0' Cellpadding='0' align='center' width='300'>
		<th>Alte Folge</th>
		<th>Neue Folge</th>";
		
//DB-Abfrage der alten Folge, welche ausgegeben wird + neue Felder zum eintragen
	@$db = new mysqli('localhost', 'root', '', 'test');
	//Verbindungsprüfung
	if(mysqli_connect_errno()) {
	printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
	exit();
	}
	
	$Abfrage_alt = mysqli_query($db, "SELECT * FROM dyn_menu ORDER BY order_new");
	//Array definieren -> Label Zugehörigkeit
	$Label = array();
	$i = 0;
	while(@$datensatz = mysqli_fetch_array($Abfrage_alt)) {
		extract($datensatz);
	
	echo"
	<tr>
		<td>$label</td>
		<td align='center'>
		<input type='text' name='$i' maxlength='4' size='4'>
		</td>
	</tr>";
	//zusätzlich noch ein Array, um die $label zu registrieren
	$Label[$i] = "$label";
	$i++;
	}
		
	echo"
	<tr>
	<td colspan='2'>
	<input type='submit' name='umbenennen' value='Speichern'>
	</td>
	</tr>
	</table>
	</form>
	";
	
if(isset($_POST['umbenennen'])) {
	//Anzahl der Elemente des Arrays -> für die Zählvariable der Schleife notwendig
	$Anzahl_Elemente = count($Label);
	//um 1 verringern da der Array-Index bei 0 beginnt
	for($z = 0; $z<=$Anzahl_Elemente-1; $z++) {
		$update = mysqli_query($db, "UPDATE dyn_menu SET order_new = '$_POST[$z]' WHERE label = '$Label[$z]'");
		if($update) { echo"<font>Hat funktioniert</font><br>";}
	}
}
}
?>

Also:
Es ist erstmal notwendig zu erwähnen, dass du auf diese Seite verlinkst und einen entsprechenden Parameter an die URL übergibst (...?action=umben).
Die 2. Zeile speichert den Wert dieses Parameters in der Variable $action.
Der nächste Teil sollte klar sein -> es wird der Wert der Variablen $action überprüft - ist dieser "umben" so wird der nachfolgende Teil ausgeführt.

Du siehst, dass ich per echo ein Formular ausgeben lassen habe (das design dessen ist natürlich variabel und du kannst dir das ganze auch anders aufbauen - es geht ja um die Technik im Hintergrund)
Ich baue also eine Datenbankverbindung auf (hab meine Daten mal drin gelassen -> fauler Mensch :-) -> müsstest du deine mal noch eintragen)
Als nächstes wird eine DB-Abfrage durchgeführt, welche dann in einer while Schleife verarbeitet und ausgegeben wird.

Vorher wird noch ein Array definiert, welches den Wert der Label aus der DB entgegennimmt, damit wir später eindeutig zuordnen können welches Eingabefeld zu welchem Label gehört.
Weiterhin wird eine Zählvariable "$i" initialisiert, die vorherigen Schritt möglich macht.

Zum Schluss wird jetzt geprüft, ob wir den Speichern-Button gedrückt haben.
Wenn dies der Fall ist, wird die Anzahl der Elemente im Array ermittelt, welche uns vorgibt, wie weit wir mit der 2. Zählvariablen "$z" hochzählen müssen.
Nun werden die Werte aus den INPUT-Feldern abgefragt, welche wir in Verbindung mit der Zählvariablen und dem Array eindeutig einem Label zuordnen können -> das ganze "updatet" die Zeile in der DB.

Übrigens ist noch nicht alles komplett (ging ja um den Prozess dahinter):
Man sollte beispielsweise noch abfangen, wenn ein Feld leer bleibt (oder mehrere) und ob nur numerische Werte darin gespeichert wurden....
Und ja - man kann es auch noch schöner machen -> keine x-fachen UPDATE-Bestätigungen zum Schluss :-(


Hoffe das reicht dir als Erklärung aus, ansonsten nochmal nachfragen.

P.S. habs bei mir unter XAMPP getest und es funktioniert.
 
Zurück