我创建了一个表单,其中包含一个具有自动完成功能的输入字段,而另一个输入字段被设置为只读。
<div id="windowContent">
<form action="rdpw_monitoring_process.php" method="post">
<table cellpadding="10px">
<tr>
<td>Username</td>
<td><input type="text" class="form-control" style="padding-left:5px;" name="auto_username_rdpw" id="auto_username_rdpw" class="auto_username_rdpw" /></td>
</tr>
<tr>
<td>Default Password</td>
<td><input type="text" value="nccc2016" class="form-control" name="default_password_rdpw" id="default_password_rdpw" readonly="readonly" /></td>
</tr>
</table>
<br />
<div style="padding-right:100px; float:right;"><input type="submit" name="reset" value="RESET" id="reset" class="reset btn btn-info" /></div>
</form>
</div>
当我输入用户名并单击提交按钮时,它会自动更新某些字段的表 1 (tbl_userlist),然后它会插入表 1 (tbl_userlist) 中基于更新字段的用户 ID。我的更新查询有效,但我的插入查询无效。是否可以像我下面的流程代码一样,在一个流程中的不同表中组合插入和更新查询?
<?php
include('connection.php');
$autocomplete_username = $_POST['auto_username_rdpw'];
$default_password = $_POST['default_password_rdpw'];
$pdo = new PDO('mysql:host=localhost;dbname=etransmittal', 'root', '');
date_default_timezone_set('Asia/Hong_Kong');
$current_date = date('Y-m-d H:i:s');
$date_expiration_ninety_days = date('Y-m-d H:i:s', strtotime("+90 days"));
$update_qry = $pdo->prepare("UPDATE tbl_userlist SET user_password = :default_password, lastdate_changepw = :date_change_password, password_expiration = :password_date_expiration WHERE username = :username");
$insert_qry = $pdo->prepare("INSERT INTO tbl_reset_change_expire_password (userid, lastdate_resetpw)
VALUES ((SELECT userid FROM tbl_userlist WHERE lastdate_changepw = :change_password_date LIMIT 1), $current_date)");
if($update_qry->execute(array(':default_password' => $default_password, ':date_change_password' => $current_date, ':password_date_expiration' => $date_expiration_ninety_days, ':username' => $autocomplete_username))){
echo "You have successfully edit into default password";
}
else{
echo 'Failed to reset default password.';
}
$insert_qry->execute(array(':change_password_date' => $current_date));
?>
最佳答案
不,不可能在同一 SQL 语句中对一个表执行 INSERT
并对另一个表执行 UPDATE
。
使用触发器(例如 AFTER UPDATE ON
您正在更新的表,它可以执行 INSERT
可能会实现您想要的效果。但是您不能t 将参数传递给触发器。这些值必须可从您正在更新的行或用户定义的变量中获得。
但这似乎并不是真正的问题所在。看起来您真正想要的是一个事务,您只想在 UPDATE
成功时执行 INSERT
。
您似乎还希望 INSERT
基于更新行的 username
,而不是最后更新的日期/时间。
在您的示例代码中,您似乎想要一个更像这样的 INSERT 语句,假设 username
在 `tbl_reset_change_expire_password:
INSERT INTO tbl_reset_change_expire_password (userid, lastdate_resetpw)
SELECT l.userid, :change_password_date
FROM tbl_userlist l
WHERE l.username = :username
如果您想在触发器中执行此操作,则可以从您更新的行中获取 userid
值。但是日期时间需要来自某个地方,比如通过 NOW()
函数的数据库服务器。 (时区将取决于 MySQL session 变量的设置。)
在 AFTER UPDATE ON tbl_userlist
触发器的主体中,您可以像这样执行 INSERT...
INSERT INTO tbl_reset_change_expire_password (userid, lastdate_resetpw)
SELECT NEW.userid, NOW()
但这是执行的两个独立语句,但您只需要从代码中执行 UPDATE
。 INSERT 将通过触发器“在幕后”执行。
关于php - 在一个进程中在不同表中插入和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34804976/