Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL:在更新期间获取列的值_Php_Mysql - Fatal编程技术网

Php SQL:在更新期间获取列的值

Php SQL:在更新期间获取列的值,php,mysql,Php,Mysql,使用PHP和MySQL,我有一个如下所示的查询: UPDATE mytable SET status='$newstatus' WHERE (col1='$col1[0]'AND col2='$col2[0]') OR (col1='$col1[1]'AND col2='$col2[1]') OR (...); insert into UserLog select Id, Username, Email, Telephone, Now() from User wh

使用PHP和MySQL,我有一个如下所示的查询:

UPDATE mytable 
   SET status='$newstatus' 
 WHERE (col1='$col1[0]'AND col2='$col2[0]') 
   OR (col1='$col1[1]'AND col2='$col2[1]') 
   OR (...);
insert into UserLog
select Id, Username, Email, Telephone, Now()  from User where Id=$Id

我实际上需要在更新之前记录这些行的当前“状态”。我是否需要在此之前进行单独的选择,或者我可以(应该/如何)组合这两个查询?

您无法从该查询中获得该信息(您只能获得受影响的行数,但仅此而已)。如果需要,应首先根据以下条件选择

SELECT `id` FROM `mytable`
WHERE (`col1`='$col1[0]' AND `col2`='$col2[0]')
   OR (`col1`='$col1[1]' AND `col2`='$col2[1]')
   OR (...)

然后使用获取的
id
s使用
WHERE
更新
。我不建议使用当前的
WHERE
子句执行
UPDATE
,因为在此期间(在
SELECT
UPDATE
之间)db内容可能会更改,所以您可以更新已设置的
SELECT
的不同行。或者使用表锁定(但我认为这没有意义).Mysql中的

No
输出
子句。您需要在更新之前读取状态,或者创建一个触发器,将
OLD.status的值存储在其他表中

在更新之前,您不能使用单个查询来更新行并记录当前状态

您最好有一个“日志表”,与您的“表”具有相同的模式,再加上一个时间戳,但它将只存储历史数据,即单个时间点中一行的状态,就像版本控制系统一样

示例:

用户:Id、用户名、电子邮件、电话

用户日志:Id、用户名、电子邮件、电话、时间戳

因此,在更新表User上的行之前,首先要执行SELECT和INSERT操作,如下所示:

UPDATE mytable 
   SET status='$newstatus' 
 WHERE (col1='$col1[0]'AND col2='$col2[0]') 
   OR (col1='$col1[1]'AND col2='$col2[1]') 
   OR (...);
insert into UserLog
select Id, Username, Email, Telephone, Now()  from User where Id=$Id

我不明白你要什么。你的意图是什么?您的查询将更新状态列。你还想保存什么?你已经在做你想做的事了吧?请告诉我你是因为你在这里做的字符串插值非常可怕。它们是安全的字符串。没有用户数据。在我发布问题后,我发现了一个几乎重复的问题,并看到输出存在于一些SQL风格中,但不存在MySQL。我的答案和你的一样。幸运的是,我已经在一个单独的变量中包含了entier WHERE子句,所以我只是在更新之前做了一个SELECT。尚未测试,但逻辑似乎正确。
WHERE
子句在变量中与否没有区别。我标记的问题基于并发数据库访问。很有可能(您应该始终假设它将100%)一旦执行
选择
,其他过程将执行,即
插入
删除
更新
,这将影响与您的条件匹配的行。因此,当您执行
更新时
实际上会更改从以前的
选择中获得的不同行。这看起来可能有点棘手,但忽略这一点可能会导致数据库不一致。哦,我明白了。我没有考虑这一点,因为它是一个不经常更新的DB,但作为一个最佳实践规则当然是有意义的。你能详细说明“创建触发器”吗?我不熟悉这个上下文中的表达式;如果要将旧值存储在单独的表中(例如,
mytable\u status\u history
),则需要在更新后
mytable
上触发