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

时间:2016-01-15 05:36:24

标签: 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));
?>

2 个答案:

答案 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));
?>