2014-05-01 7 views
0

Я думал, что наиболее эффективным способом было создать поле таблицы UNIQUE вместо таблицы, чтобы проверить существующие значения, прежде чем делать что-либо еще, но это использует два запроса. Вместо этого с полем UNIQUE требуется только один запрос, потому что MySQL проверяет вас. Проблема в том, что повторяющиеся ошибки ввода вызывают внутреннюю ошибку сервера, с которой я не могу восстановить с PHP. Что вы предлагаете, что лучший способ избежать дублирования записей в PHP-приложении & MySQL?MySQL Как избежать повторяющихся записей из PHP

+0

Лучше проверить и подтвердить дублирование перед запуском запроса на вставку. – Garry

+0

@nedstark. Не лучше ли с ограничением 'UNIQUE', быстрее? – boompow

+0

«Проблема в том, что повторяющиеся ошибки ввода вызывают внутреннюю ошибку сервера, из-за которой я не могу восстановить с PHP», что звучит странно, объясните, пожалуйста, –

ответ

0

Вы можете использовать REPLACE INTO для своего запроса, сначала попробуете вставить, а затем удалите строку с тем же идентификатором и замените ее.

+0

Это не то, что я хочу. Я не хочу ничего заменять, я просто хочу избежать ввода информации, которая уже существует. Вы сказали, что повторные ошибки не могут быть восстановлены, я думаю, что у Дагона другая идея. – boompow

1
  1. Применение ON DUPLICATE KEY

INSERT INTO someTable (идентификатор, количество) ЗНАЧЕНИЯ ($ to_uid, $ send_amount) ПО DUPLICATE KEY суммы UPDATE = сумма + $ send_amount

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

2) Вы можете поймать дублирующее ключевое исключение. Пример PDO:

try{ 
    $stmt->execute(...); 
} 
catch(PDOException $e){ 
    if($e->errorInfo[1] == 1062){ 
     // Mysql returned 1062 error code which means a duplicate key 
    } 
} 
+0

Спасибо, но как насчет mysqli или CodeIgniter, что я использую? Простая попытка/улов не работает. – boompow

+0

Поскольку 'mysqli' не генерирует исключения по умолчанию. Функции 'Mysqli' просто возвращают false. См. Этот ответ, если вы хотите сделать исключения mysqli для исключения из ошибок http://stackoverflow.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli Или просто проверить 'mysqli :: $ errno' для кода 1062 когда, например, 'mysqli :: query' возвращает false –

+0

Угадайте, я спрошу, как это сделать в CodeIgniter. – boompow

0

НАЙДЕНО РЕШЕНИЕ!

CodeIgniter требует установки

$db['default']['stricton'] = TRUE; 

с явным вызовом

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

для того, чтобы MySQL бросать исключения. Исключения также должны быть пойманы.

+0

Я упомянул о 'mysqli_report (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);' в комментариях к ответу. Крутой парень ответил. Отлично –

+0

@Didar_Uranov Я благодарю вас за помощь, но на самом деле это было скорее проблемой CodeIgniter, которую вы не смогли решить. Без установки, о которой я говорил, MySQL не смог бы исключать исключения. – boompow

0

Вы можете использовать INSERT IGNORE, чтобы предотвратить обновление строки и предотвратить исключение исключения из строки, если строка уже существует.

https://dev.mysql.com/doc/refman/5.5/en/insert.html

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении оператора INSERT игнорируются. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице , вызывает ошибку с повторяющимся ключом, и оператор прерывается. С IGNORE строка все еще не вставлена, но ошибки не возникает. Игнорируемые ошибки могут генерировать предупреждения вместо этого, хотя ошибки в дубликат-ключ делают нет.

Смежные вопросы