我有以下 PHP 循环 + SQL 更新查询。
for ($i=0;$i<count($_POST['id']);$i++) {
if(!isset($_POST['live'][$i])){
$_POST['live'][$i] = "0";
} else { $_POST['live'][$i] = "1"; }
$id = ($_POST['id'][$i]);
$live = ($_POST['live'][$i]);
$usr2 = $_SESSION['usr'];
$updated = date("F j, Y, g:i a",time()+60*60);
$sql = "UPDATE news SET live = '$live', usr2 = '$usr2', updated = '$updated' WHERE id = $id";
$result = mysql_query($sql);
//echo $sql."<br />";
}
if($result) {
header("location: notes.php");
exit();
}else {
die("Query failed");
}
它是如何工作的:
- 我提交的大表格将包含所有表格行。
- 在不同的文件中将其作为数组接收
- 如果
$_POST['live']
为“未设置”- 将其设置为“0”,如果为“设置”则将其设置为 1 - 在for循环中更新数组数据
如何只更新实际发生变化的行?
那些来自 $_POST['live'] 的值实际上与保存在数据库中的值不同,因为条件将改变我们的 $live 行
。
最佳答案
我猜想您担心updated
字段并且该值仅在某些内容被更改时才会更改。 (如果不是这种情况,请忘记这个答案。)
您可以为 timestamp 定义 ON UPDATE CURRENT_TIMESTAMP
子句 field 。每次更新记录而没有为该字段显式设置值时,mysql 都使用当前时间作为其新值...
...但前提是记录被更改;如果您使用与该记录中已有的值相同的值“更新”字段,则不会发生任何事情。
演示脚本:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setup($pdo);
$stmt = $pdo->prepare('UPDATE soNews SET somevalue=:v WHERE id=:id');
show('original', $pdo);
$stmt->execute( array(':id'=>1, ':v'=>'z') );
show('update with new=old & id=1', $pdo);
$stmt->execute( array(':id'=>2, ':v'=>'y') ); // new value=old value
show('update with new!=old & id=2', $pdo);
function setup($pdo) {
$pdo->exec('
CREATE TEMPORARY TABLE soNews (
id int auto_increment,
somevalue varchar(32),
updated TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
primary key(id)
)
');
$pdo->exec("INSERT INTO soNews (id,somevalue,updated) VALUES (1,'x', Now()-interval 47 hour),(2,'y', Now()-interval 47 hour)");
}
function show($label, $pdo) {
echo "------ $label --------\n";
foreach( $pdo->query('SELECT * FROM soNews', PDO::FETCH_ASSOC) as $row ) {
echo join(', ', $row), "\n";
}
}
打印
------ original --------
1, x, 2011-08-16 14:09:53
2, y, 2011-08-16 14:09:53
------ update with new=old & id=1 --------
1, z, 2011-08-18 13:09:53
2, y, 2011-08-16 14:09:53
------ update with new!=old & id=2 --------
1, z, 2011-08-18 13:09:53
2, y, 2011-08-16 14:09:53
如您所见,第一个更新查询的结果是时间戳字段已更新,而第二个查询设置 new=old 并未影响 updated
字段。
关于PHP/SQL 更新 - 仅在值已更改时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105931/