За последние 24 часа нас посетили 18266 программистов и 1578 роботов. Сейчас ищут 987 программистов ...

Вход, регистрация, выход пользователя. PHP, MySQL

Тема в разделе "Решения, алгоритмы", создана пользователем username, 6 июл 2017.

  1. username

    username Новичок

    С нами с:
    6 июл 2017
    Сообщения:
    223
    Симпатии:
    17
    user.sql
    Код (Text):
    1. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    2. SET AUTOCOMMIT = 0;
    3. START TRANSACTION;
    4. SET time_zone = "+00:00";
    5.  
    6. CREATE TABLE `user` (
    7.   `id` int(12) NOT NULL COMMENT 'уник.номер',
    8.   `user` varchar(26) NOT NULL COMMENT 'логин',
    9.   `pass` varchar(100) NOT NULL COMMENT 'пароль',
    10.   `ip` varchar(20) NOT NULL COMMENT 'сет.адрес',
    11.   `vhod` varchar(14) NOT NULL COMMENT 'посл.вход'
    12. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='пользователи';
    13.  
    14. ALTER TABLE `user`
    15.   ADD PRIMARY KEY (`id`);
    16.  
    17. ALTER TABLE `user`
    18.   MODIFY `id` int(12) NOT NULL AUTO_INCREMENT COMMENT 'уник.номер', AUTO_INCREMENT=1;COMMIT;
    db.php
    PHP:
    1. <?php
    2. // mysql класс для работы с бд
    3.  
    4. define("MHOST", "localhost"); // localhost
    5. define("MUSER", "root"); // имя пользователя базы данных
    6. define("MPASS", "bsznOe0U9o"); // пароль пользователя базы данных
    7. define("MDBNM", "solve"); // имя базы данных mysql
    8.  
    9. class DBi {
    10.     public static $conn;
    11.     public static $lastquery;
    12.     public static function get($args) {
    13.         return self::$conn->$args;
    14.     }
    15.     public static function __callStatic($func, $args) {
    16.         if(is_null(self::$conn)){
    17.             self::$conn = new mysqli(MHOST, MUSER, MPASS, MDBNM); // сервер логин пароль база данных
    18.             if (self::$conn->connect_error) {
    19.                 die('Connect Error (' . self::$conn->connect_errno . ') '. self::$conn->connect_error);
    20.             }
    21.             DBi::set_charset("utf8");      
    22.         }
    23.         return call_user_func_array(array(self::$conn, $func), $args);
    24.     }
    25. }
    26. // простой запрос в БД
    27. function mq($sql) {
    28.     $res = DBi::query($sql);
    29.     if (!is_bool($res)) $res->free();
    30. }
    31. // вставить ряд в БД
    32. function mi($sql) {
    33.     $res = DBi::query($sql);
    34.     $id = 0;
    35.     if ($res===true) $id = DBi::get("insert_id");
    36.     if (!is_bool($res)) $res->free();
    37.     return $id;
    38. }
    39. // получаем линию в БД
    40. function mr($sql) {
    41.     $res = DBi::query($sql);
    42.     $row = false;
    43.     if (!is_bool($res) AND $res->num_rows>0)
    44.     $row = $res->fetch_assoc();
    45.     if (!is_bool($res)) $res->free();
    46.     return $row;  
    47. }
    48. // получаем поле из БД
    49. function mf($sql,$field) {
    50.     $res = DBi::query($sql);
    51.     $row = false;
    52.     if (!is_bool($res) AND $res->num_rows>0)
    53.     $row = $res->fetch_assoc();
    54.     if (!is_bool($res)) $res->free();
    55.     if (isset($row[$field])) return $row[$field];
    56.     return false;  
    57. }
    58. // получаем массив в БД
    59. function ma($sql) {
    60.     $res = DBi::query($sql);
    61.     $rows = array();
    62.     if (!is_bool($res) AND $res->num_rows>0) {
    63.         while ($row = $res->fetch_assoc()) $rows[] = $row;
    64.     }
    65.     if (!is_bool($res)) $res->free();
    66.     return $rows;  
    67. }
    68. // склеивание и препарирование в SET SQL
    69. function sqlset($arr) {
    70.     $out = array();
    71.     foreach ($arr as $k=>$v) {
    72.         if (is_null($v)) $b = 'NULL';
    73.         elseif ($v === "NOW()") $b = 'NOW()';
    74.         else $b = "'".DBi::real_escape_string($v)."'";
    75.         $k2 = explode('.',$k); $k1 = array_pop($k2); $k2[] = '`'.$k1.'`';
    76.         $out[] = implode('.',$k2).' = '.$b;
    77.     }
    78.     return implode(', ',$out);
    79. }
    80. // склеивание и препарирование в Mysql Where
    81. function sqlwhere($arr) {
    82.     $out = array();
    83.     foreach ($arr as $k=>$v) {
    84.         if (is_null($v)) $b = 'NULL';
    85.         elseif ($v === "NOW()") $b = 'NOW()';
    86.         else $b = "'".DBi::real_escape_string($v)."'";
    87.         $k2 = explode('.',$k); $k1 = array_pop($k2); $k2[] = '`'.$k1.'`';
    88.         $out[] = implode('.',$k2).' = '.$b;
    89.     }
    90.     return implode(' AND ',$out);
    91. }
    func.php
    PHP:
    1. <?php
    2. // получить значение сессии
    3. function ss($a) {
    4.     if (!isset($_SESSION)) session_start();
    5.     if (isset($_SESSION[$a])) return $_SESSION[$a];
    6.     return null;
    7. }
    8. // перейти на другую страницу и завершить работу
    9. function move($url) {
    10.     ?>
    11.     <script>
    12.     document.location.href = '<?php echo $url; ?>';
    13.     </script>
    14.     <?php
    15.     exit;
    16. }
    17. // записать куку с помощью javascript
    18. function set2user($name,$value=null) {
    19.     if ($value==null) {
    20.         $value = "";
    21.         $exp = gmdate('D, d M Y H:i:s \G\M\T', time()-3600);
    22.     } else {
    23.         $exp = gmdate('D, d M Y H:i:s \G\M\T', time()+32000000);
    24.     }
    25.     echo '<script>document.cookie = "'.$name.'='.urlencode($value).'; expires='.$exp.'; path=/; domain='.$_SERVER['HTTP_HOST'].'";</script>';
    26. }
    27. // сохранение сообщения об ошибке в сессию
    28. function redmessage($s) {
    29.     $_SESSION['error'] = '<div style="color:red; font-weight:bold">'.$s.'</div>';
    30. }
    31. // вход или регистрация
    32. function login($a,$b) {
    33.     if (!preg_match("/^[a-z0-9A-Z]*$/ismU", $a))
    34.     redmessage('Логин указан не верно');
    35.     elseif (!preg_match("/^[a-z0-9A-Z]*$/ismU", $b))
    36.     redmessage('Пароль указан не верно');
    37.     else {
    38.         $_SESSION = array();
    39.         $mas = array('user'=>$a,'pass'=>$b);
    40.         $row = mr("SELECT * FROM `user` WHERE ".sqlwhere($mas));
    41.         if ($row) {
    42.             $uset = array('vhod'=>time(),'ip'=>$_SERVER['REMOTE_ADDR']);
    43.             mq("UPDATE `user` SET ".sqlset($uset)." WHERE ".sqlwhere($mas));
    44.         } else {
    45.             $uset = array('vhod'=>time(),'ip'=>$_SERVER['REMOTE_ADDR']) + $mas;
    46.             mi("INSERT INTO `user` SET ".sqlset($uset));
    47.         }
    48.         $row = mr("SELECT * FROM `user` WHERE ".sqlwhere($mas));
    49.         if ($row) {
    50.             $_SESSION = $row;
    51.             set2user("id",$_SESSION['id']);
    52.             set2user("user",$_SESSION['user']);
    53.             set2user("pass",$_SESSION['pass']);
    54.             move('index.php');
    55.         }
    56.         else {
    57.             redmessage('Вход или регистрация не удалась');
    58.         }
    59.     }
    60. }
    61. // восстановление сессии пользователя на основе cookie
    62. if (ss('id')===null AND isset($_COOKIE['user']) AND isset($_COOKIE['pass'])) {
    63.     login($_COOKIE['user'], $_COOKIE['pass']);
    64. }
    65. // вывод сообщения об ошибке
    66. function rms() {
    67.     if (empty($_SESSION['error'])) return;
    68.     echo $_SESSION['error'];
    69.     $_SESSION['error'] = '';
    70. }
    71. // генерация пароля
    72. function genpas() {
    73.     $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    74.     $pass = "";
    75.     for ($i = 0; $i < 8; $i++) {
    76.         $n = rand(0, strlen($alphabet)-1);
    77.         $pass .= $alphabet[$n];
    78.     }
    79.     return $pass;
    80. }
    81. // увеличение строки a-z0-9
    82. function next26($s) {
    83.     if (!is_string($s)) return 'a';
    84.     $s1 = substr($s,0,-1);
    85.     $s2 = substr($s,-1,1);
    86.     if ($s2=='9') $s1 = next26($s1);
    87.     $sw = 'abcdefghijklmnopqrstuvwxyz0123456789a';
    88.     $p2 = strpos($sw,$s2);
    89.     $s2 = substr($sw,$p2+1,1);
    90.     return $s1.$s2;
    91. }
    92. // новый логин
    93. function newlog() {
    94.     $login = mf('SELECT `user` FROM `user` ORDER BY `id` DESC LIMIT 1','user');
    95.     return next26($login);
    96. }
    menu.php
    PHP:
    1. <a href="index.php">Главная страница</a> <a href="enter.php"><?php
    2. if (ss('id')===null) echo 'Вход / Регистрация'; else echo 'Выход ('.ss('user').')'; ?></a>
    3. <br>
    index.php
    PHP:
    1. <?php
    2. require 'db.php';
    3. require 'func.php';
    4. require 'menu.php';
    5. ?>
    6. <p>Добро пожаловать на первую страницу</p>
    enter.php
    PHP:
    1. <?php
    2. require 'db.php';
    3. require 'func.php';
    4. require 'menu.php';
    5. // выход пользователя
    6. if (ss('id')!==null) {
    7.     $_SESSION = array();
    8.     set2user("id");
    9.     set2user("user");
    10.     set2user("pass");
    11.     move('index.php');
    12. }
    13. // вход или регистрация пользователя
    14. if (isset($_POST['user']) AND isset($_POST['pass'])) {
    15.     login($_POST['user'], $_POST['pass']);
    16. }
    17. ?>
    18. <p><b class="fan">Вход</b></p>
    19.  
    20. <form action="enter.php" method="post">
    21. <p>Логин</p>
    22. <input type="text" size="10" name="user">
    23. <p>Пароль</p>
    24. <input type="password" size="10" name="pass">
    25. <br>
    26. <input type="submit" value="Войти">
    27. </form>
    28. <p><b class="fan">Регистрация</b></p>
    29.  
    30. <form action="enter.php" method="post">
    31. <p>Логин</p>
    32. <input type="text" size="10" name="user" value="<?php echo newlog(); ?>">
    33. <p>Пароль</p>
    34. <input type="text" size="10" name="pass" value="<?php echo genpas(); ?>">
    35. <br>
    36. <input type="submit" value="Регистрация">
    37. </form>
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    не совсем понятен вопрос)
     
    denis01 нравится это.
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    хотел написать подобное, но когда обратил внимание на раздел - всё стало ясно.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Это в смысле, чтобы я не ввёл, система меня пустит? Полезно :)

    Пароль в открытом виде - трындец.

    Смысл всех эти фокусов над mysqli не понимаю, ну ладно, тут много любителей так делать.