как найти, какое поле дублируется - PullRequest
0 голосов
/ 30 июля 2010

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

Я делаю один запрос на вставку. И если возникает ошибка, тогда я использую номер ошибки, чтобы определить, является ли она 1062 (повторяющаяся запись) или 1064 (ошибка строки запроса), в противном случае пользователь успешно зарегистрировался.

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

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

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

Теперь проблема с дублированием.

Я обнаружил, что это дубликат, и у меня есть строка ошибки, как это

Повторяющаяся запись test@gest.com для ключ 'электронная почта' или повторяющаяся запись 'проверка' для ключа 'имя пользователя'

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

но на некоторых серверах я получаю вот так

Повторяющаяся запись test@gest.com для ключ 2 "или дублирующая запись" тестирование " для ключа 3

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

**

Так есть ли другой способ получить который поле дублируется, если есть больше уникальные поля в таблице.

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

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Вы можете сделать strpos() для строки ошибки с фактическим значением (some@email.com или some_username)

Редактировать :
Вы также можете спросить себя, если этодействительно необходимо сделать это.Есть и другие способы:

  • Сказать пользователю, что имя пользователя и / или адрес электронной почты уже существует
  • Выполнить проверку onblur() в соответствующих полях ввода

Таким образом, вы полностью избегаете проблемы.

0 голосов
/ 16 августа 2010

Перво-наперво - Я вижу еще одну проблему в вашем запросе - вы упомянули 1064 (ошибка строки запроса).Это означает, что у вас может быть неправильный синтаксис запроса. Что означает , что вы, вероятно, недостаточно фильтруете пользовательские значения.Эта ошибка возникает (AFAIK) ТОЛЬКО при неправильной защите сервера.Что приведет к гораздо большему количеству проблем, чем использование двух SQL вместо одного.Проверьте, правильно ли вы экранировали входные параметры.Вы также должны использовать привязку параметров следующим образом:

$stmt = mysqli_prepare($link, "INSERT INTO XXX (username, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, 'ss', $user, $email);

Больше на странице mysql http://pl.php.net/manual/en/mysqli-stmt.bind-param.php

И о вашей ошибке:

Извините,но нет способа (по крайней мере, я не знаю), чтобы достичь того, что вы хотите.Не будьте так разборчивы в отношении номера запроса на вставках.Это не значит, что у вас будет тысячи регистраций пользователей в секунду, поэтому другой запрос на самом деле не повредит.

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

Действительно, просто выполните команду SELECT, например SELECT username, email FROM database WHERe username=? OR email=?, и проверьте ответ.Если нет, дубликатов нет.

0 голосов
/ 30 июля 2010

Просто используйте Select Count (*) из TableName, где Condition = 'yourtestcondition'. Если вы получили количество> 0, то оно существует, иначе нет.

...