区分由于错误条件导致的失败UPDATE和由于未更改值导致的UPDATE失败

时间:2018-02-08 13:43:42

标签: php mysql

我的问题是关于MySQL UPDATE语句,如果zero子句中的更新条件不满足,则返回WHERE'0',如果值已声明,则返回zero'0'在UPDATE语句中也没有改变,使用mysqli_affected_rows($conn);来检查受影响的行是否有办法区分这两个失败。

以下是一个示例表:

ID(auto_increment) | music_name     | price | genre |
556785             | rock star      | $30   | rap   |
896785             | game of thrones| $30   | O.S.T |
116785             | i can dance    | $30   | dance |

以下是示例代码:

$query="UPDATE `songs` SET `music_name`='$name', `price`='$price' WHERE `genre`=$genre" ;
$result= mysqli_query($conn,$query);

if(mysqli_affected_rows($conn)===0)
{
  $query="INSERT INTO `songs` (`music_name`,`price`,`genre`) VALUES ('$name','$price','$genre')";
  $result=mysqli_query($conn,$query);
}

现在这个工作正常,但是当输入数据库表中已经存在的相同值时,mysqli_affected_rows();将返回zero'0',导致INSERT INTO语句运行,我们最终得到重复的行。

如何更好地进行此类查询?无需添加更多查询以在UPDATE之前选择并检查行。另外一个选项可能是使用带条件的触发器来删除重复的行?但我认为还有更好的方法。

目前,除auto_increment

上的ID外,表格中没有唯一列

1 个答案:

答案 0 :(得分:2)

首先,如果值相同,MySQL将不会更新该行,因此受影响的行数将为0.

此问题的解决方案:

$query="SELECT count(*) as cnt FROM `songs` WHERE `music_name`='$name', `price`='$price' AND `genre`=$genre" ;
/****get count from the query******/
if(count > 0 ) {
//update the table row
}
else{
//insert the table row
}