(Musik-)Charts-Tabelle erstellen/verwalten

Also, ich hab mich jetzt für die Version von Fanste entschieden (Sry Dennis :P ).
Jetzt hab ich aber ein Problem bei der Ausgabe: Wenn ich die Top20 habe, und dann sortieren lasse, erhalte ich ja den Rang als Zahl. Bei der Ausgabe setzt er mir aber Rang 11, 12, 13 usw VOR Rang 2, d.h. er sortiert alphabetisch. Wie krieg ichs hin, das er eine "normale" Reihenfolge einhält?
 
Zuletzt bearbeitet:
Wie sortierst du denn? Per MySql, oder einer PHP Funktion?

Dieser Code würde bei mir richtig sortieren. (PHP Funktion)
PHP:
<?
$ar = array(23, 11, 2, 34, 10, 13, 12, 3, 5, 17);

print_r($ar);
sort($ar);
print_r($ar);
?>
Wenn nach Keys sortiert werden soll, musst du ksort() nehmen.


Bei MySql dürfte es nicht viel anders sein.

SQL:
SELECT * FROM tabelle ORDER BY spalte ASC
 
Die koenntest mittels sprintf() alle Zahlen auf eine bestimmte Laenge formatieren, also, dass bei Bedarf fuehrende Nullen eingefuegt werden. Dann sollte die Sortierung kein Problem darstellen.

Und es stoert mich nicht, dass Du Dich nicht fuer meine Loesung entschieden hast. Ich muss ja nicht immer mit der besten Loesung um die Ecke kommen. Vor allem weil ja mein Vorschlag ja auch nicht individuell zusammengestrickt sondern nur fix aus einem fertigen Script rauskopiert war.
 
Meine war auch nicht frisch zusammengestrickt. Einfach aus meinem Forum rausgerissen. Hat aber seinen Zweck erfüllt, so wie es aussieht.
 
Das Problem ist zwar schon gelöst, aber ich hoffe ich darf hier meinen Vorschlag noch posten, hab mir das jetzt so durchgelesen und die einfachste Methode für mich wäre:

1 MySQL Tabelle mit: ID (auto_increment),Titel,Interpret,Platz,PlatzVW, Datum etc.(was du noch so brauchst)

wenn du zum Beispiel ne Umfrage wegen der Titel laufen hast, wo die Besucher abstimmen, dann eben noch nen Counter einbauen und dann nach Counter Sortieren oder so.

Jetzt einfach kurz erklärt:

Nach einer gewissen Zeit, geschieht folgendes:

1.Schritt: Alle Plätze nach PlätzeVW kopieren
2.Schritt: Plätze neu eintragen (nach Counter sortieren)
3.Schritt: Datum aktualisieren

und Ausgabe machst du dann einfach so:

PHP:
$query="SELECT * FROM Tabelle SORT BY Platz;
	$res=mysql_query($query);
	
	
	echo "<table>
while($row = mysql_fetch_array($res)){
	extract($row);
	
	echo "<tr><td>$Platz</td><td>$Titel</td><td>$Interpret</td><td>$PlatzVW</td></tr>";
	  }
	echo "</table>";

Bitte schau dir das mal an und sag mir falls ich jetzt falsch gedacht habe
 
So, ich hab jetzt den ganzen Tag dran rumprobiert (zum Glück weiß das mein Chef nicht ^^ ) und hab es NICHT zum laufen bekommen. *grml*

Was ich haben will:
- 10 zeiliges Formular
- pro Zeile 2 Inputfelder (eins für Interpret eins für Titel)
- alle 20 Inputfelder sollen "gleichzeitig", also ohne extra auf "edit" oder so zu klicken zu bearbeiten sein, also 1! Formular.
- somit dann ein einziger Speicherbutton, der alle 20 Felder in einer Datenbank speichert
- vor jeder Zeile einen Pfeil für aufwärts und einen Pfeil für abwärts verschieben

Was ich habe:
- 10 Zeilen á 2 Inputfelder, das Formular, den Speicherbutton

Was funktioniert:
- manuelles ändern der Titel und Interpreten

Was ich zum verrecken nicht hingekriegt hab:
- sortieren der Einträge mit der aufwärts/abwärts-Funktion...
- Ausgabe sortiert nach Rang...

UND JETZT IST MEIN !$"§$!$"§$"§$"§$ EDITOR ABGESTÜRZT! Und hat die Datei mit einer Größe von 0 Byte zurückgelassen... *wut* *puuuuuure-wut*

ich hab kein Bock mehr
 
Bevor du den Kram jetzt noch vor lauter Wut in die Ecke pfefferst, was du wahrscheinlich eh schon gemacht hast ;), helfen wir dir lieber mal:

Ich fange direkt bei der Sortierung an.

Du brauchst bei jedem Chartplatz zwei, in Zahlen 2, Button.
Nummer 1 hat die URL: script.php?rank=+&id=CHARTID (Button für Aufwärts)
Nummer 2 hat die URL: script.php?rank=-&id=CHARTID (Button für Abwärts)

Die Datei script.php
PHP:
<? 
#unsere Sortierfunktion
function reorder($rerank, $chartID) 
{ 
    $sql = "UPDATE `charts` SET `chart_order` = `chart_order` ".$rerank." 15 WHERE `id` = ".$chartID."";
    mysql_query($sql) or die(mysql_error());

    $sql = "SELECT * FROM `charts` ORDER BY chart_order ASC"; 
    $result = mysql_query($sql) or die(mysql_error()); 

    $i = 1; 
    $j = 10; 

    while( $row = mysql_fetch_assoc($result) ) 
    { 
        $sql = "UPDATE `charts` 
            SET `chart_order` = ".$j.", 
            SET `chart_place` = ".$i." 
            WHERE `id` = ".$row['id']; 
        mysql_query($sql) or die(mysql_error()); 

        $j += 10; 
        $i++; 
    } 

    return true;

} 

#Datenbankverbindung aufbauen

if(isset($_GET['rank']) && isset($_GET['id']) && !empty($_GET['rank']) && !empty($_GET['id']) &&  is_numeric($_GET['id']))
{
     if($_GET['rank'] == '+' || $_GET['rank'] == '-')
     {
          $done = reorder($_GET['rank'],$_GET['id']);

          if($done == true)
          {
                echo "Erfolgreich geupdatet";
          }
     }
     else
     {
          die('Nicht gültige Option');
     }
}
else
{
     die('Nicht alle benötigten Daten angegeben.');
}
?>
Sollte so klappen.

Zum Auslesen:
Zwei Möglichkeiten

PHP:
$sql = "SELECT * FROM `charts`";
$result = mysql_query($sql) or die(mysql_error());

$charts = array();

while($row = mysql_fetch_assoc($result))
{
     $charts[$row['chart_place']] = $row;
}

ksort($charts);
print_r($charts);
SQL:
SELECT * FROM `charts` ORDER BY `chart_place` ASC
Hier dann ganz normal weiter. Ohne irgendwelche PHP Funktionen zum sortieren.


Ich hoffe, dass ich jetzt keine Denk-/Schreibfehler im Code habe. Wenn doch, nicht steinigen ;)

Mach mals Beste daraus. Und evt ein bisschen Pause von dem ganzen Stress :)

EDIT:
Doch nen kleinen Fehler gehabt. Bei den Links muss jeweils die 15 weg.
 
Zuletzt bearbeitet:
So, da bin ich wieder! Wieder ein wenig motivierter und auch schon mit (meiner Meinung nach) beachtlichen Ergebnissen :)

Vorweg sei gesagt: das Verschieben klappt nur zu 50% *ggg*

Hier mal mein Code (mit extra vielen Kommentaren :) ):
PHP:
<? 
/////////////////////////////
// unsere Sortierfunktion	//
/////////////////////////////
function reorder($rerank, $chartID)
{
	$sql = "UPDATE `charts_club` SET `chart_order` = `chart_order` ".$rerank." 15 WHERE `id` = ".$chartID."";
	mysql_query($sql) or die(mysql_error());

	$sql = "SELECT * FROM `charts_club` ORDER BY chart_order ASC";
	$result = mysql_query($sql) or die(mysql_error());

	$i = 1;
	$j = 10;

	while( $row = mysql_fetch_assoc($result) )
	{
		$sql = "	UPDATE `charts_club`
            	SET 
            		`chart_order` = ".$j.",  
         			`chart_place` = ".$i."  
            	WHERE `id` = ".$row['id'];  
		mysql_query($sql) or die(mysql_error());

		$j += 10;
		$i++;
	}

	return true;

}


/////////////////////////////
// Updaten						//
/////////////////////////////
if(isset($_GET['rank']) && isset($_GET['id']) && !empty($_GET['rank']) && !empty($_GET['id']) &&  is_numeric($_GET['id']))
{
	if($_GET['rank'] == "+" || $_GET['rank'] == "-")
	{
		$done = reorder($_GET['rank'],$_GET['id']);

/* Auskommentiert, weil Bestätigung nicht benötigt

	if($done == true)
		{
			echo "Erfolgreich geupdatet";
		}*/
	}
	else
	{
		echo 'Nicht gültige Option';
	}
}

/////////////////////////////
// Speichern der Titel		//
/////////////////////////////

if ($_GET['speichern'] == "ja") {
	for ($i=10; $i<=100; $i=$i+10){
		mysql_query("UPDATE charts_club SET titel = '".$_POST[$i]."' WHERE chart_order = '".$i."'");
}
}

/////////////////////////////
// Formular						//
/////////////////////////////

echo '<div align="center" style="margin:10px" class="d14swb">Verwalten der Charts</div>';
echo '<table align="center" cellpadding="5px" cellspacing="0">';
echo '<form name="formular" action="index.php?speichern=ja" method="POST">';

$i = 1;  // Platzierung (1-10)
$j = 10; // die Chart-Platzierung in der Tabelle

$sql = "SELECT * FROM `charts_club` ORDER BY chart_order ASC";
$result = mysql_query($sql) or die(mysql_error());

while ($row = mysql_fetch_assoc($result)) {
	echo '<tr>';
	echo '<td align="center">';
	if ($i!=1) { // Aufwärts schieben, aber nicht beim ersten
	echo '<a href="index.php?rank=-&id='.$row['id'].'"><img hspace="5px" src="icons/rauf.png"></a>';
	}
	if ($i!=10) { // Abwärts schieben, aber nicht beim letzten
	echo '<a href="index.php?rank=+&id='.$row['id'].'"><img hspace="5px" src="icons/runter.png"></a>';
	}
	echo '</td>';
	echo '<td>';
	echo '<div align="right" class="d12swb">'.$i.'.</div>'; // Platzierung
	echo '</td>';
	echo '<td>';
	echo '<input type="text" class="i10sw" size="80" value="'.$row['titel'].'" name="'.$j.'">'; // Inputfeld in dem der Track steht
	echo '</td>';
	echo '</tr>';

	$i++;
	$j += 10;
}
?>
	<tr>
		<td colspan="3" align="center">
			<input type="submit" name="submit" value="Speichern">
		</td>
	</tr>
	</form>
</table>


Heraufschieben geht jetzt wunderbar. Herabschieben jedoch nicht. Ich habe den Fehler meiner Meinung nach soweit eingegrenzt, dass ich denke, dass es daran liegt, dass man kein "+" in einen SQL-Query schreiben darf:

PHP:
//Sieht der Query so aus, funktioniert es nicht
$sql = "UPDATE `charts_club` SET `chart_order` = `chart_order` + 15 WHERE `id` = 1";

// So funktioniert es jedoch:
$sql = "UPDATE `charts_club` SET `chart_order` = `chart_order` - 15 WHERE `id` = 1";

Wie umgehe ich das Problem?

Und nochwas, ist aber eher off-topic:

Wenn ich für den Tabellennamen eine Variable einsetzen möchte,
PHP:
$tabelle = "charts_club";

function reorder($rerank, $chartID) {
$sql = "UPDATE ".$tabelle." SET chart_order = 'chart_order ".$rerank." 15' WHERE id = ".$chartID."";
mysql_query($sql) or die(mysql_error());
}

erhalte ich die Fehlermeldung:
Code:
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 'SET chart_order = 'chart_order - 15' WHERE id = 2' at line 3

Warum? wenn ich $tabelle = "charts_club"; mit in die Funktion schreibe, dann gehts ?
 
Zuletzt bearbeitet:
Man darf schon ein Plus in einer MySql Anweisusung haben. Habe es gerade ausprobiert. Führe so einen Query doch mal von Hand in aus (PhpMyAdmin, oder so).
Bekommst du denn eine Fehlermeldung? Wenn ja, welche? Oder passiert einfach nur nichts? Lasse dir mal das $_GET['rank'] ausgeben, umzu schauen, ob auch wirklich ein Plus ankommt.

Dann ist mir in deinem Script nur ein Fehler aufgefallen. Du hast beim erstellen des Minus-Links nrank statt rank geschrieben. Aber das dürfte nichts mit dem Problem zu tun haben.
 
Zurück