(Musik-)Charts-Tabelle erstellen/verwalten

Hektik

Erfahrenes Mitglied
Hallo liebe Tutorials.de-Gemeinde!

Da ich zurzeit eine Webseite für einen DJ mit PHP realisiere, bin ich auf ein, für mich jedenfalls, sehr interessantes Thema gestoßen.

Ebenjener DJ möchte gerne "monthly charts" auf seiner Seite haben, seine liebsten Stücke, und die in Form einer Charts-Tabelle präsentieren. Ich denke, sowas hat bestimmt schon jeder auf VIVA.TV oder ähnlichem gesehen.

Anfänglich wollte ich das einfach mit einem 20 mal 2 Inputfelder-Formular lösen, halt 20 Plätze und jeweils eins für den Rang und eins für das Lied. Anschließend hätte ich die Einträge dann sortiert nach Rang ausgegeben.

Ich halte das jedoch für eine "gefrickelte" Lösung, ein krummes Hinbiegen. Zudem weiß ich auch nicht, wie sich so eine Chart-Tabelle wie auf Viva generiert, also, wie das z.b. gemacht wird, dass die Vorwoche im Vergleich berechnet wird usw.

Kann mir da mal einer das System erklären? Und vielleicht, wenn er schon was kennt, ein wenig Code posten? Google und die Forensuche haben mich nur eine unnütze halbe Stunde gekostet.

Aber auch einfach eine Anregung, eine Idee zur Vorgehensweise wäre super :)

Ziel ist es, dem DJ später über ein Formular (in welcher Form auch immer) die Möglichkeit zu geben, unkompliziert und ohne großen Aufwand seine Charts aktuell zu halten.

Bis hier hin erst einmal ein "Danke" für das lesen meines Threads :)

Thread frei!
 
Hallo.
Du kannst doch ne ganz normale Tabelle erstellen.
Und die füllt dann der DJ mit den Daten.
Und über ein Formular kann er die dann immer beliebig ändern?!

Ich würde es mir nicht so schwer machen.

//Kne
 
Ich koennte mir das so vorstellen:
Bei weniger als 20 bestehenden Eintraegen wird bis 20 mit Input-Feldern aufgefuellt.
Bestehende Eintraege koennen einfach hoch und runter geschoben werden und natuerlich auch editiert werden.
 
kne hat gesagt.:
Hallo.
Du kannst doch ne ganz normale Tabelle erstellen.
Und die füllt dann der DJ mit den Daten.
Und über ein Formular kann er die dann immer beliebig ändern?!

Ich würde es mir nicht so schwer machen.

//Kne

Die Idee hatte ich ja schon... Je mehr Gedanken ich mir mache, desto mehr fallen mir Gründe ein, die gegen eine andere Lösung sprechen...

Dennis Wronka hat gesagt.:
Ich koennte mir das so vorstellen:
Bei weniger als 20 bestehenden Eintraegen wird bis 20 mit Input-Feldern aufgefuellt.
Bestehende Eintraege koennen einfach hoch und runter geschoben werden und natuerlich auch editiert werden.

Das auffüllen ist ne super Idee. Hätte ich garnicht dran gedacht *hihi* Einziger Knackpunkt deiner Lösung: Hab über das "verschieben" von Positionen schon öfter mal geknobelt, hab aber leider nie auch nur ansatzweise eine Idee gehabt, wie ich das lösen soll. Mein Problem wäre dabei: wenn ich Platz 1 runterschiebe, dann hab ich Platz 2 doppelt. Also muss ich dafür sorgen, dass Platz 2 hochgeschoben wird. Und da hörts dann auch schon auf, weil ich nicht weiß, wo und wie ich da anfangen soll. Wahrscheinlich ist die Lösung aber sooo einfach, dass ich einfach nicht drauf komme, wie damals mit "<font color:"black"> funktioniert nicht, warum?" Schäme mich heute noch für den Doppelpunkt ;)
 
Mach das ganze nicht mit 1, 2, 3, 4 usw, sondern mit einer Extraspalte (hier: chart_order) in der 10, 20, 30, 40, usw. steht.
Wenn du dann sagt, gehe von Platz 1 auf 2, zählst du zum Platz 1 (1 = 10) einfach 15 dazu. Somit sind wir bei 25. Also 5 mehr als Platz 2. Umgekehrt natürlich 15 abziehen.

Dann kommt diese Funktion zum Einsatz.
PHP:
<?
function reorder()
{
	$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++;
	}

}
?>

Ich habe jetzt folgende Spalten in der Tabelle 'charts' verwendet.
id = ID des Eintrages. bleibt immer gleich (auto_increment? !)
chart_order = Die Position in der Chartliste
chart_place = Chartplatz (Könnte man auch weglassen, wenn man nach chart_order geht, kommt man aus gleiche. Muss dann halt etwas anders bei der Ausgabe vorgehen.)

Ich hoffe, dass ich keinen Denkfehler in dem Script habe.
 
Zuletzt bearbeitet:
fanste hat gesagt.:
Mach das ganze nicht mit 1, 2, 3, 4 usw, sondern mit einer Extraspalte (hier: chart_order) in der 10, 20, 30, 40, usw. steht.
Wenn du dann sagt, gehe von Platz 1 auf 2, zählst du zum Platz 1 (1 = 10) einfach 15 dazu. Somit sind wir bei 25. Also 5 mehr als Platz 2. Umgekehrt natürlich 15 abziehen.

Dann kommt diese Funktion zum Einsatz.
PHP:
<?
function reorder()
{
	$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++;
	}

}
?>

Ich habe jetzt folgende Spalten in der Tabelle 'charts' verwendet.
id = ID des Eintrages. bleibt immer gleich (auto_increment? !)
chart_order = Die Position in der Chartliste
chart_place = Chartplatz (Könnte man auch weglassen, wenn man nach chart_order geht, kommt man aus gleiche. Muss dann halt etwas anders bei der Ausgabe vorgehen.)

Ich hoffe, dass ich keinen Denkfehler in dem Script habe.

Wenn ich nach dem Beispiel Platz 1 (10) auf Platz 2 verschiebe (10+15=25) und dann Platz 4 (40) auf Platz 3 (40-15=25) verschiebe, haben beide den Wert 25. Geht also auch nicht so richtig :/
 
So, hier mal ein Beispiel.
Ich weiss, dass es nicht gerade das verstaendlichste Beispiel ist was jetzt moeglich waere, aber grad das einzige was ich zur Hand habe.
PHP:
if (($_GET['action']=="up") && (isset($_GET['chain'])) && (isset($_GET['rule'])))
	{
		$chain_copy=$fw_chain_{$chains[$_GET['chain']]};
		$chain_copy[$_GET['rule']-1]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']];
		$chain_copy[$_GET['rule']]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']-1];
		$fw_chain_{$chains[$_GET['chain']]}=$chain_copy;
		unset($chain_copy);
	}
if (($_GET['action']=="down") && (isset($_GET['chain'])) && (isset($_GET['rule'])))
	{
		$chain_copy=$fw_chain_{$chains[$_GET['chain']]};
		$chain_copy[$_GET['rule']+1]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']];
		$chain_copy[$_GET['rule']]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']+1];
		$fw_chain_{$chains[$_GET['chain']]}=$chain_copy;
		unset($chain_copy);
	}
Auf jeden Fall sieht das so aus:
Du legst alle Eintraege in einem Array ab. Platz 1 hat dann Index 0, Platz 20 hat den Index 19.
Wenn nun ein Eintrag verschoben werden soll legst Du eine Kopie des Arrays an.
Soll ein Eintrag nach oben geschoben werden setzt Du in der Kopie den Eintrag $x-1 ($x ist jetzt mal der Index des zu verschiebenden Eintrages) auf den Wert in Index $x des Originalarrays und Eintrag $x setzt Du auf den Wert in Index $x-1 des Originalarrays.
Wenn nach unten verschoben werden soll ist halt $x-1 durch $x+1 zu ersetzen.
Anschliessend ueberschreibst Du den Original-Array durch die veraenderte Kopie und schon hast Du die neue Reihenfolge.
 
Doch, das geht. Nach jedem mal ändern musst du natürlich die Funktion aufrufen. Also immer die DB aktuallisieren, bevor du nen neuen Datensatz verschiebst.

So wie ich das sehe, ist es bei Dennis nicht anders. Da muss man auch nach jedem verschieben die Seite neu aufrufen.
 
Zuletzt bearbeitet:
Dennis Wronka hat gesagt.:
So, hier mal ein Beispiel.
Ich weiss, dass es nicht gerade das verstaendlichste Beispiel ist was jetzt moeglich waere, aber grad das einzige was ich zur Hand habe.
PHP:
if (($_GET['action']=="up") && (isset($_GET['chain'])) && (isset($_GET['rule'])))
	{
		$chain_copy=$fw_chain_{$chains[$_GET['chain']]};
		$chain_copy[$_GET['rule']-1]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']];
		$chain_copy[$_GET['rule']]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']-1];
		$fw_chain_{$chains[$_GET['chain']]}=$chain_copy;
		unset($chain_copy);
	}
if (($_GET['action']=="down") && (isset($_GET['chain'])) && (isset($_GET['rule'])))
	{
		$chain_copy=$fw_chain_{$chains[$_GET['chain']]};
		$chain_copy[$_GET['rule']+1]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']];
		$chain_copy[$_GET['rule']]=$fw_chain_{$chains[$_GET['chain']]}[$_GET['rule']+1];
		$fw_chain_{$chains[$_GET['chain']]}=$chain_copy;
		unset($chain_copy);
	}
Auf jeden Fall sieht das so aus:
Du legst alle Eintraege in einem Array ab. Platz 1 hat dann Index 0, Platz 20 hat den Index 19.
Wenn nun ein Eintrag verschoben werden soll legst Du eine Kopie des Arrays an.
Soll ein Eintrag nach oben geschoben werden setzt Du in der Kopie den Eintrag $x-1 ($x ist jetzt mal der Index des zu verschiebenden Eintrages) auf den Wert in Index $x des Originalarrays und Eintrag $x setzt Du auf den Wert in Index $x-1 des Originalarrays.
Wenn nach unten verschoben werden soll ist halt $x-1 durch $x+1 zu ersetzen.
Anschliessend ueberschreibst Du den Original-Array durch die veraenderte Kopie und schon hast Du die neue Reihenfolge.

Hi Dennis :)

Deine Beschreibung habe ich verstanden und ich denke, dass ich das mit ein wenig basteln auch hinbekommen würde. Dein Codebeispiel hat mir jedoch definitiv zu viele "chains" *lach* Aber ich setz mich da mal dran :)
 
Zurück