php - 在一个进程中在不同表中插入和更新

标签 php jquery mysql insert-update

我创建了一个表单,其中包含一个具有自动完成功能的输入字段,而另一个输入字段被设置为只读。

<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/

相关文章:

php - 带有重复 URL 重定向的本地 Laravel 错误 404

javascript - 在 HTML 区域标记中使用图像

php - 使用 jQuery/AJAX 更新 MYSQL

c# - 连接到 MySQL 数据库 C#

php - 如何使用 jquery 和 php 设置动态数据的默认下拉列表?

php - Codeigniter join 返回同一记录三次

php - 循环查询和查找表。 MySQL 和 PHP

mysql - 如何更改 MySql 中的列标志?

php - inet_pton 不工作

javascript - 更改已应用样式的 html 表格行颜色