Запрос на обновление MySQL или insert or die

#php #mysql #insert #die

#php #mysql #вставить #die

Вопрос:

Допустимо ли делать что-то подобное, я никогда не вижу более 1 оператора or:

 $insert = 'INSERT into fhours (' .$cols . ') VALUES ('.$query.')';
$update = sprintf("UPDATE fhours SET %s WHERE fname='$fname' AND lname='$lname'", $field_list);

$result = $db->query($update) or $db->query($insert) or die('uhoh');`
  

Комментарии:

1. почему бы вам не встроить логику в свой PHP-скрипт? оператор if else?

2. @Rob, нет причин не использовать if / else, просто интересно, приемлем ли приведенный выше код и можно ли это сделать без блока if / else.

Ответ №1:

С этим связаны две проблемы.

Во-первых, вы можете использовать параметризованные запросы. Посмотрите на PDO, это вам очень поможет. Это не только быстрее для нескольких вставок, но вам не нужно так сильно беспокоиться о внедрении SQL.

Во-вторых, вы можете использовать MySQL ON DUPLICATE KEY UPDATE , чтобы решить эту проблему за вас. В противном случае, когда ваш запрос завершается неудачей, вы не знаете, почему это не удалось. Возможно, это вообще не было проблемой с дублирующимся ключом!

В остальном код с точки зрения or просто отличный.

Комментарии:

1. Итак, будет ли мой дублирующий ключ тем fname / lname, который я проверяю?

2. Нет, дублирующий ключ — это любой ключ в таблице, который завершается ошибкой. Если у вас есть УНИКАЛЬНЫЙ ключ, установленный для fname, тогда да.

Ответ №2:

Вы можете связать столько логических операторов, сколько захотите.

Вы также должны принять во внимание механизмы mysql «при дублировании ключа».

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Ответ №3:

Это допустимо? ДА. Рекомендуется ли это? Нет.

Проблема с die() вводом из неудачного SQL-запроса заключается в том, что пользователь в конечном итоге видит ужасный экран, на котором потенциально нет ничего, кроме небольшого количества текста. Это очень плохо.

Вместо этого вы должны обрабатывать эти ошибки таким образом, чтобы вы могли передать пользователю сообщение о неудаче завершения:

 $update_result = $db->query($update);
if(!$update_result) {
  // Yikes! Tell the user something went wrong!
  // Show them an error page or error message
}

$insert_result = db->query($insert);
if(!$insert_result) {
  // Yikes! Tell the user something went wrong!
  // Show them an error page or error message
}
  

На самом деле, также рекомендуется заглянуть в set_error_handler, который позволяет фиксировать фатальные ошибки PHP и вместо отображения ужасных ошибок, которые потенциально раскрывают ваш php path, вот так:

Неустранимая ошибка: не удается использовать операторы assign-op с перегруженными объектами или смещения строк в / check / out/my/directory /structure/wp-admin/includes/file.php в строке 688

Вы можете отправить их на страницу общей ошибки, которая выглядит намного более профессионально.

Ответ №4:

Возможно, вы захотите изучить синтаксис mysql replace into