每次我更新数据库时,它都会创建一个新行,其中包含我尝试更新的新信息和每次新的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
变量。
哪里出了问题。
答案 0 :(得分:1)
UPDATE
语句不会插入新行。必须运行INSERT
语句。 (1)
更新语句的语法对我来说是错误的,我希望这会引发错误。
ON
子句与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
块中处理它。
如果你的代码没有这样做,那就是把它的小拇指放在嘴角的Dr. Evil风格,并说“我只是假设一切都按计划进行。什么?”
此外,代码似乎容易受到SQL注入攻击。如果SQL文本中包含任何可能不安全的值,那么必须必须在包含它们之前进行转义。
首选模式甚至不包括SQL文本中的值,而是将预处理语句与绑定占位符一起使用,并通过占位符提供值。
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
(1。)当然可以定义执行INSERT的BEFORE UPDATE和/或AFTER UPDATE触发器。但它是插入行的INSERT语句,即使触发器的触发是由“运行UPDATE”引起的。
答案 1 :(得分:0)
将CustomerID设置为密钥并添加ON DUPLIACTE KEY UPDATE子句