2016-07-26 1 views
0

J'ai une base de données qui stocke des informations sur les clients. J'ai un champ unique pour les numéros de téléphone appelé "Téléphone". J'essaie d'utiliser des requêtes paramétrées pour INSÉRER dans la table, et sur une clé en double, mettre à jour les informations des clients. J'ai quadruple vérifié l'orthographe, et tout semble à la hauteur. Je continue à obtenir l'erreur "vérifier ... pour la syntaxe correcte à utiliser près de WHERE` Phone` =? "Parameterize Insert ... Sur la clé dupliquée UPDATE échoue en utilisant la sémantique SET

// These are the fields that we want to Upsert 
$fields = " 
    `Objectives` = :objectives, 
    `LiquidFunds` = :liquidFunds, 
    `UnitNumber` = :unitNumber, 
    `Accredited` = :accredited, 
    `FirstName` = :firstName, 
    `LastName` = :lastName, 
    `Street`  = :street, 
    `Phone`  = :phone, 
    `Email`  = :email, 
    `State`  = :state, 
    `Notes`  = :notes, 
    `City`  = :city, 
    `Zip`   = :zip 
"; 



$updateLead = $dbHandle -> prepare(" 
    INSERT INTO `Leads` SET $fields 
    ON DUPLICATE KEY UPDATE $fields WHERE `Phone` = :phoneKey" 
); 

Et plus tard, je suis liant les paramètres comme si

// Bind our parameters to the updateLead query 
$updateLead -> bindParam(":objectives" , $objectives); 
$updateLead -> bindParam(":liquidFunds", $_POST['liquidFunds']); 
$updateLead -> bindParam(":unitNumber" , $_POST['unitNumber']); 
$updateLead -> bindParam(":accredited" , $_POST['accredited']); 
$updateLead -> bindParam(":firstName" , $_POST['fname']); 
$updateLead -> bindParam(":lastName" , $_POST['lname']); 
$updateLead -> bindParam(":street"  , $_POST['street']); 
$updateLead -> bindParam(":phone"  , $_POST['phone']); 
$updateLead -> bindParam(":phoneKey" , $_POST['phone']); 
$updateLead -> bindParam(":email"  , $_POST['email']); 
$updateLead -> bindParam(":state"  , $_POST['state']); 
$updateLead -> bindParam(":notes"  , $_POST['notes']); 
$updateLead -> bindParam(":city"  , $_POST['city']); 
$updateLead -> bindParam(":zip"  , $_POST['zip']); 

Cette structure exacte fonctionne parfaitement si je change la requête à

$updateLead = $dbHandle -> prepare("UPDATE `Leads` SET $fields WHERE `Phone` = :phoneKey); 

J'ai essayé de mettre tout sur le même ligne, et il a jeté la même erreur (juste sur un "numéro de ligne" différent). Qu'est-ce que je fais mal ici?

PS: J'utilise PHP/AOP

+1

Peut-être que c'est pour lire quelques manuels sur 'DUPLICATE KEY UPDATE'? –

+0

Je ne suis pas sûr de suivre –

Répondre

0

Il se trouve la question était le fait que j'avais en double dans les espaces réservés à la requête. Je l'ai changé à ceci

// These are the fields that we want to Upsert 
$fields = " 
    `Objectives` = :objectives, 
    `LiquidFunds` = :liquidFunds, 
    `UnitNumber` = :unitNumber, 
    `Accredited` = :accredited, 
    `FirstName` = :firstName, 
    `LastName` = :lastName, 
    `Fronter`  = :fronter, 
    `Street`  = :street, 
    `Phone`  = :phone, 
    `Email`  = :email, 
    `State`  = :state, 
    `Notes`  = :notes, 
    `City`  = :city, 
    `Zip`   = :zip 
"; 

$updateFields = " 
    `Objectives` = VALUES(Objectives), 
    `LiquidFunds` = VALUES(LiquidFunds), 
    `UnitNumber` = VALUES(UnitNumber), 
    `Accredited` = VALUES(Accredited), 
    `FirstName` = VALUES(FirstName), 
    `LastName` = VALUES(LastName), 
    `Fronter`  = VALUES(Fronter), 
    `Street`  = VALUES(Street), 
    `Phone`  = VALUES(Phone), 
    `Email`  = VALUES(Email), 
    `State`  = VALUES(State), 
    `Notes`  = VALUES(Notes), 
    `City`  = VALUES(City), 
    `Zip`   = VALUES(Zip) 
"; 


$updateLead = $dbHandle -> prepare(" 
    INSERT INTO `Leads` SET $fields 
    ON DUPLICATE KEY UPDATE $updateFields 
"); 

Et cela a fonctionné!

+0

Les mêmes espaces réservés sont corrects. Votre problème est que cette requête ne prend pas en charge 'WHERE'. –

+0

vraiment? .... Pourquoi est-ce, si je peux? Est-ce que MySQL sait automatiquement quelle ligne mettre à jour? (Cela aurait du sens ....). Dans les deux cas, j'ai supprimé la clause WHERE, ainsi que le paramètre: phoneKey. Je reçois une erreur "nombre de paramètres non valide". Je vais continuer à creuser. Merci pour l'astuce de toute façon –

+0

Votre colonne 'Phone' est unique - mysql sait certainement quel disque contient cette valeur –