gpt4 book ai didi

PHP/SQL 更新 - 仅在值已更改时更新

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:07 25 4
gpt4 key购买 nike

我有以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com