Как сделать проверку есть ли такая запись в бд

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Сегодня возникла проблема дублирования строк в базе MySQL, потратил много времени на поиски и нашел такую итересную статью. Надеюсь она вам поможет, как и мне. Источник статьи указал в конце страницы.

Задача

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

Создать индекс на несколько столбцов можно так:

Где db_name - имя вашей базы данных, table_name - имя таблицы в базе, name_index - название индекса, `app`, `email`, `other_field` - группируемые поля в уникальный индекс.

Решение

Один из способов – просто игнорировать ошибку, другой – использовать предложение INSERT IGNORE или REPLACE, каждое из которых изменяет поведение MySQL в отношении обработки повторений.

По умолчанию MySQL генерирует ошибку при вставке записи, дублирующей существующий уникальный ключ. Например, если таблица person содержит уникальный индекс для столбцов last_name и first_name, то вы увидите следующее:

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

Если вы хотите предотвратить появление ошибки, то, вероятно, подумываете о решении задачи обработки дубликатов с помощью двух запросов: запустите SELECT, чтобы определить, есть ли уже такая запись, а затем – INSERT, если записи еще нет. Но на самом деле ничего не получится. Другое клиентское приложение может вставить такую же запись в промежуток между вашими SELECT и INSERT, и тогда опять-таки сгенерируется ошибка. Чтобы это не произошло, можно заключить два предложения в транзакцию или заблокировать таблицы, но тогда вместо двух предложений у вас появится четыре. MySQL предлагает два решения задачи обработки дубликатов, каждое из которых состоит из единственного предложения:

Первый cпособ: Используйте предложение INSERT IGNORE вместо INSERT.

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

Значение счетчика строк показывает, была запись вставлена или проигнорирована.

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

Второй способ: Используйте предложение REPLACE вместо INSERT.

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

Значение количества обработанных строк во втором случае равно 2, так как исходная запись удалена, а на ее место вставлена новая запись.

Выбор INSERT IGNORE или REPLACE зависит от того, какое поведение для вас предпочтительно. INSERT IGNORE хранит первую из множества повторяющихся записей и удаляет остальные. REPLACE хранит последний из дубликатов и удаляет все остальные. Предложение INSERT IGNORE эффективнее, чем REPLACE, так как дубликаты не вставляются в таблицу. То есть его лучше применять, когда вы просто хотите убедиться в том, что копия указанной записи содержится в таблице.

С другой стороны, REPLACE больше подходит для таблиц, в которых может потребоваться обновление других столбцов, не входящих в ключ. Предположим, что у вас есть таблица users, используемая в веб-приложении для хранения адресов электронной почты и паролей, в которой email является ключом:

Как создавать записи для новых пользователей и изменять пароли для существующих? Без REPLACE, создание нового пользователя и изменение пароля существующего, обрабатывались бы по-разному. Стандартный алгоритм мог бы быть таким:

  1. Запустить SELECT, чтобы проверить, существует ли уже запись с указанным значением email.
  2. Если такой записи нет, добавить новую при помощи INSERT.
  3. Если запись существует, обновить ее при помощи UPDATE.

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

Если запись с указанным адресом электронной почты не существует, то MySQL создает новую. Если запись существует, MySQL заменяет ее. В результате обновляется столбец password записи, содержащей данный адрес.



В этой статье Вас ждет курс по подключению и работе с базой данных SQL, хранение и получение данных, все это мы будем использовать при создании бота Вконтакте

Если Вы читаете эту статью, значит Вы уже более менее разбираетесь в работе сервера. Для начала давайте рассмотрим то, что требуется для работы с базой данных.
Сервер с PHP не ниже 5.6
MySQL 5.5.х и выше
А теперь я отвечу на несколько вопросов
Что такое MySQL - Это система управления базами данных (СУБД), простым языком, с помощью MySQL мы можем сохранять, получать и удалять данные из таблиц.
Почему лучше выбирать SQL? Хранение данных в файлах при большом объеме информации будет с каждым разом нагружать работу вашего скрипта, дело может дойти до того, что данные просто не будут сохранятся. При использовании MySQL это проблема пропадает из за высокой скорости работы и структурированного хранения данных, что идеально подходит для работы с большим объемом данных.

операторы определения данных:
CREATE создаёт объект БД (саму базу, таблицу, представление, пользователя и т. д.),
ALTER изменяет объект,
DROP удаляет объект;
операторы манипуляции данными:
SELECT выбирает данные, удовлетворяющие заданным условиям,
INSERT добавляет новые данные,
UPDATE изменяет существующие данные,
DELETE удаляет данные;

Для нашего проекта мы будем использовать операторы манипуляции данными, давайте уже начнем. В связи с тем что мы используем PHP для создания бота, то сами разработчики PHP рекомендуют использовать MySQLi, а начиная с версии PHP 7.x работает только MySQLi

MySQLi (от англ. MySQL improved) — расширение драйвера реляционных баз данных, используемого в языке программирования PHP для предоставления доступа к базам данных MySQL. MySQLi является обновлённой версией драйвера PHP MySQL, и даёт различные улучшения в работе с базами данных.

Перед тем как мы приступим к подключению, я рекомендую скачать среду разработки PHPStorm. Данная среда помогает в разработке, указывая на ошибки и подсказки при написании кода.

Что бы упростить работу с подключением и дальнейшей работой с базами данных, нужно скачать библиотеку и распаковать ее на сервер. Используя данную библиотеку, нам будет проще обращаться и получать данные с базы данных (далее БД).
vendor.rar

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

Берем готовый код с прошлой статьи

Админ права нужно было прописывать постоянно в скрипте, в строке
Это не совсем удобно, давайте создадим команду !админ, которая будет принимать 1 аргумент, это ID пользователя, его мы уже научились принимать в той же статье про исключение пользователя.


Такой командой мы получаем ID пользователя

Этот ID мы будем сохранять в базу данных, потом получать его и сверять, есть ли этот ID в БД, если да, то даем доступ к команде.

Теперь создаем базу данных. Сделать это можно используя панель управления ISPManager, она предоставляется практически всегда, заходим и выбираем Базы данных и создаем новую БД, название bot, пользователь и пароль придумайте свои, сохраняем.

Теперь ниже переходим в phpMyAdmin

Или просто перейти с раздела Базы данных, если такая кнопка есть

После того как зашли в phpMyAdmin, нам нужно создать таблицу в БД, выбираем сверху в меню SQL и вставляем туда запрос, не забудьте выбрать название БД, где мы будем создавать саму таблицу


Наша таблица готова, теперь мы можем сохранять туда наши данные, это будет ID пользователя. Переходим к нашему коду и делаем подключение к БД, выше мы скачали библиотеку для работы с БД, распакуем ее в корень, где лежит наш бот

и делаем подключение в самом скрипте


Таким простым способом мы подключились к БД, все это благодаря библиотеке. Давайте теперь сохраним наши первые записи в БД, переходим снова к админке и создаем запрос используя оператор INSERT


Давайте напишем команду и посмотрим что произойдет
Данные сохранились в таблицу, но если мы повторно отправим команду с этим же ID, будет создана еще 1 запись, а это нам не нужно, давайте сделаем проверку, если запись уже есть, то ничего предупредим об этом, иначе создадим запись в БД


Что бы проверить наличие записи, нужен оператор SELECT, им будем проверять наличие записей в БД. Давайте сделаем проверку на наличие записи в БД. Пишем следующий код:


Как вы уже догадались из комментариев к коду, мы сделали проверку на запись, иначе создаем новую запись, давайте проверим.

Таким образом делается проверка на наличие записи.

Теперь рассмотрим вариант получения данных с базы данных, это делается так же легко и просто. Используем все тот же оператор SELECT

Таким образом мы получили данные с БД и вывели их с помощью бота. Такой способ выводит только 1 запись, для вывода нескольких записей нужно использовать цикл WHILE

Создаем еще 1 запись в БД и проверим получения данных из БД:

С получением данных разобрались, теперь рассмотрим последний пример на сегодня, это UPDATE, для обновления записей в БД.

В SET указываем то, что нужно обновить, если в строке несколько записей, указывайте их через запятую. Таким образом мы обновилиID пользователя. Используя статьи с нашего сайта, вы уже можете создать полноценного бота, или обратиться в нашу группу за разработкой.

Запись в базу данных mysql на php через форму

Рассмотрим на примере, как создать форму, с помощью которой мы будем делать запросы в базу данных mysql на языке php, используя PDO.

1. Создадим разметку html-формы

Форма отправляется методом POST и обрабатывается на текущей странице.

2. Создадим таблицу, в которую будем записывать данные

Можно выполнить через SQL в PhpMyAdmin или ручками.

3. Подключимся к базе данных и напишем запрос для записи.

Подключимся к базе данных.

Кодировку установили, чтобы избежать лишних проблем (не обязательно).

Не забудьте заранее создать таблицу в базе данных с трёмя значениями (id, name, text), подробнее об этом читать здесь.

Далее напишем наш запрос для записи в базу данных и запишем его в переменную.

Здесь мы сначала все наши данные для записи записываем в переменную $data, затем подготавливаем запрос с плейсохледарами (переменные) и выполняем запрос передавая ему данные для заполнения из $data

Создадим небольшую проверку, чтобы знать, выполнился ли наш запрос или нет.

4. Подключение формы к запросу

Форму создали, к базе подключились и написали запрос, теперь нужно связать всё это.

Форма отправляется методом POST, поэтому мы можем сделать проверку на него, а именно на любое поле формы.

У нас передаются поля с именами "name" и "text", на них мы и сделаем проверку.

Вставим весь наш скрипт в эту проверку:

То есть, если существует значения "name" и "text" переданные методом POST, то выполняется подключение к БД и запись в таблицу.

if(!mysql_num_rows($connect))
<
header("Location: /");
exit;
>

К примеру, у нас в БД есть 391.394 записей.
Нам нужно просто подсчитать, сколько записей будет, можно использовать как:

Так-же можно сделать и так:

Проблема в том, что первый скрипт будет в 3-4 раза медленнее получать информацию, чем второй.

Вот теперь про мой случайно, мы должны показать на одной странице полную информацию по уникальному id (он не повторяется никогда).
Но проблема возникла в том, что мы можем попытаться сделать запрос по id, который был удален. Т.е. он не существует. Теперь нужно сделать проверку, которая будет проверять, есть-ли в запросе к MySQL, запись под id который может как существовать так и не существовать.

но я и спрашиваю - у вас один id? вам нужно общее число или же только проверить есть запись в базе или нет?

будет долго думать.
в результате ничего не найдем, и переносим пользователя назад.

Вот так будет разумно?:

если же, как и сказал, только один id, то запрос, даже с большим количеством записей, сильно тормозить не будет - это уже задача MySQL в том, чтобы оптимизировать поиск данных. иначе вам придется уже возиться с индексацией данных или разбивать базу на несколько частей.

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

К примеру, у нас в бд:

id|name
1|PRO
2|Cheery
3|Sutar
5|Master

У вас всё показывает.
если сделать запрос:

теперь сделаем так-же только не active а false:

при последнем запросе, мы видим что нам показало:

сначала не упомянули, что id уникальный, поэтому и было высказано предположение, что выбирается слишком много данных из базы, для чего и указана оптимизация.

если же выбирается только одна строка из базы, то никаких тормозов с mysql_num_rows нет и не должно быть

Читайте также: