识别何时发生更新?

时间:2013-03-08 04:10:35

标签: php mysql

我用它来添加或更新数据库中的内容。

$update = mysql_query
("
    INSERT INTO details (id, name, team, cost) 
    VALUES ('$id', '$name', '$team', '$cost') 
    ON DUPLICATE KEY UPDATE cost = '$cost' 
") 
or die (mysql_error());

基本上,我想做.....

如果$cost发生变化,请将旧值和新值回显到屏幕,否则不执行任何操作。

我该怎么做呢?

4 个答案:

答案 0 :(得分:2)

首先,你必须在临时变量

中保留与你的id相对应的成本
$query        = "SELECT cost FROM details WHERE id = $id";
$resource     = mysql_query($query);
$temp_array   = mysql_fetch_assoc($resource);
$old_cost     = $temp_array['cost'];

现在执行您的操作

mysql_affected_rows将在DUPLICATE KEY UPDATE OPERATION

上返回2
$update = mysql_query("
INSERT INTO details (id, name, team, cost) 
VALUES ('$id', '$name', '$team', '$cost') 
ON DUPLICATE KEY UPDATE cost = '$cost' ") 
  or die (mysql_error());
  if(mysql_affected_rows() == 2)
  {
      echo "old cost = $old_cost";
      echo "New Cost : $cost";
   }

试试希望它有所帮助

答案 1 :(得分:1)

您可以使用mysql_affected_rows()命令,请参阅mysql_affected_rows

基本上它会告诉你已经更新了多少行。完整的例子:

$update = mysql_query
("
    INSERT INTO details (id, name, team, cost) 
    VALUES ('$id', '$name', '$team', '$cost') 
    ON DUPLICATE KEY UPDATE cost = '$cost' 
") 
or die (mysql_error());
if(mysql_affected_rows($update) != 0)
     echo $cost;

在这种情况下,您必须以$ cost定义旧成本(该行实际上是您可以根据需要进行解释)。要做到这一点,你必须事先使用SELECT ....也许你可以检查一个重复的键而不是使用超级优雅的ON DUPLICATE KEY ......

答案 2 :(得分:1)

我建议使用 PHP的PDO 而不是mysql_ *函数,因为它们正式弃用 PHP的PDO 更安全的更多面向对象的方法

→有关 PHP的PDO 的更多信息,请访问:http://php.net/manual/en/book.pdo.php

话虽如此, INSERT 语句只返回 TRUE FALSE ,具体取决于INSERT语句是成功完成还是失败。

→此外, mysql_affected_rows() mysql_num_rows() 仅返回插入/更新的行数 NOT < / strong>您正在寻找的旧费用。

所以,你需要分两部分来做这件事:

A)

SELECT `cost` 
FROM `details`
WHERE `id` = '$id'

如果找到上述查询的行,您知道自己有一个重复的ID,并且可以评估返回的cost与您拥有的新$ $。

然后,您可以使用新旧费用获得问题的答案,并且可以:

B)

INSERT INTO details (id, name, team, cost) 
VALUES ('$id', '$name', '$team', '$cost') 
ON DUPLICATE KEY UPDATE cost = '$cost' 

→确保您清理正在使用的变量; mysql_real_escape_string

→或者只使用 PHP的PDO ,因为它会在您将变量绑定到查询时为您清理变量。

答案 3 :(得分:0)

在运行查询后,AFAIK无法获得旧费用。您需要分两步完成此操作。首先是选择,然后是插入/更新。