Срочно нужно сделать проект, а с php почти не знаком. Помогите, пожалуйста! БД в MySQL. Ее сделали до меня. Привожу таблицы внизу. Нужно написать скрипты: 1). Авторизация. Проверка, есть ли юзер с такими логином и паролем. Если есть, создать сессию. Как сохранить ее в БД? Так, чтобы можно было возобновить, обновив ее дату и время? Сессия должна храниться неделю после последнего сеанса работы с ней. Группу доступа запомнить в ней. Создать cookies. Отправить на главную страницу сайта. 2). Скрипт входа. Проверка, есть ли cookies. Если да: Как связать cookies с сессией и запустить ее, обновив ее дату и время? Если нет: отправить на страницу авторизации. И далее, опять же, перенаправить на главную сайта. create table if not exists t_accounts( acc_id int(11) not null auto_increment, pass varchar(32) not null, login varchar(64) not null, primary key (acc_id), unique index login_UNIQUE(login ASC) create table if not exists t_groups( group_id int(11) not null auto_increment, group_name varchar(64) not null, primary key (group_id) create table if not exists t_rules( rule_id int(11) not null auto_increment, rule_descr varchar(255) character set 'utf8' not null, primary key (rule_id) create table if not exists t_sessions( session_id int(11) not null, session_date DATETIME NOT NULL, session_data text not null create table if not exists t_rules_accounts( rule_id int(11) not null, acc_id int (11) not null, index fk_t_rules_accounts_t_rules1 (rule_id ASC), index fk_t_rules_accounts_t_accounts1 (acc_id ASC), constraint fk_t_rules_accounts_t_rules1 foreign key (rule_id) references security.t_rules(rule_id) on delete cascade on update cascade, constraint fk_t_rules_accounts_t_accounts1 foreign key (acc_id) references security.t_accounts(acc_id) on delete cascade on update cascade create table if not exists t_rules_groups( rule_id int(11) not null, group_id int (11) not null, index fk_t_rules_groups_t_groups1 (group_id ASC), index fk_t_rules_groups_t_rules1 (rule_id ASC), constraint fk_t_rules_groups_t_groups1 foreign key (group_id) references security.t_groups(group_id) on delete cascade on update cascade, constraint fk_t_rules_groups_t_rules1 foreign key (rule_id) references security.t_rules(rule_id) on delete cascade on update cascade create table if not exists t_acc_groups( acc_id int(11) not null, group_id int(11) not null, index fk_t_acc_groups_t_accounts1 (acc_id ASC), index fk_t_acc_groups_t_groups1 (group_id ASC), constraint fk_t_acc_groups_t_accounts1 foreign key (acc_id) references security.t_accounts(acc_id) on delete cascade on update cascade, constraint fk_t_acc_groups_t_groups1 foreign key (group_id) references security.t_groups(group_id) on delete cascade on update cascade
Буду рад, если мне ответят здесь хоть на какие-то из вопросов. Сам пытаюсь разбираться. Но любой дельный ответ облегчит задачу.
Это всё есть в книгах по PHP для начинающих. Разбей задачи на простые шаги. Создай страничку с двумя формами для логина и пароля, кнопку отправить. Сделай так чтобы она отправлялась на обработчик php. Потом уже можно будет поговорить о базе данных.
Это уже сделал. Написал функции входа и авторизации. Но они, кажется, неработоспособные. Подскажете, что неверно. Как несильно менять, чтобы работало? PHP: //Вход include 'authorization.php'; function EatCookie(){ $result=false; $hash=isset($_COOKIE['site_hash'])?explode('::',$_COOKIE['site_hash']):($result=false); $id=$hash[0]; $hash=$hash[1]; $conn_id=mysql_connect('localhost','root','','rup'); mysql_select_db('database'); if(!is_numeric($id)){ $result=false; }else{ $q=mysql_query("SELECT * FROM 't_accounts' WHERE acc_id='".$id."'",$conn_id); if(mysql_numrows($q)==0){ $result=false; }else{ $row=mysql_fetch_assoc($q); $newHash=md5(md5($row['login']).md5($row['pass'])); if($newHash==$hash){ $result=true; }else{ $result=false; } } } //return $result; if($result==false){header("Location: page1.php");} //перенаправляем на страницу авторизации else {//вытащить сессию, обновить и перенаправить на главную //подключимся к БД. Здесь будет инструкция. session_start(); $sess_id=session_id(); $current_time = time(); $query = "UPDATE t_sessions set session_date='.$current_time.' WHERE session_id='.$sess_id.'"; header("Location: main.php"); } } function authorization($login, $pass) { //устанавливаем начальное значение авторизации $user_login=FALSE; session_start(); //запрос к базе данных $q="SELECT * FROM t_accounts WHERE login ='$login'"; $pass=md5($pass); $auth=mysql_fetch_assoc(mysql_query($q)); //проверяем, совпадают ли пары логин-пароль введенные пользователем с теми что в таблице users if ($login==$auth['login'] and $pass==$auth['password']) { $_SESSION['username']=$auth['login']; $user_login=TRUE; //сохраняем группу доступа пользователя в сессии, чтобы в дальнейший код выполнялся в соответствии с этой группой $accid = "SELECT acc_id FROM t_accounts WHERE login = '$login' AND pass = '$pass'"; $r = "SELECT group_id FROM t_acc_groups WHERE acc_id = '$accid'"; $_SESSION['right']=$r; session_register("r"); //Сохраняем сессию в Базу данных $sess_id=session_id(); $current_time = time(); $sess_data=session_decode(); $query = "INSERT INTO t_sessions (session_id, session_date, session_data) VALUES ('$sess_id', '$current_time', '$sess_data'"; //Создаем cookies setcookie('site_hash',$hash,$stime*3600*60); //Отправляем на главную header("Location: main.php"); } else if ($login!=$auth['login']||md5($password)!=$auth['password']){ $error_auth="Неверный логин или пароль"; $user_login=FALSE; $_SESSION['auth']=FALSE; } //return $user_login; }
Ну если ты написал этот код, то ты его постепенно писал надеюсь. Вот в какой-то момент, что то перестало работать. Когда это произошло? Тут нужно отладку делать, перепроверять, чтобы всё работало, даже маленькая часть. Разбить задачу на части. Отладка http://phpfaq.ru/debug Когда перестало работать?
Зачем записывать сессию в БД? По-моему это только додаст геморроя... Если вы хотите галочку "Онлайн", почему не создать столбец "status" и при входе ставить значение "1" при выходе "0", или поставить таймер отклика пользователя, и автоматически обновлять запись? auth.php PHP: <?php if ($_SERVER["REQUEST_METHOD"] == "POST" && $_POST["auth"] == "authorization") { $success = ""; $error = basename(__FILE__); define("db_host", "localhost"); define("db_user", ""); define("db_pass", ""); define("db_name", ""); define("db_table", "t_accounts"); $crypt_pass = md5($_POST["pass"]); $found = false; $id = ""; $session_timeout = 600; $mysqli = mysqli_connect(db_host, db_user, db_pass, db_name); $mysqli->set_charset("utf8"); if (!$mysqli) { printf("Невозможно подключиться к базе данных. Код ошибки: %s\n", mysqli_connect_error()); exit; } mysqli_select_db($mysqli, db_name); $query = "SELECT pass, acc_id, active FROM ". db_table." WHERE login = '". mysqli_real_escape_string($mysqli, $_POST["login"])."'"; $result = mysqli_query($mysqli, $query); if ($data = mysqli_fetch_array($result)) { if ($crypt_pass == $data["pass"] && $data["active"] != 0) { $found = true; $id = $data["acc_id"]; } } mysqli_close($mysqli); if($found == false) { header("Location: ".$error); exit; } else { if (session_id() == "") { session_start(); } $_SESSION["login"] = $_POST["login"]; $_SESSION["acc_id"] = $id; $_SESSION["expires_by"] = time() + $session_timeout; $_SESSION["expires_timeout"] = $session_timeout; $rememberme = isset($_POST["rememberme"]) ? true : false; if ($rememberme) { setcookie("login", $_POST["login"], time() + 3600*24*7); setcookie("pass", $_POST["pass"], time() + 3600*24*7); } header("Location: ".$success); exit; } } $login = isset($_COOKIE["login"]) ? $_COOKIE["login"] : ""; $pass = isset($_COOKIE["pass"]) ? $_COOKIE["pass"] : ""; ?> <!DOCTYPE html> <html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>Вход</title> </head> <body> <h1>Авторизация</h1> <form action="<?php echo basename(__FILE__); ?>" id="authorization" method="post" name="authorization"> <input name="auth" type="hidden" value="authorization"> <input name="login" value="<?php echo $login; ?>" placeholder="Логин" required="required" /> <input name="pass" type="password" value="<?php echo $pass; ?>" placeholder="Пароль" required="required" /> <button type="submit" >Войти</button> </form> </body> </html> session.php (подключить к страницам для проверки авторизирован пользователь или нет. Т.е. " include("path/to/session.php"); ".) PHP: <?php if (session_id() == "") { session_start(); } if (!isset($_SESSION["id"])) { header("Location: auth.php"); exit; } if (isset($_SESSION["expires_by"])) { $expires_by = intval($_SESSION["expires_by"]); if (time() < $expires_by) { $_SESSION["expires_by"] = time() + intval($_SESSION["expires_timeout"]); } else { unset($_SESSION["id"]); unset($_SESSION["expires_by"]); unset($_SESSION["expires_timeout"]); header("Location: auth.php"); exit; } } ?> Доступ только ограниченному кругу лиц PHP: <?php $users = array("Сюда вставь ID пользователя", "или несколько"); if (!in_array($_SESSION["id"], $users)) { header("Location: auth.php"); exit; } ?> Кнопка "Выйти" PHP: <?php if(isset($_GET["logout"])) { if (session_id() == "") { session_start(); } unset($_SESSION["id"]); header("Location: auth.php"); } ?> <a href="?logout">Выйти</a> Вывод данных из сессии PHP: <?php function id() { if (isset($_SESSION["id"])) { echo $_SESSION["id"]; } else { echo "N/A"; } } echo id(); ?> Мне кажется так проще и надежнее, а возможно и быстрее. P.S.: Могут быть ошибки не проверял. --- Добавлено --- Добавь столбец active tinyint(1) со значением "1" пользователь активен, и "0" разумеется не активен