Vorrei passare PDO INSERT e UPDATE istruzioni preparate su INSERT e ON DUPLICATE KEY UPDATE poiché penso che sarà molto più efficiente di quello che ho ' sto facendo attualmente, ma non riesco a trovare la sintassi corretta da utilizzare con segnaposto e bindParam nominati.Istruzioni PDO preparate per INSERT e ON DUPLICATE KEY UPDATE con segnaposti con nome
Ho trovato diverse domande simili su SO, ma sono nuovo di PDO e non è riuscito ad adattare il codice per i miei criteri. Questo è quello che ho provato, ma non funziona (non inserire o aggiornare):
try {
$stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) VALUES(:user_id, :fname, :lname)'
'ON DUPLICATE KEY UPDATE customer_info SET fname= :fname,
lname= :lname
WHERE user_id = :user_id');
$stmt->bindParam(':user_id', $user_id);
$stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);
$stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR);
$stmt->execute();
}
Questa è una versione semplificata del mio codice (ho diverse domande, e ogni query ha tra 20 - 50 campi). Attualmente sto aggiornando per primo e controllando se il numero di righe aggiornate è maggiore di 0 e se non è in esecuzione l'Insert, e ognuna di queste query ha il proprio set di istruzioni bindParam.
Non riutilizzare lo stesso segnaposto in più luoghi nella stessa query. La tua connessione PDO è impostata per generare eccezioni? A meno che tu non abbia una reale necessità di 'bindParam',' bindValue' o il passaggio di parametri attraverso 'execute' è una scelta migliore. – DCoder
Quando dici che non dovrei riutilizzare lo stesso segnaposto in più punti, vuoi dire che devo avere 2 set di istruzioni bindParam? Ce l'ho attualmente impostato con - catch (PDOException $ e) {echo 'Error:'. $ e-> getMessage();} - e non ricevo alcun messaggio di errore per questo codice. –
Il semplice tentativo di aggirare la query non è sufficiente. Vedere [Gestione degli errori] (http://us.php.net/manual/en/pdo.error-handling.php) e configurarlo per generare eccezioni sugli errori. – DCoder