我创建了一个包含输入字段的表单,该字段具有自动完成功能,另一个输入字段设置为只读。
<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));
?>
答案 0 :(得分:2)
不,在同一个SQL语句中,无法对一个表和INSERT
执行另一个表。
有可能使用触发器实现你想要的东西(例如UPDATE
你正在更新的表,它可以执行AFTER UPDATE ON
。但你不能将参数传递给触发器。必须从要更新的行或用户定义的变量中获取值。
但这似乎并不是问题所在。看起来您真正想要的是一个交易,如果INSERT
成功,您只想执行INSERT
。
您似乎还希望UPDATE
基于已更新行的INSERT
,而不是最后更新的日期/时间。
在你的示例代码中,似乎你想要一个更像这样的INSERT语句,假设{tl_reset_expire_password中username
是唯一的:
username
如果您想在触发器中执行此操作,则可以从更新的行中获取 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
函数的数据库服务器。 (时区将取决于MySQL会话变量的设置。)
在NOW()
触发器的主体中,您可以像这样执行INSERT ......
AFTER UPDATE ON tbl_userlist
但这是执行的两个单独的语句,但您只需要从代码中执行 INSERT INTO tbl_reset_change_expire_password (userid, lastdate_resetpw)
SELECT NEW.userid, NOW()
。 INSERT将通过触发器“幕后”执行。
答案 1 :(得分:1)
下面的代码可能正常工作........
<?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), :change_password_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));
?>