Разделить сообщение об ошибке электронной почты или имени пользователя уже существует - PullRequest
2 голосов
/ 09 мая 2020

Я не могу понять, как получить 2 отдельных сообщения об ошибке для уже существующего адреса электронной почты и имени пользователя. Я хочу, чтобы он выдавал точную ошибку, поэтому, если электронное письмо уже существует, будет только сказано: «Электронное письмо уже существует, выберите другой!» вместо «имя пользователя или адрес электронной почты уже существует, выберите другое!»

if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ? OR email = ?')) {
    $stmt->bind_param('ss', $_POST['username'], $_POST['email']);
    $stmt->execute();
    $stmt->store_result();
    if ($stmt->num_rows > 0) {
        // Username already exists
        echo 'Username or email already exists, please choose another!';
    } else {
        // Insert the new account
        ..

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Прежде всего, если вы хотите проверить, существует ли строка в базе данных, вам не нужно получать данные, вы можете просто получить COUNT(*). Однако в вашей ситуации это фактически шаг вперед к тому, чего вы хотите достичь.

$stmt = $con->prepare('SELECT username, email FROM accounts WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
    if ($row['username'] === $_POST['username']) {
        // Username already exists
        echo 'Username already exists, please choose another!';
    } elseif ($row['email'] === $_POST['email']) {
        // Email already exists
        echo 'Email already exists, please choose another!';
    }
}

Кстати, не включайте вызовы методов prepare() в операторы if. Вместо этого вам следует включить правильные отчеты об ошибках. Как получить сообщение об ошибке в MySQLi?

Если вы хотите преобразовать этот код в PDO, это другая история. Вы не можете смешивать эти два API.

0 голосов
/ 09 мая 2020

Все важное о БД @Dharman уже сказал, и этот код основан на коде Дхармана, но с другим подходом для выполнения того же самого с фактическими сообщениями об ошибках.

Мой подход требует, чтобы поле ввода name совпадает с именем db-fields, например, <input name="email> требует email field в db, <input name="username"> требует username field in db et c.

Если вы хотите показать все сообщения:

$stmt = $con->prepare('SELECT username, email FROM accounts 
WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
    $errors = array_intersect($_POST,$row);
    foreach($errors as $key=>$item) {
        echo "$key already exists, please choose another<br>";
    }
}

Если вы просто хотите показать одно из сообщений (первое), вы можете просто сделать разрыв в l oop ...

$stmt = $con->prepare('SELECT username, email FROM accounts 
WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
    $errors = array_intersect($_POST,$row);
    foreach($errors as $key=>$item) {
        echo "$key already exists, please choose another<br>";
        break;
    }
}

... или просто получение первого ключа в массиве $ errors:

$stmt = $con->prepare('SELECT username, email FROM accounts 
WHERE username = ? OR email = ?');
$stmt->bind_param('ss', $_POST['username'], $_POST['email']);
$stmt->execute();
$result = $stmt->get_result();
if ($row = $result->fetch_assoc()) {
    $errors = array_intersect($_POST,$row);
    if (!empty($errors)) {
        echo array_keys($errors)[0] . " already exists, please choose another";
    }        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...