usergallery sortieren mit php & mysql

acid2k

Grünschnabel
Hi,

ich hab eine usergallery programmiert wo man mehrere Bilder hochladen kann.
Die Position eines Bildes kann mann durch einen button nach llinks oder nach rechts verschieben können.

ich hab jetzt das Problem dass sich die Positionen in der Datenbank verhacken
zb:
Bild 1 hat die Position 1 in der Datenbank
und Bild 2 hat die Postion 2 wenn ich auf Bild 2 nach links verschieben klicke muss
Bild 2 die Postition 1 haben und Bild 1 die Position 2

ich hab das ganze mal mit 3 Bildern versucht.
so sollte es theroetisch aussehen:
Bild 1 pos -> 2
Bild 2 pos -> 1
Bild 3 pos -> 3

und so sah mein Ergebnis in der Datenbank aus
Bild 1 pos -> 2
Bild 2 pos -> 2
Bild 3 pos -> 2

das sind 2 update Befehle die die Neupositionierung in die Datenbank eintragen

woran kann das liegen und wie kann man das problem lösen.

danke im vorraus
 
PHP:
$sql = "SELECT * FROM usergallery WHERE userid = ".$userid;

$count = $yAuth->myNumRows($sql);



$sql = "SELECT * FROM usergallery WHERE galleryid = ".$_GET["galid"];

$result = $yAuth->myQuery($sql);

$row = $yAuth->myFetchAssoc($result);

$oldPos = $row["position"];

if($_GET["act"] == "back") {

	if($oldPos > 1) {

		$newPos = $oldPos - 1;

		$sql = "SELECT galleryid FROM usergallery WHERE position = ".$newPos;

		$res = $yAuth->myQuery($sql);

		$rows = $yAuth->myFetchAssoc($res);

		

		if($newPos == 1) {

			$sql = "SELECT photo FROM usergallery WHERE userid = ".$userid." AND position = ".$oldPos;

			$avatarResult = $yAuth->myQuery($sql);

			$avatarPicInfo = $yAuth->myFetchAssoc($avatarResult);

			while(!$yAuth->myQuery("UPDATE user SET avatar='".$avatarPicInfo["photo"]."' WHERE userid = ".$userid)) sleep(1);

		}

		while(!$yAuth->myQuery("UPDATE usergallery SET position='".$newPos."' WHERE galleryid ='".$_GET["galid"]."'\n")) sleep(1);

		while(!$yAuth->myQuery("UPDATE usergallery SET position='".$oldPos."' WHERE galleryid ='".$rows['galleryid']."'")) sleep(1);

	}

}

else if($_GET["act"] == "forw") {

	if($oldPos < $count) {

		$newPos = $oldPos + 1;

		$sql = "SELECT galleryid FROM usergallery WHERE position = ".$newPos;

		$res = $yAuth->myQuery($sql);

		$rows = $yAuth->myFetchAssoc($res);

		

		if($newPos == 2) {

			$sql = "SELECT photo FROM usergallery WHERE userid = ".$userid." AND position = ".$newPos;

			$avatarResult = $yAuth->myQuery($sql);

			$avatarPicInfo = $yAuth->myFetchAssoc($avatarResult);

			while(!$yAuth->myQuery("UPDATE user SET avatar='".$avatarPicInfo["photo"]."' WHERE userid = ".$userid)) sleep(1);

		}

		while(!$yAuth->myQuery("UPDATE usergallery SET position='".$newPos."' WHERE galleryid ='".$_GET["galid"]."'")) sleep(1);

		while(!$yAuth->myQuery("UPDATE usergallery SET position='".$oldPos."' WHERE galleryid ='".$rows['galleryid']."'")) sleep(1);

	}	

}

ich habs mal mit while und sleep versucht weil ich dachte dass die abfragen sich überlappen wenn ich zwei oder dreimal hintereinander klicke hat aber nix gebracht
 
wenn du immer nur um eins verschieben willst ist es einfach

(Achtung Pseudocode ^^)
PHP:
$shift = 1; // 1 für um eins weiter, -1 für eins zurück
$aktuelle_id = 592; // oder so

$sql1 = "SELECT `pos` FROM `galerie` WHERE `id` = $id";
$aktuelle_pos = mysql_fetch_field(mysql_query($sql1), 0);
$sq2 = "UPDATE `galerie` SET `pos` = $aktuelle_pos WHERE `pos` = $aktuelle_pos + $shift";
$sql3 = "UPDATE `galerie` SET `pos` = $aktuelle_pos + $shift WHERE `id` = $aktuelle_id";

  1. Aktuelle Possition rausfinden.
  2. Das Feld auf das es geschoben wird über possitionsangabe auf das schieben wo man die ID kennt.
  3. Das Bild das verschoben werden soll per ID an die neue Possition setzen.


Edit: eben war der code noch nicht da ,)
 
@ engelb

das hab ich ja auch gemacht nur in der Datenbank verhacken sich die Positionen

wird zu 99 % nicht korekt gesetzt
 
Warum machst Du nicht ein Select auf die Bilder, findest die Positionen heraus und filterst das ganze dann nach allen Möglichkeiten durch ?

PHP:
$SQL = "SELECT id,pos FROM images where GaleryId='xxx' ";
$res = mysql_query($SQL);
$images = array();

while( $ret = mysql_fetch_array($res) ) {
  $pos = $ret['pos'];
  switch( $pos ) {
    case 1: $newpos = 2; break;
    case 2: $newpos = 3; break;
    case 3: $newpos = 1; break;
  }
  $img['id'] = $ret['id'];
  $img['pos'] = $newpos;
  array_push($images, $img);
}

for($i = 0; $i < count($images); $i++) {
  $id = $images[$i]['id'];
  $pos = $images[$i]['pos'];
  $SQL = "UPDATE images SET pos='$pos' WHERE id='$id' ";
  mysql_query($SQL);
}
 
Warum machst Du nicht ein Select auf die Bilder, findest die Positionen heraus und filterst das ganze dann nach allen Möglichkeiten durch ?

PHP:
$SQL = "SELECT id,pos FROM images where GaleryId='xxx' ";
$res = mysql_query($SQL);
$images = array();

while( $ret = mysql_fetch_array($res) ) {
  $pos = $ret['pos'];
  switch( $pos ) {
    case 1: $newpos = 2; break;
    case 2: $newpos = 3; break;
    case 3: $newpos = 1; break;
  }
  $img['id'] = $ret['id'];
  $img['pos'] = $newpos;
  array_push($images, $img);
}

for($i = 0; $i < count($images); $i++) {
  $id = $images[$i]['id'];
  $pos = $images[$i]['pos'];
  $SQL = "UPDATE images SET pos='$pos' WHERE id='$id' ";
  mysql_query($SQL);
}

Deine Lösung ist im endeffekt die selbe wie meine.
Ausserdem kann ich das switch / case nicht einbauen weil
sich die Anzahl der Bilder nicht fest ist variiren.

ich lese die datenbank aus rechne anhand der position die neue position aus
gebe dem bild die neue position mit update und dem foto mit dem es sozusagen plätze taust geb ich die alte position. trozdem wird da was verhackt

hier mein tabellen auszug:

galleryid userid photo position
127 1 303630779.gif 1
129 1 3028220.jpg 2
790 1 809502679.jpg 3
 
Am besten prüfts du jedesmal vor einem Update-Statement die verschiedenen Positionen, indem du dir z.b. mit "echo" die Variablen ausgibst. So findest du ziemlich schnell heraus, wo genau dein Fehler liegt.
 
Aslso ich habe es jetzt nochmal vereinfacht zur Übersicht.
Im folgendem Scrpit kann man nur das Bild nach links verschieben.
Beim ausprobieren haben die beiden Bilder mit der Pos. 1 und 2.
ihre positionen nicht vertauscht sondern beide haben nun die Pos. 1
Das ist das Problem was ich nicht lösen konnte.
Es Interessiert mich aber auch woran das liegen mag

PHP:
if($_GET["op"] == "send") {
	$sql = "SELECT * FROM usergallery WHERE galleryid = ".$_GET["galid"];
	$result = $y->myQuery($sql);
	$row = $y->myFetchAssoc($result);
	$oldPos = $row["position"];

	if($_GET["act"] == "back") {
		if($oldPos > 1) {
			$newPos = $oldPos - 1;
			$sql = "SELECT galleryid FROM usergallery WHERE position = ".$newPos;
			$res = $y->myQuery($sql);
			$rows = $y->myFetchAssoc($res);
			
			$y->myQuery("UPDATE usergallery SET position='".$newPos."' WHERE galleryid ='".$_GET["galid"]."'");
			$y->myQuery("UPDATE usergallery SET position='".$oldPos."' WHERE galleryid ='".$rows['galleryid']."'");
		}
	}
	else if($_GET["act"] == "forw") {
	# todo:
	}
	
	echo "oldpos -> ".$oldPos;
	echo "<br>";
	echo "newpos -> ".$newPos;
	echo "<br><br><br>";
}

$sql = "SELECT * FROM usergallery WHERE userid = 1 ORDER BY position ASC";
$result = $y->myQuery($sql);
while($row = $y->myFetchAssoc($result)) {
	echo "<a href=\"?op=send&act=back&galid=".$row["galleryid"]."\"><</a> - ";
	echo "<a href=\"?op=send&act=forw&galid=".$row["galleryid"]."\">></a>" ;
	echo "<a href=\"".$row["photo"]."\"><img src=\"".$row["photo"]."\"></a>\n";
}
 
Am besten prüfts du jedesmal vor einem Update-Statement die verschiedenen Positionen, indem du dir z.b. mit "echo" die Variablen ausgibst. So findest du ziemlich schnell heraus, wo genau dein Fehler liegt.

@rotsch

mach ich ich lass die newpos und oldpos ausgeben und die ausgabe stimmt 100%

ich bin mit meinem latein am ende
 
Zurück