2016-01-15 26 views
0

我創建了一個表單,其中包含一個具有自動完成功能的輸入字段,另一個輸入字段被設置爲只讀。在一個過程中在不同表格中插入和更新

<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

這是一個有點不清楚,你要完成什麼。 「在一個進程中將插入和更新查詢結合到不同表中,就像我的進程代碼一樣」是什麼意思?你的意思是你想要做一個SQL查詢,一次插入和更新? (因爲你想讓它們成爲原子嗎?或者因爲你只想對數據庫執行一個查詢?) – jbafford

+1

嗯,這是可能的@pvegetah –

+0

這可能有助於[多個語句在一個查詢中](http://stackoverflow.com/ question/11632902/mysqli-can-it-prepare-multiple-queries-in-one-statement) –

回答

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)); 
?> 
+0

謝謝你的作品你的代碼。 – pvegetah

+0

很棒........... –

2

不,這是不可能執行INSERT一個表和UPDATE在同一個SQL語句的另一個表。

使用觸發器可能可以實現您想要的功能(例如AFTER UPDATE ON您正在更新的表格可以執行INSERT但您無法將參數傳遞給觸發器,這些值必須可用從該行要更新,或者從一個用戶定義的變量。


但是,這並沒有真正似乎是這個問題。這似乎是你真正想要的是一個交易,你只需要如果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的會話變量的設置。)

AFTER UPDATE ON tbl_userlist觸發的身體,你可以執行下面的INSERT ...

INSERT INTO tbl_reset_change_expire_password (userid, lastdate_resetpw) 
SELECT NEW.userid, NOW() 

但是,這是兩個單獨的語句執行,但您只需執行代碼中的UPDATE即可。 INSERT將通過觸發器在「幕後」進行。

相關問題