За последние 24 часа нас посетили 20540 программистов и 1131 робот. Сейчас ищут 668 программистов ...

Авторизация: Логин(телефон/почта) и пароль

Тема в разделе "PHP и базы данных", создана пользователем Daryaa049, 20 окт 2020.

  1. Daryaa049

    Daryaa049 Новичок

    С нами с:
    5 окт 2020
    Сообщения:
    28
    Симпатии:
    0
    Добрый день, мне необходимо создать авторизацию с логином (телефон/почта) и паролем. С паролем проблем нет, а вот с логином...Я не знаю как мне написать данный код, у меня есть вариант, но не уверенна, что сработает, да и написала немного не так) Может javascript подключить надо. Мне хотя бы ссылка нужна на какой нибудь сайт) Вот код:
    PHP:
    1. # Выборка из базы по ключу, который вводит пользователь через форму
    2.    $sql = $dbh->prepare("SELECT * FROM user where email = ? and phone = ?");
    3.     if ($sql->execute($_GET['?'])) {
    4.     while ($result = $sql->fetch()) {
    5.     print_r($result);
    6.  
    7.  
    8.     }
    9.   }
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    Код (Text):
    1. SELECT * FROM user where (email = ? OR phone = ?) AND password = ?
    соответственно в параметры передавать email, phone и хеш пароля
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    @Daryaa049 после запроса нужен rowCount, а не цикл
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    И как это свойство поможет получить данные пользователя?

    Там, наверное, все же or, а не and. И это, конечно, тоже чудо какое-то:
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    o_O Это не свойство, а метод. Получить можно до и после. Но в ООП, мое мнение - лучше делать по порядку.

    PHP:
    1. $sql = 'SELECT * FROM `user` WHERE (`email` = :name OR `phone` = :name) AND `password` = :pass';
    2.  
    3. $resource = $db -> select( $sql, [ ':name' => $input['name'], ':pass' => $input['password'] ] );
    4.  
    5. if ( ! $resource -> rowCount() )
    6. {
    7.     /*
    8.         ... -> empty
    9.      
    10.         return null;
    11.     */
    12. }
    13.  
    14. ... -> get( $resource );
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Ну, пускай метод, один фиг. Я по привычке сказал, т.к. в mysqli_result соотв. значение хранится в свойстве. Смысл был в том, что более чем норм. использовать один метод вместо двух ;)
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    Доверяй, но проверяй
     
  8. Daryaa049

    Daryaa049 Новичок

    С нами с:
    5 окт 2020
    Сообщения:
    28
    Симпатии:
    0
    А как мне лучше вывести переменные?Я имею ввиду, нужно из базы в код вывести email,phone и password. Я не пойму, как мне под этот код написать их.
    --- Добавлено ---
    Я уже начала писать, но запуталась немного
    PHP:
    1. <?php
    2.  
    3. require 'db.php';
    4.  
    5. if(isset($_SESSION['uid'])){
    6.     header('location: /');
    7. }
    8.     echo '<pre>';
    9.     var_dump($resource);
    10.     echo '</pre>';
    11.  
    12.     # проверяем какой метод используется на веб странице, если не POST завершаем обработку
    13. if ($_SERVER['REQUEST_METHOD'] == 'POST')
    14. {
    15.     # подготавливаем данные из формы фильтруем их
    16.    $rulles = [
    17.         'email'    => FILTER_VALIDATE_EMAIL,
    18.         'phone'    => FILTER_DEFAULT,
    19.         'password' => FILTER_DEFAULT
    20.     ];
    21.     # фильтруем данные при необходимости
    22.    $filter = filter_input_array(INPUT_POST, $rulles);
    23.  
    24.  
    25.     # создадим пустой массив, для хранения ошибок
    26.    $errors = [];
    27.  
    28.     # авторизация
    29.        $sql = 'SELECT * FROM `user` WHERE (`email` = :name OR `phone` = :name) AND `password` = :pass';
    30.         $resource = $pdo -> select( $sql, [ ':name' => $input['name'], ':pass' => $input['password'] ] );
    31.      
    32.         if ( ! $resource -> rowCount() )
    33.         {
    34.             $errors[] = 'Строки не верны!';
    35. //             /*
    36. //                 ... -> empty
    37.          
    38. //                 return null;
    39. //             */
    40.         }
    41.      
    42.         $result  -> get( $resource );
    43.      
    44.      
    45.  
    46.         # записываем в сессию все данные полученные из базы
    47.        $_SESSION['uid'] = $result;
    48.      
    49.         header('location: /');
    50.         exit();
    51.  
    52. //  //******************************************************************** */
    53. //     // # проверяем пустоту email и пароль
    54. //     // if (empty($filter['email']) && empty($filter['password'])) {
    55. //     //     $errors[] = 'Введите телефон или почту и пароль!';
    56. //     // }
    57.  
    58. //     // # проверка существования email  в базе
    59. //     // $sql = $pdo -> prepare('SELECT `password` FROM `users` WHERE `email` = ?');
    60. //     // $sql -> execute([$filter['email']]);
    61. //     // $result = $sql -> fetch();
    62.  
    63. //     // # проверяем пустоту телефон и пароль
    64. //     // if (empty($filter['phone']) && empty($filter['phone'])) {
    65. //     //     $errors[] = 'Введите телефон или почту и пароль!';
    66. //     // }
    67.  
    68. //     // # проверка существования телефон  в базе
    69. //     // $sql = $pdo -> prepare('SELECT `password` FROM `users` WHERE `phone` = ?');
    70. //     // $sql -> execute([$filter['phone']]);
    71. //     // $result = $sql -> fetch();
    72. // //*********************************************************************** */
    73. //     # проверяем хеш от пароля, если не равно хешу из базы ошибка
    74. //     if (!password_verify($filter['password'], $result['password'])) {
    75. //         $errors[] = 'email или пароль не правильный';
    76. //     }
    77.  
    78. //     # если количество ошибок больше нуля показываем их
    79. //     if(count($errors) > 0){
    80. //         echo '<div id="errors" style="color:red;">' .array_shift($errors). '</div><hr>';
    81. //     }else{
    82.      
    83. //      
    84.  
    85.  
    86. ?>
    87.  
    88.  
    89. <!DOCTYPE HTML>
    90. <HEAD>
    91. <meta charset="utf-8">
    92. <link rel="stylesheet" href="style.css">
    93. </HEAD>
    94. <BODY>
    95. <br><br><br>
    96. <form action="login.php" method="POST" >
    97. <strong>Телефон или адрес эл.почты</strong>
    98. <p>
    99. <input type="text" class ="name" value="<?= $input['name'];?>"><br/>
    100. <p>
    101. <strong>Пароль</strong>
    102. <p>
    103. <input type="password" name="password" value="<?=$input['password']; ?>"><br/>
    104. <p>
    105. <button type="submit" name="do_login">Войти</button>
    106. </form>
    107. </BODY>
    108. </HTML>
    --- Добавлено ---
    Еще и ошибка Fatal error: Uncaught Error: Call to undefined method PDO::select() in C:\OSPanel\domains\regustratandvhod\login.php:32 Stack trace: #0 {main} thrown in C:\OSPanel\domains\regustratandvhod\login.php on line 32
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Начни с линухи и ангийского, без этих знаний будут постоянные проблемы, на решения которых ты будешь тратить целые дни.

    PHP тащит за собой сервер, сервер тащит за собой линукс, линукс тащит за собой английский, php ничего не знает про mysql.

    PHP это язык программирования, программирование это инженерия, инжеру надо знать очень много.
     
    #9 Dimon2x, 22 окт 2020
    Последнее редактирование: 22 окт 2020
  10. Daryaa049

    Daryaa049 Новичок

    С нами с:
    5 окт 2020
    Сообщения:
    28
    Симпатии:
    0
    Хорошо)
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    @Daryaa049, найс копипаст - по роману "пихаю квадратик в круглую ячейку"
     
  12. Daryaa049

    Daryaa049 Новичок

    С нами с:
    5 окт 2020
    Сообщения:
    28
    Симпатии:
    0
    А, точняк)