Избегать дублирования записи INSERT SQL

Я вставляю дневную посещаемость. Я хочу избежать дублирования записей. Уникальные столбцы должны содержать месяц, день и идентификатор вместе. Мое условие: «если для этого идентификатора сотрудника существуют месяц и день (например, если уже есть явка на 22 марта для сотрудника № 40), он должен вернуть ошибку и не должен переходить к вставке. Это мой код.

    $avoid_double_entry = query("SELECT * FROM attendance WHERE 
    employee_id = '$employee_id' AND month = '$month' AND day = '$day' ");
    confirm($avoid_double_entry);

    if ($row = fetch_array($avoid_double_entry)) {
            echo "already exists";
    } else {
        echo "no records found";
     <--proceed to insert query-->

Однако, когда я запускаю этот код, и когда есть запись для ДНЯ 22, даже если месяц не март и идентификатор сотрудника не 40, он говорит, что уже существует. Также бывает, когда день не 22, а месяц март, и наоборот.

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

Я уже пробовал не запрашивать WHERE NOT, DUPLICATE KEY UPDATE, но все еще не могу понять ..

Кстати, это моя функция подтверждения, которая работает нормально, но на всякий случай.

 function confirm($result) {

global $connection;

if (!$result) {

    die("Query failed" . mysqli_error($connection)); 
}

}

используйте num_rows вместо

Funk Forty Niner 21.04.2018 00:03

вы можете отредактировать свой вопрос и поместить в него структуру таблицы?

Nick 21.04.2018 00:04

Сделайте идентификатор, месяц, день ключом к вашей таблице, здесь вообще нет необходимости в каком-либо PHP.

Kaylined 21.04.2018 00:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
110
1

Ответы 1

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

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

Затем выполните запрос INSERT. Дубликаты вставляться не будут. Если у вас есть другие столбцы, которые следует обновить при обнаружении дубликатов, вы можете использовать ON DUPLICATE KEY UPDATE. В противном случае INSERT IGNORE предотвратит появление каких-либо ошибок при попытке вставить дубликаты (при этом не вставляя их).

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

Думаю, Тим снова потерял ключи.

Don't Panic 21.04.2018 00:28

Может быть, Тим подумал, что то, что вы опубликовали, было плагиатом на уже существующие вопросы и ответы? Кстати, меня зовут не Тим ;-)

Funk Forty Niner 21.04.2018 00:44

Плагиат? В самом деле, @Funk? Вы думаете о каком-то конкретном?

Don't Panic 21.04.2018 01:44

Я не знаю, я не могу говорить за этого парня (или девушку). В некотором роде мне кажется, что это так.

Funk Forty Niner 21.04.2018 01:54

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

Don't Panic 21.04.2018 02:42

О, я никогда не говорил, что ты является плагиатом. Несомненно, совпадения случаются и случаются.

Funk Forty Niner 21.04.2018 02:44

Другие вопросы по теме