Я хотел бы переключить подготовленные операторы PDO INSERT и UPDATE на INSERT и ON DUPLICATE KEY UPDATE, поскольку я думаю, что это будет намного эффективнее, чем то, что я делаю сейчас, но у меня возникают проблемы с определением правильного синтаксиса для использовать с именованными заполнителями и bindParam.
Я нашел несколько похожих вопросов по SO, но я новичок в PDO и не смог успешно адаптировать код для своих критериев. Это то, что я пробовал, но не работает (не вставляет и не обновляет):
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();
}
Это упрощенная версия моего кода (у меня несколько запросов, и в каждом запросе от 20 до 50 полей). В настоящее время я сначала обновляю и проверяю, больше ли количество обновленных строк, чем 0, а если нет, то запускаю Insert, и каждый из этих запросов имеет собственный набор операторов bindParam.
bindParam
,bindValue
или передача параметров черезexecute
- лучший выбор. - person DCoder   schedule 30.12.2012bindParam
иbindValue
.$stmt->execute(array(':fname' => $_POST['fname']))
также можно использовать для передачи связанных переменных. На мой взгляд,execute
- самый простой вариант, и ему следует отдавать предпочтение, если вам не нужны конкретные варианты поведенияbindParam
илиbindValue
. Конечно, ваш пробег может отличаться. - person DCoder   schedule 30.12.2012