# PHP/mySQL - Reihenfolge für Navigation in Datenbank ändern



## _root (23. Juli 2008)

Mahlzeit,

Ich bin gerade dabei ein klitzekleines CMS zu bauen. Ich habe hier eine Auflistung aller bereits erstellten Seiten. 




Jetzt möchte ich gerne über die Pfeile die Sortierung ändern. Z.B. das Home ganz nach oben kommt. Leider habe ich da absolut kein Schimmer wie ich das anstellen köntne. Vielleicht kann mir ja jemand bei meinem Problem helfen.

Hier noch der Code von der oberigen Darstellung.


```
<table width="100%" border="0">
	<tr>
		<td width="40%" style="border-bottom:1px #000000 solid"><strong>Name</strong></td>
		<td width="20%" style="border-bottom:1px #000000 solid"><strong>bearbeiten</strong></td>
		<td width="20%" style="border-bottom:1px #000000 solid"><strong>sorieten</strong></td>
		<td width="20%" style="border-bottom:1px #000000 solid"><strong>löschen</strong></td>
	</tr>
<?
	while($seite = mysql_fetch_array($res)) {
?>
	<tr>
		<td><img src="Bilder/seite.png" width="10" height="12" style="padding-right:5px "><? echo "$seite[titel]"; ?></td>
		<td><a href="?id=Editor2&edit_id=<? echo $seite[id]; ?>"><img src="Bilder/icons/sheet_edit.gif"></a></td>
        <td><img src="Bilder/ab.png" width="11" height="10"><img src="Bilder/auf.png" width="11" height="10"></td>
		<td><a href="?id=delete_seite"><img src="Bilder/icons/sheet_del.gif" width="14" height="14" border="0"></a></td>
	</tr>
<?
	}
?>

  <tr>
    <td colspan="3">&nbsp;</td>
  </tr>
  <tr>
    <td colspan="3"><img src="Bilder/icons/sheet_add.gif" width="14" height="14"> <a href="?menu=seitenverwaltung&id=seite_anlegen">hinzuf&uuml;gen</a> </td>
  </tr>
</table>
```

MfG Tobi


----------



## Gumbo (23. Juli 2008)

Schau mal hier: [post=1535393]"Verschieben" von Datensätzen[/post]


----------



## splasch (23. Juli 2008)

Am einfachsten machste noch eine sortier Spalte dazu dann kanste das in der Reihenfolge ausgeben wie du möchtest.

Mfg Splasch


----------



## _root (23. Juli 2008)

Ich habe hier mal das "Script" aus dem anderen Thread... das sind irgendwie komische Zeichen drin. Soll das so ein?



Gumbo hat gesagt.:


> Prinzipiell müsste es wie folgt funktionieren: SortID wird verringert (?_neue Position_? < ?_alte Position_?):
> 
> 
> 
> ...


----------



## Gumbo (23. Juli 2008)

Das sind Platzhalter. Die Abfragen sind auch nur schematisch.


----------



## _root (23. Juli 2008)

kannst du das mit ?neue Position? und ?alte Position? vielleicht nochmal ein bisschen genauer erklären?

MfG Tobi


----------



## Gumbo (23. Juli 2008)

Wenn ein Datensatz von Position _a_ nach Position _b_ verschieben möchtest, ist ?_alte Position_? = _a_ und ?_neue Position_? = _b_.


----------



## _root (24. Juli 2008)

```
mysql_db_query("$mysqlname", "UPDATE `seiten` SET `SortID` = '$sortid' WHERE `SortID` = '$sortid'+1");
mysql_db_query("$mysqlname", "UPDATE `seiten` SET `SortID` = '$sortid'+1 WHERE `SortID` = '$sortid'");
```

Eigentlich müsste es doch so gehen oder nicht? Leider klappt es aber nicht wie gewüscht.


----------



## Gumbo (24. Juli 2008)

Wenn dir nur „SortId“ als Identifizierungsmerkmal zur Verfügung steht, musst du einen der beiden zu vertauschenden Datensätze erst eine neue temporäre „SortId“ zuweisen, um ihn so quasi auszukoppeln. Denn andernfalls haben die beiden Datensätze dieselbe „SortId“, wie es auch bei dir der Fall ist.


----------



## _root (24. Juli 2008)

Wie müsste es denn aussehen wenn ich noch eine $id (autoincrement/eindeutig) zur verfügung habe?


----------



## Gumbo (24. Juli 2008)

So wie [post=1535393]bereits beschrieben[/post].


----------



## _root (24. Juli 2008)

ich habe es jetzt so, aber jetzt macht er nichtsmehr 


```
mysql_db_query("$mysqlname", 	"UPDATE `seiten` SET `SortID` = `$sortid`+1 WHERE `SortID` BETWEEN `$sortid`+1 AND = `$sortid` `id` != '$abid'");
		mysql_db_query("$mysqlname", 	"UPDATE `seiten` SET `SortID` = '$sortid' WHERE `id` = '$abid'");
```


----------



## kuddeldaddeldu (24. Juli 2008)

Hi,

die Syntax des ersten SQL-Statements ist ja auch falsch. Schreibe die Abfrage erst mal in eine Variable und lass Dir das ausgeben. Dann siehst Du, wo die Fehler liegen.

LG


----------



## Gumbo (24. Juli 2008)

Prinzipiell müsste es wie folgt aufgebaut sein:
	
	
	



```
$posNeu = 123;
$posAlt = mysql_fetch_assoc(mysql_query('SELECT `SortID` FROM `seiten` WHERE `id` = '.$id));
if ($posNeu < $posAlt) {
	mysql_query('UPDATE `seiten` SET `SortID` = `SortID`+1 WHERE `SortID` BETWEEN '.$posNeu.' AND '.$posAlt.' `id` != '.$id);
} else {
	mysql_query('UPDATE `seiten` SET `SortID` = `SortID`-1 WHERE `SortID` BETWEEN '.$posAlt.' AND '.$posNeu.' `id` != '.$id);
}
mysql_query('UPDATE `seiten` SET `SortID` = '.$posNeu.' WHERE `ID` = '.$id);
```


----------



## kuddeldaddeldu (24. Juli 2008)

Hi,

kleine Korrektur (AND vergessen):


```
$posNeu = 123;
$posAlt = mysql_fetch_assoc(mysql_query('SELECT `SortID` FROM `seiten` WHERE `id` = '.$id));
if ($posNeu < $posAlt) {
    mysql_query('UPDATE `seiten` SET `SortID` = `SortID`+1 WHERE `SortID` BETWEEN '.$posNeu.' AND '.$posAlt.' AND `id` != '.$id);
} else {
    mysql_query('UPDATE `seiten` SET `SortID` = `SortID`-1 WHERE `SortID` BETWEEN '.$posAlt.' AND '.$posNeu.' AND `id` != '.$id);
}
mysql_query('UPDATE `seiten` SET `SortID` = '.$posNeu.' WHERE `ID` = '.$id);
```

LG


----------



## _root (25. Juli 2008)

cool, danke... leider steckt der wurm drin...


```
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\admin\seite_anzeigen.php on line 114
```


----------



## crashx (25. Juli 2008)

Vielleicht ein bischen Kompliziert und eigenwillig 
Aber es klapt.


```
if(isset($_GET['pos'])){
  $sqlmax = "SELECT * FROM `content`
             WHERE `allocate` = '".mysql_real_escape_string($url)."'
			 ORDER BY `pos` DESC
			 LIMIT 1
			";
  $result = mysql_query($sqlmax);
  $max = mysql_fetch_array($result);
  $max = $max['pos'];
  
  if($_GET['action'] == 'up'){
	if($_GET['pos'] > 1){
	  $new = $_GET['pos']-1;
	}
  }
  
  if($_GET['action'] == 'down'){
	if($_GET['pos'] < $max){
	  $new = $_GET['pos']+1;
	}
  }
  
  if($new){
    $sql001 = "UPDATE `content`
               SET `pos` = '".mysql_real_escape_string('0')."'
               WHERE `pos` = '".mysql_real_escape_string($new)."'
               AND `allocate` = '".mysql_real_escape_string($url)."'
               LIMIT 1
			  ";
    $result001 = mysql_query($sql001);
    $sql002 = "UPDATE `content`
               SET `pos` = '".mysql_real_escape_string($new)."'
               WHERE `pos` = '".mysql_real_escape_string($_GET['pos'])."'
               AND `allocate` = '".mysql_real_escape_string($url)."'
               LIMIT 1
			  ";
    $result002 = mysql_query($sql002);
    $sql003 = "UPDATE `content`
               SET `pos` = '".mysql_real_escape_string($_GET['pos'])."'
               WHERE `pos` = '".mysql_real_escape_string('0')."'
               AND `allocate` = '".mysql_real_escape_string($url)."'
               LIMIT 1
			  ";
    $result003 = mysql_query($sql003);
  }
  header('Location: '.$_SERVER['PHP_SELF'].'?id='.$_GET['id'].$sub);
}
```


----------



## kuddeldaddeldu (25. Juli 2008)

Hi,



_root hat gesagt.:


> cool, danke... leider steckt der wurm drin...
> 
> 
> ```
> ...



Dann ist die vorangehende Abfrage fehlgeschlagen. Wo passiert das denn? Lass Dir die Abfrage mal samt mysql_error() ausgeben.

LG


----------



## _root (29. Juli 2008)

crashx hat gesagt.:


> Vielleicht ein bischen Kompliziert und eigenwillig
> Aber es klapt.



Wenn ich fragen darf, wie sieht dein Formular aus?

Gruß Tobi


----------



## crashx (29. Juli 2008)

_root hat gesagt.:


> Wenn ich fragen darf, wie sieht dein Formular aus?
> 
> Gruß Tobi



Wie das Formular aussieht? 
Ich habe eine Visuelle darstellung angehängt als Bild.

Das ganze wird nicht via $_POST sondern mit $_GET übergeben.


```
echo '<a href="'.$_SERVER['PHP_SELF'].'?action=up&pos='.$row['pos'].'">';
  echo '<img src="images/ico_pos_up.jpg">';
echo '</a>';
echo '<a href="'.$_SERVER['PHP_SELF'].'?action=down&pos='.$row['pos'].'">';
  echo '<img src="images/ico_pos_down.jpg">';
echo '</a>';
```


----------



## _root (30. Juli 2008)

1000 Danke... 

Das hat mir zwar schon echt gut echt gut weitergeholfen, aber ich komme einfach nicht drauf wie deine Datenbank aufgebaut ist. z.b. kann ich mit alllocate nichts anfangen...


----------



## kuddeldaddeldu (30. Juli 2008)

Hi,

was klappt denn nun an Gumbos Variante nicht?



kuddeldaddeldu hat gesagt.:


> Hi,
> 
> Dann ist die vorangehende Abfrage fehlgeschlagen. Wo passiert das denn? Lass Dir die Abfrage mal samt mysql_error() ausgeben.
> 
> LG



LG


----------



## _root (30. Juli 2008)

da gibt er folgede meldung aus.


```
Fatal error: Unsupported operand types in C:\xampp\htdocs\admin\Kopie von seite_anzeigen.php on line 115
```

das ist folgende zeile


```
$posAlt = mysql_fetch_assoc(mysql_query('SELECT `SortID` FROM `seiten` WHERE `id` = '.$id));
$posNeu = $posAlt-1;

if ($posNeu < $posAlt) {
```


----------



## crashx (30. Juli 2008)

Die Datenbank kannst du wiefolgt aufbauen

id | pos | irgendwas | noch irgendwas | nochmal was

pos muss INT sein wie id auch.

das mit der spallte allocate hat folgenden grund

```
id | pos | allocate     | text 
1    1      index.php     hallo
2    2      index.php     hallo 2
3    3      index.php     hallo 3
4    1      weiter.php    irgendwas
5    2      weiter.php    nochmal was
6    1      neu.php       neuer text
7    2      neu.php       hallo
```
Wenn du das ganze ein wenig angepasst hast, kannst du das allocate einfach weglassen.
Wie ich schon erwähnt habe, ist das auf meiner Logik aufgebaut und die ist ziemlich komisch manchmal.


----------



## crashx (30. Juli 2008)

_root hat gesagt.:


> da gibt er folgede meldung aus.
> 
> 
> ```
> ...




```
WHERE `id` = '.$id));
```
In dieser zeile schliest du nicht richtig.


----------



## _root (30. Juli 2008)

Ist alllocate soetwas wie ein Titel der Seite?


----------



## kuddeldaddeldu (30. Juli 2008)

Hi,



_root hat gesagt.:


> da gibt er folgede meldung aus.
> 
> 
> ```
> ...



Du musst Dir die Funktionen, die Du verwendest, im Manual auch mal anschauen. mysql_fetch_assoc gibt ein assoziatives Array mit den Spaltennamen als Keys zurück. Die Position steht also in $posAlt['SortID'].

LG


----------



## crashx (30. Juli 2008)

_root hat gesagt.:


> Ist alllocate soetwas wie ein Titel der Seite?


Ich verstehe dein Problem nicht mehr ganz, du hast 2 varianten auf dem Teller Serviert bekommen, und beide passen nicht?
Kann ich nicht ganz nachvollziehen.

allocate dient dazu um mir den gewünscheten $inhalt auszugeben:
bsp.

```
$sql = "SELECT * FROM `inhalt` 
        WHERE `allocate` = '".mysql_real_escape_string($_GET['allocate']."'
        ORDER BY `pos` ASC
       ";
```
Also grob gesagt hat allocate garnichts mit dem verändern der position zu tun, relevant ist nur die Spalte pos.


----------



## Chaosengel_Gabriel (30. Juli 2008)

1.

```
$posAlt = mysql_fetch_assoc(mysql_query('SELECT `SortID` FROM `seiten` WHERE `id` = '.$id.');');
```

2.


kuddeldaddeldu hat gesagt.:


> Hi,
> Du musst Dir die Funktionen, die Du verwendest, im Manual auch mal anschauen. mysql_fetch_assoc gibt ein assoziatives Array mit den Spaltennamen als Keys zurück. Die Position steht also in $posAlt['SortID'].
> LG


----------



## demo123455 (20. November 2010)

Hallo...

auch wenn das Thema schon lange her ist: Ich bräuchte da nochma Eure Hilfe:

Meine Datenbank:

```
| id | pos | .....
| 1 |  2   |
| 2 |  1   |
usw...
```

nun habe ich den Code ein wenig verändert:


```
if(isset($_GET['pos'])){
  $sqlmax = "SELECT * FROM cms_Navigation
             WHERE id = '".$_GET['id']."'
             ORDER BY pos DESC
             LIMIT 1
            ";
  $result = mysql_query($sqlmax);
  $max = mysql_fetch_array($result);
  $max = $max['pos'];
  
  if($_GET['action'] == 'up'){
    if($_GET['pos'] > 1){
      $new = $_GET['pos']-1;
echo $new;
    }
  }
  
  if($_GET['action'] == 'down'){
    if($_GET['pos'] < $max){
      $new = $_GET['pos']+1;
echo $new;
    }
  }
  
  if($new){
    $sql001 = "UPDATE cms_Navigation
               SET pos = '".mysql_real_escape_string('0')."'
               WHERE pos = '".mysql_real_escape_string($new)."'
               AND id = '".$_GET['id']."'
               LIMIT 1
              ";
    $result001 = mysql_query($sql001) or die (mysql_error());
    $sql002 = "UPDATE cms_Navigation
               SET pos = '".mysql_real_escape_string($new)."'
               WHERE pos = '".mysql_real_escape_string($_GET['pos'])."'
               AND id = '".$_GET['id']."'
               LIMIT 1
              ";
    $result002 = mysql_query($sql002) or die (mysql_error());
    $sql003 = "UPDATE cms_Navigation
               SET pos = '".mysql_real_escape_string($_GET['pos'])."'
               WHERE pos = '".mysql_real_escape_string('0')."'
               AND id = '".$_GET['id']."'
               LIMIT 1
              ";
    $result003 = mysql_query($sql003) or die (mysql_error());
  }
}
```

und mein Formular:


```
echo '<td><a href="'.$_SERVER['PHP_SELF'].'?action=up&pos='.$navi->pos.'&id='.$navi->id.'"><img src="images/up.png"></a>
                                                            <a href="'.$_SERVER['PHP_SELF'].'?action=down&pos='.$navi->pos.'&id='.$navi->id.'"><img src="images/down.png">
                                                        </a></td>';
```


Also... Wenn ich nun auf "Down" klicke, dann verändert sich nichts, genauso wie bei "Up"! Ich frage mich nun, was mache ich falsch****


----------



## sunfox94 (14. Januar 2012)

Ich hatte das Gleiche Problem wie mein vorgänger mit dem Down funktion und hier ist die Lösung, was mit noch fehlt ist die lösung wie ich bei der ersten stelle den up nicht angezeigt wird und bei der letzten stelle down nicht angezeigt wird dann wer das Pefeckt.


```
if(isset($_GET['pos'])){
 
 $query = "SELECT MAX(`reinfolge`) AS `reinfolge` FROM ".table_prefix."kategorien";
$result = mysql_query($query);
$maxRow= mysql_fetch_array($result);

$max = $maxRow['reinfolge'];
 
 if($_GET['action'] == 'up'){
    if($_GET['pos'] > 1){
      $new = $_GET['pos']-1;
    }
  }
  
  if($_GET['action'] == 'down'){
    if($_GET['pos'] < $max){
    echo  $new = $_GET['pos']+1;
    }
  }
  if($new){
    $sql001 = "UPDATE `".table_prefix."kategorien`
               SET `reinfolge` = '".mysql_real_escape_string('0')."'
               WHERE `reinfolge` = '".mysql_real_escape_string($new)."'
               LIMIT 1
              ";
    $result001 = mysql_query($sql001);
    $sql002 = "UPDATE `".table_prefix."kategorien`
               SET `reinfolge` = '".mysql_real_escape_string($new)."'
               WHERE `reinfolge` = '".mysql_real_escape_string($_GET['pos'])."'
               LIMIT 1
              ";
    $result002 = mysql_query($sql002);
    $sql003 = "UPDATE `".table_prefix."kategorien`
               SET `reinfolge` = '".mysql_real_escape_string($_GET['pos'])."'
               WHERE `reinfolge` = '".mysql_real_escape_string('0')."'
               LIMIT 1
              ";
    $result003 = mysql_query($sql003);
  }
//  header('Location: '.$_SERVER['PHP_SELF'].'?id='.$_GET['id'].$sub);
}

?>
```

Hier der HTHML bere 

```
echo '<td><a href="'.$_SERVER['PHP_SELF'].'?action=up&pos='.$reinfolge.'&code=22&co='.$co.'&kt='.$kt.'">';
        echo '<img src="images/symbole/up.png"width="25" height="25"alt="up"titel="up">';
        echo '</a></td>';
        echo '<td><a href="'.$_SERVER['PHP_SELF'].'?action=down&pos='.$reinfolge.'&code=22&co='.$co.'&kt='.$kt.'">';
        echo '<img src="images/symbole/down.png"width="25" height="25" alt="down"titel="down">';
        echo '</a></td>';
```


----------



## Raisch (14. Januar 2012)

Alten Thread rauskramen, tzz. 

Aber ihr solltet euch mal Nested Sets anschauen.

Gruß


----------

