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

标签 php mysql

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

相关文章:

php - 基于 PHP 和 MySQL 性能思想的动态词汇表

mysql 5.7 - 指定的键太长;最大 key 长度为 3072 字节

php - 限制文件访问——只能通过 PHP 读取

php - 测验的数据库结构是什么样的?

php - 如何为 CSV、fgetcsv() 问题转义逗号

PHP - 无法关联结果并在 MYSQL 中获取它们

php - 清理mysql搜索字符串的功能(主要是删除通配符)?

php - 使用 Jquery/Javascript 查找多个 PHP 生成的输入

php - 是否可以在 Laravel 中获取数据透视表与另一个表的关系?

php - 如何在sql php中通过外键关系将数据插入到两个表中