この曲の情報、主に投票を保存するための中央の場所が必要になりますが、そこに他の曲の情報 (タイトル、音楽ファイルへのパスなど) を保存することもできます。次のような単純なMySQLテーブルを提案します
CREATE TABLE daily_song (
daily_song_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
vote INT NOT NULL DEFAULT 0,
title VARCHAR(255) NOT NULL DEFAULT "" COMMENT "Name of the song",
path VARCHAR(255) NOT NULL DEFAULT "" COMMENT "Path to the song on the server",
ctime DATETIME NOT NULL COMMENT "Datetime the song was added",
PRIMARY KEY(daily_song_id)
);
次の HTML 構造を使用しました。
<ul id="daily-songs">
<li id="song-id-1">
<h3>Song 1</h3>
<div class="voting-controls">
<a href="#" class="vote-up">Up</a>
<div class="votes">8</div>
<a href="#" class="vote-down">Down</a>
</div>
<div class="player"></div>
</li>
<li id="song-id-2">
<h3>Song 2</h3>
<div class="player"></div>
<div class="voting-controls">
<a href="#" class="vote-up">Up</a>
<div class="votes">5</div>
<a href="#" class="vote-down">Down</a>
</div>
</li>
<li id="song-id-3">
<h3>Song 3</h3>
<div class="player"></div>
<div class="voting-controls">
<a href="#" class="vote-up">Up</a>
<div class="votes">4</div>
<a href="#" class="vote-down">Down</a>
</div>
</li>
</ul>
そしてCSSのタッチ
#daily-songs li { clear: both; list-style: none; }
#daily-songs h3 { margin: 0 10px 0 0; float: left; }
#daily-songs .voting-controls { height: 1em; }
#daily-songs .voting-controls * { float: left; }
#daily-songs .voting-controls .votes { padding: 0 10px; }
jQuery を使用した JavaScript は次のとおりです。
$(function() {
var listContainer = $("#daily-songs"),
songs = [];
var songSort = function(a, b) {
return +b.vote.text() - +a.vote.text();
};
var submitVote = function(song, delta) {
$.post("vote.php",
{
id: song.node.attr("id").match(/\d+$/)[0],
delta: delta,
votes: song.vote.text() // temporary
},
function(data) {
if ( isNaN(data) ) { return; }
song.vote.text(data);
// Re-order the song list
$.each(songs.sort(songSort), function() {
listContainer.append(this.node);
});
}
);
};
listContainer.find("li").each(function() {
var $this = $(this);
var song = {
node: $this,
vote: $this.find(".votes")
};
$this.find(".vote-up").click(function() {
submitVote(song, 1);
});
$this.find(".vote-down").click(function() {
submitVote(song, -1);
});
songs.push(song);
});
});
そして、いくつかのスタブ PHP 用vote.php
:
<?php
$songId = !empty($_POST['id']) ? (int)$_POST['id'] : 0;
$delta = !empty($_POST['delta']) ? (int)$_POST['delta'] : 0;
if ( !$songId || !$delta ) {
die("Invalid parameters");
}
// Make sure the voting value is within the valid rang
$delta = $delta > 0 ? 1 : -1;
// Check to see if user has already voted for this song,
// If they haven't voted yet, connect to the database
// If the database connection is succesful, update song entry
// UPDATE daily_song SET votes=votes+$delta WHERE daily_song_id=$songId
// If the UPDATE is successful, SELECT the new vote value
// SELECT vote FROM daily_song WHERE daily_song_id=$songId
// Output the new vote value
// But for now, just accept the current vote and apply the delta
echo $_POST['votes'] + $delta;
PHP は、あなたが記入するために残しておきます。ご不明な点がございましたら、お知らせください。