簡體   English   中英

MYSQL-每次更新數據庫都會創建新記錄

[英]MYSQL - Update database creates new record each time

每次我更新數據庫時,它都會使用我嘗試更新的新信息和每次新的customerID創建一個新行,是否可以解決此問題。

更新查詢將調用兩個表Cus_acct_details和cus_register。 該查詢旨在更改兩個表中的cus_email,並更新cus_acct_details中的所有信息。

的PHP

<?php

//$user = $_SESSION["Cus_Email"];
$Cust_ID = $_SESSION["CustomerID"];
if (isset($_POST['Update'])) {
    $UpdateFname = $_POST['fname'];
    $UpdateLname = $_POST['Lname'];
    $UpdateEmail = $_POST['email'];
    $UpdatePhone = $_POST['phone'];
}
$sql = $dbc->query("UPDATE Cus_Register, Cus_acc_details 
                       SET Cus_acc_details.CUS_Fname = ' $UpdateFname', 
                           Cus_acc_details.CUS_Lname = ' $UpdateLname', 
                           Cus_acc_details.CUS_Email = ' $UpdateEmail', 
                           Cus_acc_details.Cus_Phone = ' $UpdatePhone', 
                           Cus_Register.CUS_Email = ' $UpdateEmail', 
                        ON Cus_Register.Cus_Email = Cus_acc_details.Cus_Email 
                     WHERE Cus_Register.CustomerID = '$Cust_ID' 
                  ");
print_r($_POST);
header('Location: Cus_Account.php');
?>

的HTML

<section class="container">
    <form id="myform " class="Form" method="post" action="Cus_Account.php?c_id=<?php echo $c_id ?>" accept-charset="utf-8">

        <!--                    <div id="first">-->
        <input type="text" id="fname" name="fname" value="<?php echo $_SESSION['fname']; ?>" required> 
        <input type="text" id="lname" name="lname" value="<?php echo $_SESSION['lname']; ?>"  required>
        <input type="text" id="email" name="email" value="<?php echo $_SESSION['Cus_Email']; ?>" required>
        <input type="number" id="phone" name="phone"  value="<?php echo $_SESSION['phone']; ?>"  required>
        <input type="submit" name="Update" value="Update">
        <br>
    </form>

$cust_id變量已在前面定義。

哪里出了問題。

UPDATE語句不會插入新行。 必須有一個正在運行的INSERT語句。 (1)

更新語句的語法對我來說似乎不對,我希望這會引發錯誤。

ON子句與JOIN關鍵字一起使用,但老式逗號運算符用於JOIN操作。 SET子句應該是WHERE子句之前的最后一件事。

 UPDATE Cus_Register
   JOIN Cus_acc_details 
     ON Cus_Register.Cus_Email = Cus_acc_details.Cus_Email
    SET Cus_acc_details.CUS_Fname = ?
      , Cus_acc_details.CUS_Lname = ?
      , Cus_acc_details.CUS_Email = ?
      , Cus_acc_details.Cus_Phone = ?
      , Cus_Register.CUS_Email = ?
  WHERE Cus_Register.CustomerID = ?

字符串文字中有多余的空格似乎很奇怪。

->query()的返回值分配給變量是一種常見的模式。 但是命名該變量$sql很奇怪。

規范模式是將SQL文本(字符串)分配給名為$sql的變量,然后引用該變量

 $sql = 'SELECT foo FROM bar ORDER BY foo LIMIT 1';
 $result = $dbc->query($sql);

然后檢查查詢返回,看是否成功或是否發生錯誤。 如果使用的是PDO,則可以配置連接以引發異常,並在catch塊中對其進行處理。

如果您的代碼不這樣做,那就是將小指放在嘴邊,就像Evil博士所說的那樣,然后說:“我只是假設一切都按計划進行。什么?”

而且,該代碼似乎容易受到SQL注入的攻擊。 如果SQL文本中包含任何潛在的不安全值,則在包含這些值之前必須對其進行正確的轉義。

首選模式甚至不包括SQL文本中的值,而是使用帶綁定占位符的 預處理語句 ,並通過占位符提供值。

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

(1.)當然,可以定義執行INSERT的BEFORE UPDATE和/或AFTER UPDATE觸發器。 但是,即使是通過運行UPDATE“引起”觸發器的觸發,也是插入行的INSERT語句。

將CustomerID設置為鍵,並添加ON DUPLIACTE KEY UPDATE子句

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM