Всем привет! Есть тестовый сайт, 1 пользователя регистрирует без проблем. Второго и последующего пользователя отказывается регистрировать, выдает ошибку: Duplicate entry '' for key 'wmid' Все облазил не могу найти решение, помогите пожалуйста...
Расскажи как "лазил". Помоему решение на поверхности — если не искать в гугле ошибку с wmid, а попытаться понять что написано. --- Добавлено --- http://phpfaq.ru/debug
Я так понимаю что создается значение которое уже есть в базе. Но не понимаю почему в 'Кавычках' пусто. И куда смотреть. Я новичок в этом деле....
Исправил в БД до импорта следующие строки: Код (Text): ADD PRIMARY KEY `wmid` (`wmid`), на Код (Text): ADD KEY `wmid` (`wmid`), Все заработало, пошла регистрация второго пользователя. Пробую зарегистрировать третьего пользователя, теперь появляется следующая ошибка: Код (Text): Duplicate entry '' for key 'pemail` Снова меняю в базе данных, т.е. убираю уникальность кода: Код (Text): ADD UNIQUE KEY `pemail` (`pemail`), на Код (Text): ADD KEY `pemail` (`pemail`), Импортирую базу... Регистрация 1 пользователя - успешно. Регистрация 2 пользователя - успешно. Регистрация 3 пользователя - успешно. Регистрация 4 пользователя - успешно. Теперь бы понять сам принцип до и после. После исправления я убрал уникальность ключу WMID и PEMAIL . --- Добавлено --- Но как он определяет значение ключу WMID если во время регистрации он нигде не задается (Нету соответствующей графы, куда необходимо ввести свой WMID) , т.е. по сути это поле должно оставаться пустым (так оно и есть в БД после регистрации пользователя - поле WMID у него пустое). Почему тогда возникает конфликт, якобы такая запись (пустая) в этом поле уже есть уже есть?
Сложнее всего объяснять очевидные вещи. Уникальный ключ может содержать только один экземпляр любого значения. Первичный ключ тоже является уникальным. Если ты в операции insert явно не указываешь значение некоего поля или указываешь пустое значение (null), то поле принимает значение по умолчанию. Даже не важно какое именно. Потому что оно всякий раз будет пытаться использовать одно и то же значение. И тут база натыкается на условие уникальности. Внезапно™ --- Добавлено --- Вопрос: зачем тебе поля в таблице, которые ты даже не пытаешся заполнить значениями. Просто убери их если не нужны.
В том то и дело, что эти пустые поля в таблице, будут заполнять позже сами пользователи уже ПОСЛЕ регистрации, когда попадут в личный кабинет... А ВО ВРЕМЯ регистрации - поля остаются пустыми, на что и выдавался конфликт с записью в БД...
тогда и ставь по дефолту поля в Null например, чтобы можно было добавить запись с id, login без доп. параметров. Т.е. пусть там будут дефолтные параметрны. Типа name = 'имя' и все. Само собой, структура таблицы требует наличие каких-либо данных, а т.к. они пустые и не "приходят", то выдает тебе ошибку об этом.
Не якобы, а есть. Пустая строка это такое же значение как любая другая строка. Её нельзя повторять дважды, если поле уникально проиндексировано. --- Добавлено --- Ты уже знаешь как исправить ситуацию: достаточно отказаться от уникального индекса. --- Добавлено --- Другой вариант: сделать поле null-able и БЕЗ значения '' по умолчанию. Тогда поля, не указанные при вставке, будут по настоящему пустыми. Пустые значения не нарушают уникальность. Важно понимать, что пустая строка ('') и специальное значение "пусто" (null) это не одно и то же! Сравни: `x` varchar(255) DEFAULT NULL, -- может быть по настоящему пустым, пустые значения могут повторяться и `x` varchar(255) NOT NULL DEFAULT '', -- не может быть пустым, при уникальном индексе возможна только одна пустая строка в колонке