[英]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.