2016-07-26 27 views
0

Ich habe eine Datenbank, die Informationen auf Clients speichert. Ich habe ein eindeutiges Feld für Telefonnummern, die "Telefon" genannt werden. Ich versuche, parametrisierte Abfragen für INSERT in die Tabelle zu verwenden, und auf einem doppelten Schlüssel aktualisieren Sie die Client-Informationen. Ich habe viermal die Rechtschreibung überprüft, und alles scheint auf dem neuesten Stand zu sein. Ich bekomme den Fehler "check ... für die richtige Syntax in der Nähe von WHERE` Phone` verwenden =? "Parameter Insert ... On Duplicate Key UPDATE fehlschlägt mit SET-Semantik

// 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" 
); 

Und später bin Bindung ich die Parameter wie so

// 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']); 

Diese genaue Struktur funktioniert perfekt, wenn ich die Abfrage

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

Ich habe versucht, zu ändern habe auf demselben alles setzen Linie, und es warf den gleichen Fehler (nur auf eine andere "Zeilennummer"). Was um alles in der Welt mache ich hier falsch?

PS: Ich bin mit PHP/PDO

+1

Vielleicht ist es, einige Handbücher über 'DUPLICATE KEY UPDATE 'zu lesen? –

+0

Ich bin mir nicht sicher, ob ich folge –

Antwort

0

Es stellt sich die Frage, war die Tatsache, dass ich in der Abfrage doppelten Platzhalter hatte. Ich änderte es zu diesem

// 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 
"); 

Und es hat funktioniert!

+0

Gleiche Platzhalter sind in Ordnung. Ihr Problem besteht darin, dass diese Abfrage 'WHERE' nicht unterstützt. –

+0

wirklich? .... Warum ist das, wenn ich darf? Erkennt MySQL automatisch, welche Zeile aktualisiert werden soll? (Das würde Sinn machen ....). Entweder entfernte ich die WHERE-Klausel sowie den Parameter: phoneKey. Ich erhalte den Fehler "ungültige Anzahl von Parametern". Ich werde weiter graben. Danke für den Tipp, entweder Weg –

+0

Ihre Spalte "Telefon" ist einzigartig - mysql weiß definitiv, welche Aufzeichnung diesen Wert enthält –