如何检查是否存在包含MySQL中某些内容的行

时间:2011-11-28 17:57:56

标签: php mysql

我使用以下代码在我的应用程序中插入特定歌曲的分级。

我正在录制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";
    }
}

7 个答案:

答案 0 :(得分:2)

UNIQUE KEYuserID添加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)对于每条记录必须是唯一的(通过将此对定义为键),则如果用户尝试对同一首歌重新投票,则插入将失败。