У меня есть класс, который вставляет пользователя из регистрационной формы в базу данных. Я вставляю 4 вещи: имя пользователя, пароль, соль и адрес электронной почты. Я использую errno 1062 для проверки дубликатов записей. Но мне нужно проверить на наличие конкретных дубликатов записей. Например, у меня есть эта логика, которая проверяет errno 1062, но она действительно не относится к проверяемому имени пользователя, она просто проверяет errno и предполагает, что это имя пользователя дублируется.
if ($stmt->affected_rows == 1) {
$this->success = "$this->username has registered. You can now log in.";
} elseif ($stmt->errno == 1062) {
$this->errors[] = "$this->username is already in use. Please chose another.";
} else {
$this->errors[] = 'Sorry, there was an issue with the database.';
}
У меня вопрос, как я могу использовать errno 1062 для проверки имени пользователя, электронной почты или обоих? Похоже, что errno 1062 просто проверяет ЛЮБЫЕ повторяющиеся записи.
errno возвращает только целое число, без какой-либо другой информации о том, какая ошибка произошла, но вы можете использовать ошибку для получения дополнительной информации.
В соответствии с руководство, если у вас есть errno 1062, ошибка должна быть строкой в этом формате:
Повторяющаяся запись «% s» для ключа «% s»
Вы можете проанализировать эту строку, чтобы получить нужные данные, используя обычные строковые функции PHP. Если у вас более одной ошибки, она будет «жаловаться» только на первую найденную ошибку (по крайней мере, на моих серверах), поэтому учтите, что в конечном итоге вы можете попросить пользователя исправить одну вещь, а затем вернуться к исправлению другой и т. Д. ,
Единственный известный мне способ улучшить это — запускать отдельные простые запросы:
SELECT COUNT(*) FROM table WHERE email = '[email protected]'
Постскриптум Вы действительно хотите заблокировать дубликаты паролей?
Других решений пока нет …