我使用以下代码在我的应用程序中插入特定歌曲的分级。
我正在录制songID,歌曲的评级和投票的用户ID。
我想要做的是阻止用户投票,如果他们已经对特定歌曲进行了投票。因此,我需要能够在插入之前检查表中是否存在行。
所以...如果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";
}
}
答案 0 :(得分:2)
为UNIQUE KEY
和userID
添加songID
。如果您不希望他们更改评级,您不应该从前端允许它,但仍然要检查后端。如果UNIQUE KEY
到位,它将失败。
ALTER TABLE `wp_song_ratings` ADD UNIQUE KEY `user_song_key` (`userID`, `songID`)
答案 1 :(得分:1)
听起来你需要在mysql中使用存储过程 - 更多信息请http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html
答案 2 :(得分:1)
您可以先发表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";
}
}
}
当然,还有其他方法可以实现这些功能(例如存储过程)。
答案 3 :(得分:1)
将以下WHERE子句添加到sql语句
WHERE NOT EXISTS (SELECT 1 FROM wp_song_ratings WHERE songid= '$songid' and userid = '$user_id')
适用于Oracle和SQL Server ......不完全确定MySQL
答案 4 :(得分:1)
如何使用REPLACE查询呢? REPLACE查询将替换具有相同主键(或唯一键)的旧查询,而不会出现错误。我认为有些用户可能想要更新他们的投票。
答案 5 :(得分:0)
如果当前用户已经为该歌曲投票,或者如果您希望允许他们更改评分,则更改加入此视图的方式是不允许“投票”,为该用户进行更新而不是插入在同一首歌..
答案 6 :(得分:0)
如果已定义表格,使得(songid,userid)对于每条记录必须是唯一的(通过将此对定义为键),则如果用户尝试对同一首歌重新投票,则插入将失败。