我使用下面的代码在我的应用程序中插入特定歌曲的评级。
我正在记录songID,给这首歌的评分和对这首歌投票的userID。
我想做的是防止用户投票,如果他们"已经"投票了某首歌。因此,我需要能够在插入之前检查表中是否存在一行。
所以…userID = 1, songID = 1, rating = 4。
如果随后尝试插入userID=1, songID=1, rating=*,则应该插入失败
然而,如果用户投票给另一首歌…这应该是允许的,插入应该发生。
知道我该怎么做吗?
//Add rating to database
if(!empty($_POST['rating']) && isset($_POST))
{
//make variables safe to insert
$rating = mysql_real_escape_string($_POST['rating']);
$songid = mysql_real_escape_string($_POST['song_id']);
//query to insert data into table
$sql = "
INSERT INTO wp_song_ratings
SET
songid = '$songid',
rating = '$rating',
userid = '$user_id'";
$result = mysql_query($sql);
if(!$result)
{
echo "Failed to insert record";
}
else
{
echo "Record inserted successfully";
}
}
为userID
和songID
添加UNIQUE KEY
。如果你不希望他们改变他们的评级,你不应该允许它从前端,但仍然在后端进行检查。如果UNIQUE KEY
在适当的位置,它将失败。
ALTER TABLE `wp_song_ratings` ADD UNIQUE KEY `user_song_key` (`userID`, `songID`)
听起来您需要在mysql中使用存储过程—更多信息请访问http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
您可以先执行SELECT
语句:
if(!empty($_POST['rating']) && isset($_POST))
{
//make variables safe to insert
$rating = mysql_real_escape_string($_POST['rating']);
$songid = mysql_real_escape_string($_POST['song_id']);
$select_sql = "SELECT COUNT(*) WHERE songid='$songid' AND userid='$user_id'";
$select_result = mysql_query($select_sql);
if ( mysql_num_rows($select_result) > 0 )
{
/* already voted! */
}
else
{
//query to insert data into table
$sql = "
INSERT INTO wp_song_ratings
SET
songid = '$songid',
rating = '$rating',
userid = '$user_id'";
$result = mysql_query($sql);
if(!$result)
{
echo "Failed to insert record";
}
else
{
echo "Record inserted successfully";
}
}
}
当然,也有其他方法可以实现这些事情(比如存储过程)。
在sql语句中添加以下WHERE子句
WHERE NOT EXISTS (SELECT 1 FROM wp_song_ratings WHERE songid= '$songid' and userid = '$user_id')
在Oracle和SQL Server上工作…
如何使用REPLACE查询呢?REPLACE查询将替换具有相同主键(或唯一键)的旧查询,而不会出现错误。我想有些用户可能想更新他们的投票。
我会改变加载这个视图的方式,当当前用户已经为这首歌投票时,不允许'投票',或者如果你想让他们改变评级,做一个更新,而不是为同一首歌的用户插入。
如果表已经定义为(songid,userid)对于每条记录必须是唯一的(通过将此对定义为键),那么如果用户试图对同一首歌重新投票,则插入将失败。