Chciałbym zmienić przygotowane instrukcje PDO INSERT i UPDATE na INSERT i ON DUPLICATE KEY UPDATE, ponieważ myślę, że będzie to o wiele bardziej wydajne niż to, co ja. Obecnie wykonuję, ale mam problem z określeniem poprawnej składni do użycia z nazwanymi symbolami zastępczymi i bindParam.PDO przygotowało instrukcje dla INSERT i NA DUPLICATE KEY UPDATE z nazwanymi symbolami zastępczymi
Znalazłem kilka podobnych pytań na SO, ale jestem nowy w PDO i nie mogłem z powodzeniem dostosować kodu do moich kryteriów. To co próbowałem, ale to nie działa (nie wkładać lub aktualizacja):
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();
}
To jest uproszczoną wersją mojego kodu (mam kilka pytań, a każde zapytanie ma między 20 - 50 pól). Obecnie aktualizuję najpierw i sprawdzam, czy liczba zaktualizowanych wierszy jest większa od 0, a jeśli nie, to uruchom Wstaw, a każde z tych zapytań ma własny zestaw instrukcji bindParam.
Nie używaj tego samego zastępczy w wielu miejscach w tym samym zapytaniu. Czy twoje połączenie PDO ma ustawione wyjątki? Jeśli nie masz prawdziwej potrzeby 'bindParam', lepszym wyborem jest' bindValue' lub przekazanie parametrów przez 'execute'. – DCoder
Kiedy mówisz, że nie powinienem ponownie używać tego samego symbolu zastępczego w wielu miejscach, masz na myśli, że muszę mieć 2 zestawy instrukcji bindParam? Mam go obecnie ustawiony z - catch (PDOException $ e) {echo "Błąd:". $ e-> getMessage();} - i nie otrzymuję żadnych komunikatów o błędach dla tego kodu. –
Samo wstawienie spróbuj/złap wokół kwerendy, nie wystarczy. Zobacz [Obsługa błędów] (http://us.php.net/manual/en/pdo.error-handling.php) i skonfiguruj go tak, aby zgłaszał wyjątki w przypadku błędów. – DCoder