Вход с использованием PDO не может получить данные из MySQL - PullRequest
0 голосов
/ 17 октября 2018

У меня есть проблема в моем коде, это вход в систему с любым именем пользователя и паролем без проверки его из базы данных. Более подробно объясните ниже. У меня есть 2 таблицы: одна для имен пользователей и одна для паролей, я пытаюсь сделать свой код похожим на эту таблицу пользователей:идентификатор, имя пользователя, телефон, таблица паролей электронной почты, в которой есть: идентификатор, идентификатор пользователя, пароль

каждый пароль, связанный с идентификатором пользователя в поле user_id

Я хочу, чтобы мой код работал следующим образом, если имя пользователя,адрес электронной почты или телефон в одной строке, равной паролю, имеют тот же user_id, что и в строке make login

Пример таблицы пользователей: 1, eddy, edd@example.com, 4493838 таблица паролей: 1, 1 (обратите внимание: это идентификатор пользователя из таблицы пользователей), alfa

<?php
$servername = "localhost";$username = "username";$password = "password";$dbname = "myDBPDO";
if(!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Username']))
{?>

Welcome <? echo $_SESSION['users_id'] ?>
<?php
}
elseif(!empty($_POST['various-login']) && !empty($_POST['password']))
{
// PDO   
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Database
$stmt = $conn->prepare("SELECT id as users_id, username, email, phone FROM users"); 
$stmt->execute();

$stmt = $conn->prepare("SELECT id as passwords_id, user_id, password FROM passwords"); 
$stmt->execute();

$userRow=$stmt->fetch(PDO::FETCH_ASSOC);


$various_login= $_POST['various-login'] == $userRow['email'] or $userRow['phone'];
$user_and_password = $userRow['users_id'] === $userRow['user_id'];  
$password = $_POST['password'] == $user_and_password;    

if($stmt->rowCount() == 1)
{

    $email = $userRow['email'];
    $_SESSION['Username'] = $username;
    $_SESSION['email'] = $email;
    $_SESSION['LoggedIn'] = 1;

    echo "<h1>Success</h1>";
    echo $email;
} 
else
{
    echo "<h1>Error</h1>";
    echo "<p>Sorry, your account could not be found. Please <a href=\"index.php\">click here to try again</a>.</p>";
}}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
} else {?>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Email/Phone: <input type="text" name="various-login" value="<?php echo $website;?>">
<br><br>
Password: <input type="password" name="password">
<br><br>
<input type="submit" name="submit" value="<?php echo $lang['NEXT']; ?>">  
</form> 
<?php}?>

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Я бы настоятельно рекомендовал использовать объединение, так что это 1 оператор SQL, а также очистку и проверку введенных вами данных.

SELECT users.*
FROM users 
JOIN passwords ON passwords.user_id = users.id
WHERE (users.email = :email
OR users.phone = :phone)
AND passwords.password = :password

Вот ссылка на документацию по подготовленным операторам.Я предлагаю вам перечитать это, чтобы понять, почему ваш существующий код не будет работать (подсказка: вы выбираете все записи).http://php.net/manual/en/pdo.prepared-statements.php

  1. Создание подключения к PDO
  2. Создание SQL
  3. Привязка параметров
  4. Выполнение запроса
  5. Еслиу вас есть строка, вы нашли пользователя.

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

0 голосов
/ 17 октября 2018

Используйте это: (небезопасно для SQLi)

<?php
$servername = "localhost";$username = "username";$password = "password";$dbname = "myDBPDO";
if(!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Username']))
{
    echo "Welcome ".$_SESSION['Username'];
}
elseif(!empty($_POST['various-login']) && !empty($_POST['password']))
{  
    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // Database
        $stmt = $conn->prepare("SELECT id, username, email, phone FROM users WHERE lower(username) = '".strtolower($_POST['various-login'])."' OR lower(email) = '".strtolower($_POST['various-login'])."' OR phone = '".strtolower($_POST['various-login'])."'"); 
        $stmt->execute();
        $userdata = $stmt->fetch(PDO::FETCH_ASSOC);
        if(!empty($userdata["id"]))
        {
            $stmt = $conn->prepare("SELECT id, user_id, password FROM passwords WHERE user_id = '".$userdata["id"]."' AND password = '".$_POST["password"]."'"); 
            $stmt->execute();
            $password_data = $stmt->fetch(PDO::FETCH_ASSOC);
            if(!empty($password_data["id"]))
            {
                $_SESSION['users_id'] = $userdata["id"]
                $_SESSION['Username'] = $userdata["username"];
                $_SESSION['email'] = $userdata["email"];
                $_SESSION['LoggedIn'] = 1;
                echo "<h1>Success</h1>";
                echo $email;
            }
            else
            {
                echo "<h1>Error</h1>";
                echo "<p>Sorry, your account password is not valid. Please <a href=\"index.php\">click here to try again</a>.</p>";
            }
        }else{
            echo "<h1>Error</h1>";
            echo "<p>Sorry, your account could not be found. Please <a href=\"index.php\">click here to try again</a>.</p>";
        }
    } catch(PDOException $e) {
        echo "Error: " . $e->getMessage();
    }
    $conn = null;
} else {?>

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
    Email/Phone: 
    <input type="text" name="various-login" value="<?php echo $website;?>">
    <br><br>
    Password: <input type="password" name="password">
    <br><br>
    <input type="submit" name="submit" value="<?php echo $lang['NEXT']; ?>">  
</form> 
<?php } ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...