(Musik-)Charts-Tabelle erstellen/verwalten

das nrank ist ein tippfehler, der mir hier beim posten passiert ist. Korrigier ich mal eben. Das andere probiere ich sofort aus :)

Edit:

Der Query in php-admin eingegeben funktioniert!

Versuch $_GET['rank'] auszugeben über folgenden Code:
PHP:
echo $_GET['rank'];
if (isset($_GET['rank'])) {
	echo "ist gesetzt";
} 
	
if (!isset($_GET['rank'])) {
	echo "ist nicht gesetzt";
}
klappt nur bei "-", wenn "+" dann ist $_GET['rank'] zwar gesetzt, aber echo liefert nix.
 
Zuletzt bearbeitet:
Dann zwei Änderungen im Code.

Bei der Erstellung der Links, wendest du jeweils rawurlencode() an. bei Plus und Minus.

Den Aufruf der Funktion änderst du so ab.
PHP:
$rank = rawurldecode($_GET['rank']);
if($rank == "+" || $rank == "-") 
    { 
        $done = reorder($rank,$_GET['id']); 

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

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

Klappt es nun?
 
ich encodiere so:
PHP:
	$dump ='<a href="index.php?navigation=charts&rank=+&id='.$row['id'].'&expand=aendern"><img hspace="5px" border=0 src="icons/runter.png"></a>';
	rawurlencode($dump);
	echo $dump;

ist das richtig?

Wenn ja: Der sortiert immer noch nur aufwärts, aber er verschiebt jetzt den jeweiligen Eintrag nach ganz oben, an erste Stelle :(
 
Zuletzt bearbeitet:
Ich dachte dabei eher an
PHP:
echo '<a href="index.php?rank='.rawurlencode("+").'&id='.$row['id'].'"><img hspace="5px" src="icons/runter.png"></a>';
und das gleiche mit -.

Wenn das auch nicht klappt, probieren wir es nochmal anders.

Links erstellen mit den Wörtern "plus" und "minus" (oder andere)
Code erweitern:
PHP:
    if($_GET['rank'] == "plus" || $_GET['rank'] == "minus") 
    { 
        $rank = ($_GET['rank'] == 'plus'?'+':'-');
        $done = reorder($rank,$_GET['id']);
        #...
    }

Dabei bezog ich mich jetzt auf den Ausgangscode. Also alles ohne rawurldecode(), usw
 
Zuletzt bearbeitet:
Hallo!

So, mir war grad langweilig... ;)

Code:
-- 
-- Tabellenstruktur für Tabelle `charts_lists`
-- 

CREATE TABLE `charts_lists` (
  `eintrag_id` int(10) unsigned NOT NULL auto_increment,
  `song_id` int(10) unsigned NOT NULL default '0',
  `platz` int(10) NOT NULL default '0',
  `woche` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`eintrag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `charts_songs`
-- 

CREATE TABLE `charts_songs` (
  `song_id` int(10) unsigned NOT NULL auto_increment,
  `interpret` varchar(255) collate latin1_general_ci NOT NULL default '',
  `titel` varchar(255) collate latin1_general_ci NOT NULL default '',
  PRIMARY KEY  (`song_id`),
  UNIQUE KEY `unique_songs` (`interpret`,`titel`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Die Chart-Daten werden in zwei Tabellen gespeichert: charts_songs enthält sämtliche Songs, die vorkommen können, charts_lists die Platzierungen dieser Songs. Dabei bleiben die Daten der Vorwochen in charts_lists jeweils erhalten. Damit lassen sich auch Chartlisten beliebiger Vorwochen generieren, oder aber auch der Verlauf eines Songs durch die Chartplatzierungen.

Skript zum Erstellen des Chartlistings (chartshow.php):
PHP:
<?php
mysql_connect('localhost', 'foo', 'bar');
mysql_select_db('test');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="de">

<head>
  <title>Chart Listing</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <style type="text/css">
	.neu { color: blue; }
	.aufsteiger { color: green; }
	.absteiger { color: red; }
	.gleich { color: gray; }
  </style>
</head>

<body>

<table>
<tr><th>Platz</th><th>+/-</th><th>Song</th></tr>
<?php
$woche = 0;

if (isset($_GET['woche'])) {
	$woche = intval($_GET['woche']);
}

if ($woche <= 0) {
	// Wenn keine Wochenzahl übergeben wurde (oder eine ungültige), dann hole die Zahl
	// der aktuellsten Woche
	$woche = mysql_result(mysql_query('SELECT MAX(`woche`) FROM `charts_lists` LIMIT 1'), 0);
}

$result = mysql_query('
	SELECT 
		`diese_woche`.`platz`,
		(`letzte_woche`.`platz` - `diese_woche`.`platz`) AS `veraenderung`,
		`songs`.`interpret`,
		`songs`.`titel`
	FROM
		`charts_lists` AS `diese_woche`,
		`charts_songs` AS `songs`
	LEFT JOIN
		`charts_lists` AS `letzte_woche` ON (
			`letzte_woche`.`woche` = `diese_woche`.`woche` - 1 AND
			`letzte_woche`.`song_id` = `diese_woche`.`song_id`
		)
	WHERE
		`diese_woche`.`woche` = '.$woche.' AND
		`songs`.`song_id` = `diese_woche`.`song_id`
	ORDER BY
		`diese_woche`.`platz` ASC');

while ($row = mysql_fetch_assoc($result)) {
	echo '<tr><td>'.$row['platz'].'</td>';
	if (is_null($row['veraenderung'])) {
		$class = 'neu';
		$row['veraenderung'] = 'NEU!';
	} elseif ($row['veraenderung'] > 0) {
		$class = 'aufsteiger';
		$row['veraenderung'] = '+'.$row['veraenderung'];
	} elseif ($row['veraenderung'] < 0) {
		$class = 'absteiger';
	} else {
		$class = 'gleich';
		$row['veraenderung'] = '&plusmn;0';
	}
	echo '<td class="'.$class.'">'.$row['veraenderung'].'</td>';
	echo '<td>'.htmlspecialchars($row['interpret'].' - '.$row['titel']).'</td>';
	echo '</tr>'."\n";
}

?>
</table>

</body>

</html>

Skript zum Erstellen eines neuen Chartlistings und zum Eintragen neuer Songs (chartedit.php):
PHP:
<?php
mysql_connect('localhost', 'foo', 'bar');
mysql_select_db('test');

function qstr($str) {
	return "'".mysql_real_escape_string($str)."'";
}

// Aktuelle Wochen-Nummer ist letzte Wochen-Nummer plus eins
$woche = mysql_result(mysql_query('SELECT MAX(`woche`) FROM `charts_lists` LIMIT 1'), 0) + 1;
// Anzahl der Plätze in den Charts
$plaetze = 10;


if (isset($_POST['addnew'])) {
	// Neue Chartliste eintragen, sofern der entsprechende Button gedrückt wurde
	$error = '';

	if (count($_POST['platz']) != $plaetze) {
		$error = 'Formulardaten ungültig!';
	} elseif (count(array_unique($_POST['platz'])) != $plaetze) {
		$error = 'Doppelte Einträge sind nicht möglich!';
	} else {

		$values = array();

		foreach ($_POST['platz'] as $platz => $song_id) {
			if (intval($song_id) == 0) {
				$error = 'Jeder Platz muss mit einem Song belegt sein!';
				break;
			}
			$values[] = '('.intval($song_id).', '.intval($platz).', '.$woche.')';
		}


		if (empty($error)) {
			$query = '
				INSERT INTO `charts_lists` (`song_id`, `platz`, `woche`)
				VALUES '.join(', ', $values);
			mysql_query($query) or die($query.mysql_error());
			header('Location: chartedit.php');
		}
	}

	if (!empty($error)) {
		echo htmlentities($error);
	}
}

if (isset($_POST['addsong'])) {
	// Neuen Song in die Datenbank einfügen
	$result = mysql_query('
		INSERT INTO	`charts_songs` (`interpret`, `titel`)
		VALUES ('.qstr($_POST['interpret']).', '.qstr($_POST['titel']).')'
	);

	echo '<p>&quot;'.htmlentities($_POST['interpret'].' - '.$_POST['titel']).'&quot ';

	if ($result) {
		// Alles ok, neuer Eintrag wurde erstellt
		echo 'hinzugef&uuml;gt!';
	} else {
		// Duplikat
		echo 'bereits vorhanden!';
	}

	echo '</p>';
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="de">

<head>
  <title>Chart Editing</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

<body>

<table>
<form action="chartedit.php" method="post">

<h2>Charts erstellen</h2>

<table>
<tr><th>Platz</th><th>Song</th><th>Aktion</th></tr>
<?php

$songs = array(0 => '(kein Eintrag)');

// Songliste holen und in Array $songs schreiben
$result = mysql_query('SELECT `song_id`, `interpret`, `titel` FROM `charts_songs` ORDER BY `interpret`, `titel`');
while ($row = mysql_fetch_assoc($result)) {
	$songs[$row['song_id']] = htmlentities($row['interpret'].' - '.$row['titel']);
}


$chart_data = array();

if (count($_POST) == 0) {
	// Formular wurde noch nicht abgeschickt

	// Chart-Liste von Vorgängerwoche holen und in $chart_data speichern
	$result = mysql_query('SELECT `platz`, `song_id` FROM `charts_lists` WHERE `woche` = '.($woche-1).' ORDER BY `platz` ASC');
	while ($row = mysql_fetch_assoc($result)) {
		$chart_data[$row['platz']] = $row['song_id'];
	}

	if (count($chart_data) < $plaetze) {
		// Zu wenig/keine Platzierungen in Vorwoche
		for ($i = count($chart_data) + 1; $i <= $plaetze; ++$i) {
			$chart_data[$i] = 0;
		}
	}
} else {
	// Formular wurde abgeschickt
	// Chart-Liste aus Formulardaten holen
	$chart_data = $_POST['platz'];

	if (isset($_POST['pos'])) {
		// Song verschieben
		$platz = array_pop(array_keys($_POST['pos']));
		if ($_POST['pos'][$platz] == '+' && isset($chart_data[$platz-1])) {
			// Einen Platz nach oben verschieben
			$temp = $chart_data[$platz-1];
			$chart_data[$platz-1] = $chart_data[$platz];
			$chart_data[$platz] = $temp;
		} elseif ($_POST['pos'][$platz] == '-' && isset($chart_data[$platz+1])) {
			// Einen Platz nach unten verschieben
			$temp = $chart_data[$platz+1];
			$chart_data[$platz+1] = $chart_data[$platz];
			$chart_data[$platz] = $temp;
		}
	}
}

// Chart-Tabelle mit Dropdown-Feldern zur Songauswahl aus $chart_data erstellen
foreach ($chart_data as $platz => $song_id) {
	echo '<tr>';
	echo '<td>'.$platz.'</td>';
	echo '<td><select name="platz['.$platz.']">';
	// Songliste aus $songs in Dropdown-Feld schreiben
	foreach ($songs as $id => $name) {
		echo '<option value="'.$id.'"';
		// Aktuell gewählten Song laut $chart_data vorselektieren
		if ($id == $song_id) echo ' selected="selected"';
		echo '>'.$name.'</option>';
	}
	echo '</select></td>';
	echo '<td>';
	if ($platz > 1) echo '<input type="submit" name="pos['.$platz.']" value="+" />';
	if ($platz < $plaetze) echo '<input type="submit" name="pos['.$platz.']" value="-" />';
	echo '</td>';
	echo '</tr>'."\n";
}

?>

</table>

<input type="submit" name="addnew" value="Charts f&uuml;r Woche #<?php echo $woche; ?> speichern" />


<h2>Song hinzuf&uuml;gen</h2>
<label for="addsong-interpret">Interpret:</label> <input id="addsong-interpret" name="interpret" /><br />
<label for="addsong-titel">Titel:</label> <input id="addsong-titel" name="titel" /><br />
<input name="addsong" type="submit" />

</form>

</body>

</html>
Wie man sieht, kann man das Problem des Umordnens ganz leicht umgehen, indem man die Liste nicht jedes mal (unnötigerweise) in der Datenbank verändert, sondern einfach die Formulardaten entsprechend manipuliert. Ein Eintrag erfolgt erst, wenn der entsprechende Button zum Speichern gedrückt wurde.

Ich weiß, dass ich ziemlich kommentierfaul bin... aber das war jetzt eher als Zeitvertreib gedacht und nicht als präsentierfertige Lösung ;) Wenn noch Fragen offen sind, einfach stellen :)

Grüße,
Matthias
 
fanste hat gesagt.:
Ich dachte dabei eher an
PHP:
echo '<a href="index.php?rank='.rawurlencode("+").'&id='.$row['id'].'"><img hspace="5px" src="icons/runter.png"></a>';
und das gleiche mit -.

Keine Änderung :( Hochschieben klappt, runterschieben nur in der Form, dass der entsprechende Titel direkt auf Platz 1 geschoben wir, egal wo er vorher stand. :(

Wenn das auch nicht klappt, probieren wir es nochmal anders.

Links erstellen mit den Wörtern "plus" und "minus" (oder andere)
Code erweitern:
PHP:
    if($_GET['rank'] == "plus" || $_GET['rank'] == "minus") 
    { 
        $rank = ($_GET['rank'] == 'plus'?'+':'-');
        $done = reorder($rank,$_GET['id']);
        #...
    }

Dabei bezog ich mich jetzt auf den Ausgangscode. Also alles ohne rawurldecode(), usw

Das hab ich auch ausprobiert, leider verschiebt er jetzt beim hoch- UND runterschieben den entsprechenden Titel auf Platz 1.

Ich werd das jetzt mal so lassen, dass man nur aufwärtsschieben kann, so kann man halt indirekt den Titel darüber runterschieben ;)

Trotzdem möchte ich dir einen großen Dank aussprechen, Fanste, dass du mir hier so tatkräftig unter die Arme gegriffen hast :)


Und Matthias:
*sprachlos* Ähm, ich speicher mir das mal und probier das in Ruhe mal aus, ja? Aber auch dir danke!
 
Hallo zusammen,
ein wirklich sehr geiles Forum. ;-)

Eine Frage dazu:
Wie könnte man jetzt zum beispiel die charts archivieren?
Und Monats oder Wochencharts ausgeben?! :confused:
 
Hallo zusammen,
ein wirklich sehr geiles Forum. ;-)

Eine Frage dazu:
Wie könnte man jetzt zum beispiel die charts archivieren?
Und Monats oder Wochencharts ausgeben?! :confused:

Im prinzip ganz einfach, du brauchst dazu eine 2 Tabelle und darin noch zwei Spalten namens Kalenderwoche und Jahr z.B.
darin lässt du die Kalenderwoche und das Jahr speichern (bsp: 40 und 2007).
Dann schreibst du dir ein php script das via cronjob einmanl wöchentlich aufgerufen wird die Daten aus Tabelle A hohlt und in Tabelle B mit den zusatz der KW und Jahr einträgt.
Etwas umständlich aber so in etwa würde ich es lösen.

mfg Spikaner
 
Dann schreibst du dir ein php script das via cronjob einmanl wöchentlich aufgerufen wird die Daten aus Tabelle A hohlt und in Tabelle B mit den zusatz der KW und Jahr einträgt.
Etwas umständlich aber so in etwa würde ich es lösen.

Da liegt das Problem :( ich kenn mich mit Cronjobs gar nicht aus
Nur mit Php und MySql geht das nich? :confused:
 
http://cronjob.de/ ,da einfach Anmelden dann den link zum script eingeben und wochentlich laufen lassen (natürlich eine extra php-Datei) die nur die Daten von Db A nach B kopiert und woche und Jahr hinzufügt)

mfg Spikaner
 
Zurück