我用它来添加或更新数据库中的内容。
$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
发生变化,请将旧值和新值回显到屏幕,否则不执行任何操作。
我该怎么做呢?
答案 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无法获得旧费用。您需要分两步完成此操作。首先是选择,然后是插入/更新。