Как сделать чтобы записи в MySQL не совпадали?

Sirius

PHP+MySQL=LOVE
Как сделать чтобы записи в MySQL не совпадали?

У меня таблица в MySQL!

Всегда при посылке данных в таблицу, при обновлении страницы результата, в MySQL посылается такая же запись и т.д. до бесконечности пока я буду обновлять!

Я всегда считал, что MySQL следит за этим сама!

Может я неправильно создал таблицу?

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

Sirius

PHP+MySQL=LOVE
Какой уникальный индекс?

Что дикий бред???

Мне просто нужно, чтобы в базе данных не лежали данные с одинаковыми содержаниями полей, кроме естественно инкремента!
 

tony2001

TeaM PHPClub
а ты не задумывался, что можно ПРОВЕРЯТЬ лежат ли такие же данные в базе ?
самому.
руками.
?
 

Sirius

PHP+MySQL=LOVE
Хммм... ну можно если проверять нынешнюю заносимую запись с последней в базе - но ведь это не 100% вероятность!

Эх... значит нету против лома приёма!
 

Crazy

Developer
Автор оригинала: Sirius
Какой уникальный индекс?
CREATE UNIQUE INDEX indexName ON tableName (col1, col2, ... colN)

Здесь col1..colN -- те поля, которые должны быть уникальными.

В результате добавления индекса сервер будет препятсвовать созданию дубликатов.

Не забывай проверять результат выполнения команд insert и update.
 

Crazy

Developer
Автор оригинала: tony2001
а ты не задумывался, что можно ПРОВЕРЯТЬ лежат ли такие же данные в базе ?
При низкой вероятности коллизий это крайне неоптимально. Вот если вероятнолсть получить повтор составляет 20 и более процентов, то есть смысл подумать о предварительной проверке.

Оптимальным же ее использование счимтается при 80 и более процентах коллизий. А это совсем не обычная практика, не правда ли? :)
 

Sirius

PHP+MySQL=LOVE
Наверное придётся проверять самому

У меня вообще-то создаётся сайт знакомств, где люди переписываются друг с другом!
Есть только 2 проблемы - безопасность (это я обсуждаю в другом разделе форума) и эта вроде бы мелочь - не позволять людям флудить!

То есть это скорее защита от флудеров - чем от ошибок самих юзеров - так я могу использовать и джаваскрипт закрывающий кнопку посылки после отсылки - но на новой странице, если сделать обновить - то форма отошлётся заново!
 

Crazy

Developer
Каков у тебя де-факто процент "флудных" обращений? Больше 10%?
 

Sirius

PHP+MySQL=LOVE
:) Да откуда я знаю:)
Всё в тесте у меня!

Наверное будет меньше 5% - потому что я буду применять джава кнопку - юзеры ошибаться не будут!
 

Crazy

Developer
В таком случае дополнительной ручной проверкой ты будешь только увеличивать нагрузку на сервер. Хоть и незначительно.

Но если есть желание -- почему бы и нет.
 

@Tru

Guest
а что если после удачного инсерта в базу делать

PHP:
 Header("Location: sent_ok.php?id=чего-то-там");
(до к-л вывода естессна)
 

@Tru

Guest
проводится обработка информации из формы, проверка, занесение в базу и редирект на другой УРЛ, т.е. пользователь НЕ СМОЖЕТ 2 раза отослать одну и ту же информацию. (если нажмет релоад, перечитается только последняя страница, а не та которая обрабатывала форму.
про Header() можно почитать тут: http://www.php.net/manual/en/function.header.php
 

Crazy

Developer
Что такое Header() я "догадываюсь". :)

Но такая обработка тебя на спасет. Принципиальная причина в том, что обработка переносится на клиента. А клиента нужно считать ненадежным источником данных.

На практике твое решение столкнется с такой проблемой: при плохой связи посетитель давит кнопку и отправляется форма. Форма приходит на сервер и обрабатывается, но из-за грязного канала ответ 4-5 секунд не может дойти к пользователю. Он считает, что не сработало и жмет Refresh. Обрати внимание -- все это ДО получения "Location: ...".

Процедура может повторяться несколько раз. :)

И, понятно, это никак не помешает злонамеренным :) роботам гадить в базу.

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

Как я уже говорил, в простых случаях достаточно проверок сервера БД.
 

Sirius

PHP+MySQL=LOVE
Я решил сделать через сессию!
Если вышла ошибка при регистрации - сессия продолжается и юзер может вернуться и исправить!
Если юзер зарегился успешно ему выдаётся такое сообщение и сессия убивается! Для повторного флуда (рефреша) он должен заново зайти на страницу регистрации и заполнить все поля!

Как эта мысля - есть тут дёготь?
 

Crazy

Developer
От роботов это не спасет. :)

Для нормальный юзеров это будет работать -- поможет предотвратить проблемы с ошибочной повторой регистрацией.
 

Sirius

PHP+MySQL=LOVE
Да - но в регистрации роботов ещё ждёт невозможность повторения ников и мейлов! Также возможное разрешение админом добавить анкету или нет, или отсылку потверждения регистрации на мейл!

Слабее место - отсылка мессажей между зарегинными юзерами! Наверное придётся отказаться от сравнения уникальных индексов - многие "мужчины" копируют одно и тоже любовное послание и посылают его нескольким девушкам! Я ж не могу это запретить:)
 

Crazy

Developer
Признаться, я не очень понял связь между уникальными индексами и идентичностью текста посланий. Ты ж не собираешься строить уникальный индекс по тексту сообщения?
 
Сверху