2016-03-23 12 views
0

Jedes Mal, wenn ich die Datenbank aktualisiere, erstelle ich eine neue Zeile mit den neuen Informationen, die ich zu aktualisieren versuchte, und jeweils eine neue customerID, gibt es eine Möglichkeit, dies zu beheben.MYSQL - Update-Datenbank erstellt jedes Mal einen neuen Datensatz

Die Aktualisierungsabfrage ruft zwei Tabellen Cus_acct_details und cus_register auf. Die Abfrage soll cus_email in beiden Tabellen ändern und alle Informationen in cus_acct_details aktualisieren.

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> 

Die $cust_id Variable früher definiert wurde.

Wo ist ein Fehler aufgetreten.

+5

Ein Update wird nie einen neuen Datensatz einfügen, also muss sg else falsch gehen. – Shadow

+0

Auch ich denke, Sie müssen Ihre Abfrage innerhalb 'if' Bedingung einfügen – fusion3k

+1

Warum müssen Sie die Aktion überprüfen? Überprüfen Sie die Datenbank, falls die customerID gefunden wurde, und aktualisieren Sie sie. Fügen Sie auch die Aktualisierungsabfrage in if block ein. Warum ist es außerhalb des if-Blocks? –

Antwort

0

CustomerID Legen Sie einen Schlüssel und fügen Sie eine ON DUPLIACTE KEY UPDATE-Klausel

1

Eine UPDATE Aussage wird nicht eine neue Zeile einzufügen. Es muss eine INSERT-Anweisung ausgeführt werden. (1)

Die Syntax der Update-Anweisung sieht für mich falsch aus, ich würde erwarten, dass es einen Fehler gibt.

Die ON-Klausel wird mit dem Schlüsselwort JOIN verwendet, aber der Oldschool-Kommaoperator wird für die Join-Operation verwendet. Die SET Klausel sollte die letzte Sache vor der WHERE Klausel sein.

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 = ? 

Es scheint seltsam, dass es ein zusätzlicher Platz in dem Stringliterale.

Die Zuordnung der Rückgabe von ->query() zu einer Variablen ist ein übliches Muster. Aber die Variable $sql zu nennen ist sehr seltsam.

Die normativen Muster sind der SQL-Text (String) auf eine Variable mit dem Namen $sql und dann Verweis auf die Variable

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

Dann überprüfen Sie die Rückkehr von Abfrage zuweisen, um zu sehen, ob es erfolgreich war, oder wenn ein Fehler aufgetreten ist. Wenn Sie PDO verwenden, können Sie die Verbindung so konfigurieren, dass eine Ausnahme ausgelöst wird, und sie in einem catch-Block behandeln.

Wenn Ihr Code das nicht tut, setzt er seinen kleinen Finger in den Mundwinkel Dr. Evil Stil und sagt: "Ich gehe davon aus, dass alles nach Plan läuft. Was?"

Auch der Code scheint anfällig für SQL-Injection zu sein. Wenn potenziell schädliche Werte im SQL-Text enthalten sind, müssen diese Werte ordnungsgemäß entkoppelt werden, bevor sie eingeschlossen werden.

Das bevorzugte Muster ist nicht einmal die Werte in dem SQL-Text enthalten, aber vorbereitete Anweisungen mit binden Platzhalter, und liefern die Werte durch die Platzhalter zu verwenden.

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

(1.) natürlich möglich, es ist ein BEFORE UPDATE und/oder eine After UPDATE-Trigger zu definieren, die eine INSERT ausführt. Aber es ist die INSERT-Anweisung, die die Zeile einfügt, selbst wenn das Auslösen des Triggers durch Ausführen eines UPDATE "verursacht" wird.

+0

Hallo. Vielen Dank. Es gibt überhaupt keine Fehler, die Zeilen werden jetzt nicht eingefügt, da ich vergessen habe, die Cus_Email einzigartig zu machen, dumme mich. Aber der Datensatz wird jetzt überhaupt nicht aktualisiert. Ja, du hast Recht, ich habe vor dem Update eine Abfrage einfügen. – jerneva

Verwandte Themen