2016-03-24 2 views
-1

J'ai eu la pire des chances avec la mise à jour et l'insertion dans une base de données. Mon insertion dans une base de données fonctionne parfaitement, je ne peux pas mettre à jour.MYSQL - ON DUPLICATE KEY ne met pas à jour

J'ai fatigué deux requêtes séparées pour mettre à jour l'autre insertion, mais la mise à jour ne fonctionne jamais. J'utilise maintenant le déclencheur ON DUPLICATE KEY et une fois de plus, l'information ajoute simplement un enregistrement à chaque fois au lieu de mettre à jour. Où vais-je mal? Je travaille sur cela depuis un jour et demi maintenant et n'arrive pas à aller n'importe où. problèmes newbee!

<?php 
    $Cust_ID = $_SESSION["CustomerID"]; 
    if (isset($_POST['Update'])) { 
     $c_fname = $_POST['fname']; 
     $c_lname = $_POST['lname']; 
     $c_email = $_POST['email']; 
     $c_phone = $_POST['phone']; 

    // Save $_POST to $_SESSION 
    //query 

    $insert_det = "INSERT INTO Cus_acc_details(CUS_Fname,CUS_Lname,Cus_Email,CUS_Phone) 
    VALUES (?,?,?,?) 
    ON DUPLICATE KEY 
    UPDATE 
    CUS_Fname = '$c_fname', 
    Cus_Lname = '$c_lname'"; 

$stmt = mysqli_prepare($dbc, $insert_det); 
//new 
// $stmt = mysqli_prepare($dbc, $insert_c); 
//debugging 
//$stmt = mysqli_prepare($dbc, $insert_c) or die(mysqli_error($dbc)); 

mysqli_stmt_bind_param($stmt, 'sssi', $c_fname, $c_lname, $c_email, $c_phone); 

/* execute query */ 
$r = mysqli_stmt_execute($stmt); 

// if inserted echo the following messges 
if ($r) { 
    echo "<script> alert('registration sucessful')</script>"; 
} 
} else { 
echo "<b>Oops! Your passwords do not </b>"; 
} 
?> 

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> 

à la fois le CUSTOMER_ID et sur le terrain Cus-_email de sont définies comme unique sur le bd, cependant, garder les enregistrements à insérer dans le db. Toute aide serait appréciée.

SHOW CREATE

CREATE TABLE `Cus_acc_details` (
`CustomerID` tinyint(11) NOT NULL AUTO_INCREMENT, 
`AcctId` varchar(100) NOT NULL, 
`CUS_Fname` varchar(45) DEFAULT NULL, 
`Cus_Lname` varchar(45) DEFAULT NULL, 
`CUS_Phone` varchar(45) NOT NULL, 
`Cus_Email` varchar(200) NOT NULL, 
PRIMARY KEY (`CustomerID`), 
UNIQUE KEY `CustomerID` (`CustomerID`), 
UNIQUE KEY `CustomerID_2` (`CustomerID`,`Cus_Email`) 
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=outfit 
+1

Pouvez-vous ajouter la sortie SHOW CREATE TABLE Cus_acc_details' à la question? – Barmar

+0

L'index unique sur 'cus_email' est-il en lui-même ou est-il un index composite comme' (customer_id, cus_email) '? Ce dernier ne rend pas 'cus_email' unique, seulement la combinaison de l'ID et de l'email. Et puisque chaque ligne insérée obtient un ID différent, la condition de clé en double ne se produit pas. – Barmar

+0

@Barmar comment puis-je contourner cela. Comme le fname, lname ne peut pas être unique – jerneva

Répondre

2

Vous devez changer

UNIQUE KEY CustomerID_2 (CustomerID, Cus_Email) 

à:

UNIQUE KEY Email (Cus_Email) 

Sinon, il ne fait que la combinaison de numéro de client et e-mail unique, pas l'e-mail par lui-même, de sorte que vous pouvez avoir des e-mails en double avec des ID différents. Puisque votre INSERT ne spécifie pas l'ID (car il est ajouté automatiquement avec AUTO_INCREMENT), les données insérées n'ont pas de clé en double.

En outre, vous n'avez pas besoin

UNIQUE KEY CustomerID (CustomerID) 

car la clé primaire est automatiquement une clé unique.

Alors procédez comme suit:

ALTER TABLE Cus_acc_details 
    DROP KEY CustomerID, 
    DROP KEY CustomerID_2, 
    ADD UNIQUE KEY Email (Cus_Email); 
+0

Merci. tellement de. Je ne peux pas croire que j'étais si proche mais si loin – jerneva