MYSQL - 每次更新数据库都会创建新记录

时间:2016-03-23 23:44:12

标签: php mysql updates

每次我更新数据库时,它都会创建一个新行,其中包含我尝试更新的新信息和每次新的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变量。

哪里出了问题。

2 个答案:

答案 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子句