Запросите MySQL, чтобы проверить, существует ли пользователь в двух таблицах. - PullRequest
0 голосов
/ 06 ноября 2019

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

Вот моя регистрационная форма:

<form action="/members/register/" name="registerForm">
    <div>
        <h2>Register</h2>
        <h6>welcome</h6>
        <div class="register">
            <input type="text" name="firstname" placeholder="First Name" required>
            <input type="text" name="lastname" placeholder="Last Name" required>
            <input type="text" name="email" placeholder="Email" required>
            <label for="dob">Date of Birth:
                <input type="date" name="dob" id="dob" placeholder="Date of Birth" required>
            </label>
            <input type="text" name="username" placeholder="Username" required>
            <input type="password" name="password" placeholder="Password" required>
            <input type="password" name="passwordconfirm" placeholder="Confirm Password" required>
            <p>By creating an account you agree to our <a href="/legal/terms-of-use/">Terms &amp; Privacy</a>.</p>
            <button type="submit" name="registerNow">Register</button>
        </div>
    </div>
</form>

Таблицы базы данных mySQL, с которыми мне нужно проверить:

users
  -id
  -username
  -password
  -userID (foreign key)

registered
  -id
  -nameFirst
  -nameLast
  -email
  -dob

Iнеобходимо создать запрос, который проверяет, существует ли ЛЮБОЕ из следующего: 1) имя и фамилия вместе, 2) имя пользователя или 3) электронная почта.

Более того, как только я пойму, как выполнить запрос, подобный этомуЯ все еще немного озадачен тем, что означает ? в запросе. Кроме того, этот пример кода только проверяет, существует ли имя пользователя, и выводит имя пользователя, которое уже существует. Пожалуйста, выберите другой. Мне нужно выводить разные вещи в зависимости от того, какие поля уже существуют в таблице (ах). Вот код из учебника:

if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {
// Bind parameters (s = string, i = int, b = blob, etc), hash the password using the PHP password_hash function.
$stmt->bind_param('s', $_POST['username']);
$stmt->execute();
$stmt->store_result();
// Store the result so we can check if the account exists in the database.
if ($stmt->num_rows > 0) {
    // Username already exists
    echo 'Username already exists. Please choose another.';
} else {
    // Insert new account
}
$stmt->close();
} else {
// Something is wrong with the sql statement, check to make sure accounts table exists with all 3 fields.
echo 'Could not prepare statement!';
}
$con->close();

Будет ли это так?

SELECT id, password 
FROM users, registered 
WHERE users.username = ? OR (registered.nameFirst = ? AND registered.nameLast = ?) OR registered.email = ?

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

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Поскольку все, что вы хотите сделать, это проверить, существуют ли уже значения регистрации, вероятно, проще всего использовать EXISTS подзапросы вместо JOIN, объединяющих обе таблицы вместе. Примерно так:

SELECT
    EXISTS (SELECT * FROM users WHERE username = ?) AS found_username,
    EXISTS (SELECT * FROM registered WHERE nameFirst = ? AND nameLast = ?) AS found_name,
    EXISTS (SELECT * FROM registered WHERE email = ?) AS found_email

В этом запросе ? представляет заполнители для имени пользователя, имени, фамилии и значений электронной почты. Целью использования подготовленных операторов с заполнителями является защита от внедрения SQL, для получения дополнительной информации об этом см. в этом разделе вопросов и ответов . Их использование также имеет то преимущество, что избавляет от необходимости экранировать специальные символы во входных данных (например, если вы хотите вставить O'Hara в поле nameLast, используя значение, заключенное в одинарные кавычки).

Итак, дляваш код, вы бы сделали что-то вроде:

if ($stmt = $con->prepare('SELECT
        EXISTS (SELECT * FROM users WHERE username = ?) AS found_username,
        EXISTS (SELECT * FROM registered WHERE nameFirst = ? AND nameLast = ?) AS found_name,
        EXISTS (SELECT * FROM registered WHERE email = ?) AS found_email')) {
    // Bind parameters (s = string, i = int, b = blob, etc)
    $stmt->bind_param('ssss', $_POST['username'], $_POST['firstname'], $_POST['lastname'], $_POST['email']);
    $stmt->execute();
    $stmt->bind_result($found_username, $found_name, $found_email);
    $stmt->fetch();
    // Store the result so we can check if the account exists in the database.
    if ($found_username) {
        // Username already exists
        echo 'Username already exists. Please choose another.';
    }
    elseif ($found_name) {
        // Name already exists
        echo 'Name already exists. Please choose another.';
    }
    elseif ($found_email) {
        // Email already exists
        echo 'Email already exists. Please choose another.';
    }
    else {
        // Insert new account
    }
    $stmt->close();
} 
else {
    // Something is wrong with the sql statement, check to make sure accounts table exists with all 3 fields.
    echo 'Could not prepare statement!';
}
$con->close();
1 голос
/ 06 ноября 2019

Я думаю, вы захотите, чтобы ваш оператор SQL использовал JOIN, например, чтобы избежать дублирования совпадений строк:

    SELECT 
      users.id, password 
    FROM 
      users JOIN registered 
    USING(id) 
    WHERE 
      username = ? 
      OR (nameFirst = ? AND nameLast = ?) 
      OR email = ?

Затем вам нужно будет добавить дополнительные параметры в вашу привязку:

$stmt->bind_param(
   'ssss', 
   $_POST["username"], 
   $_POST["firstname"], 
   $_POST["lastname"], 
   $_POST["email]
);
$stmt->execute();
// etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...