Я делаю чат, сделал дизайн, не могу сделать вход, помогите
Я делал с testreg, save_user, bd и index.
Но в конце выходили ошибки, с строками. Решил проблему, но потом при попытке входа, он говорил, что пароль неверный. Как можно сделать , что бы пользователь входил в чат, только вписав Логин. Без заморочек. Можно подключить к SQL.
P.S. Я тестирую на Denwer'e. Помогите пожалуйста :)
testreg.php- вход выполняет
bd.php - подключение к mysql
save_user.php - сохраняет людей в mysql
Неплохо бы для начала изучить основы PHP, раз уж пытаетесь работать с кодом на стороне сервера.
Ну и без содержимого файлов вам никто ничего не подскажет. Ну может телепаты, но они все в отпуске.
Неплохо бы для начала изучить основы PHP, раз уж пытаетесь работать с кодом на стороне сервера.
Ну и без содержимого файлов вам никто ничего не подскажет. Ну может телепаты, но они все в отпуске.
Вот примерно я делал, без sql сейчас.
<p>
<label>Ваш логин:<br></label>
<input name="login" type="text" size="15" maxlength="15">
</p>
<input type="submit" name="submit" value="Войти">
</form>
Я знаю что можно как то с помощью
<form action="chat.cgi" method="get">
А дальше кода вообще не понимаю что писать.. :C Помогите пожалуйста
Если нет, то могу предположить, что вам можно обойтись переменными сессии... Без SQL, в самом деле. Если все, что вам нужно -- это пользовательские никнеймы, которые пользователь сможет произвольно менять.
То что вы написали лишь вершина айсберга. Считайте что вы еще ничего не сделали, просто нарисовали обложку книги. Теперь предстоит написать тысячи страниц содержания.
- chat.cgi - программа (в вашем случае, скорее всего, скрипт) которая запускается на сервере, получает логин и пароль, сравнивает их с какими-то образцами и выдает ответ. Вот эту программу теперь и предстоит написать.
- GET - метод, которые логин и пароль будут передаваться серверу. От метода зависит и способ передачи этих параметров вашей программе на сервере. Обычно при передаче авторизационных данных используют метод POST, так как данные переданные в методом GET видны в адресной строке браузера.
Только для чата создавать cgi-скрипт нет особого смысла, достаточно обычного php. Тем более для такого простенького чата, как предполагается.
Я посмотрел в интернете, и тоже это понял, спасибо вам.
Вот то, что я смог написать, php кодом. и html
session_start();
$db=mysql_connect('localhost', 'root', '');
mysql_select_db('progtest', $db);
$res=mysql_query("SELECT * FROM client WHERE nick='".$_SESSION['name']."'
AND password='".$_SESSION['pword']."'", $db);
if(mysql_num_rows($res)!=1)
{ //такого пользователя нет
header('Location: autorize.php');
echo "Неправильный логин или пароль!";
else
{ //пользователь найден, можем выводить все что нам надо
$r = mysql_fetch_assoc($res);
$_SESSION['name'] = $r['name'];
header('Location: /http://chat/index.html');
}
mysql_close();
?>
С этим вышла проблемка..
Вот примерный мой код. Знаю, что бомжатский..
session_start();
if(isset($_SESSION['name']))
{
print "Твой ник: ".$_SESSION['name']. "<br>";
}
?>
Я не знаю как починить..
<form id="login-form" action="/chat.html" method="post">
<div style="display:none"><input type="hidden" value="71a027069372d052010edb26f54e5ea24d3e3769" name="badge" /></div>
<div><label for="LoginForm_username" class="required">Введите логин</label></div>
<input class="login_input" name="$_SESSION['name']" id="LoginForm_username" type="text" />
<label for="LoginForm_username" class="required">Введите пароль</label>
<input class="login_input" name="$_SESSION['pword']" id="LoginForm_username" type="text" />
<div class="enter">
<a href="#" id="yt0">Войти</a></div>
</form>
</div>
<form id="login-form" action="/chat.html" method="post">
<div style="display:none"><input type="hidden" value="71a027069372d052010edb26f54e5ea24d3e3769" name="badge" /></div>
<div><label for="LoginForm_username" class="required">Введите логин</label></div>
<input class="login_input" name="$_SESSION['name']" id="LoginForm_username" type="text" />
<label for="LoginForm_username" class="required">Введите пароль</label>
<input class="login_input" name="$_SESSION['pword']" id="LoginForm_username" type="text" />
<div class="enter">
<a href="#" id="yt0">Войти</a></div>
</form>
</div>
По порядку.
<form id="login-form" action="/chat.html" method="post">
<form id="login-form" action="./login.php" method="post">
Чтобы пользователь мог отправить данные формы на сервер нужна еще и кнопка "Войти". Например такая:
session_start();
// Подключение к базе данных. У вас ведь есть Mysql?
$db=mysql_connect('localhost', 'root', '');
// Что будет если подключение не будет установлено? Тут нужна обработка ошибок.
// Выбор нужной базы данных. Вы ведь создали в MySql базу данных progtest ?
mysql_select_db('progtest', $db);
// Опять же, тут не хватает обработки ошибок
// Это что за бред??
//$res=mysql_query("SELECT * FROM client WHERE nick='".$_SESSION['name']."'
//AND password='".$_SESSION['pword']."'", $db);
// Должно быть как то так:
// У вас ведь есть таблица client со списком логинов и паролей?
$res=mysql_query("SELECT * FROM client WHERE nick='".mysql_real_escape_string($_POST["login"])."'
AND password='".mysql_real_escape_string($_POST["pword"])."'", $db);
// Неправильно. А если два пользователя?
if(mysql_num_rows($res)!=1) {
//такого пользователя нет
// Перекидываем на autorize.php. Там есть сообщение об ошибке?
header('Location: autorize.php');
// А это зачем, если мы уже перекинули пользователя на другу страницу?
echo "Неправильный логин или пароль!";
}
else {
//пользователь найден, можем выводить все что нам надо
$r = mysql_fetch_assoc($res);
$_SESSION['name'] = $r['name'];
header('Location: /http://chat/index.html');
}
mysql_close();
- Получаем логин и пароль от клиента;
- Сравниваем его с базой данных, в которой пароль хранится в зашифрованном виде с использованием одностороннего шифрования;
- Если логин и пароль введен правильно, то создаем сессию которую будем идентифицировать по уникальному ключу. Сохраняем сессию или в базе данных или в файлах или еще где-то.
- Уникальный ключ сессии передаем обратно клиенту.
- При последующем обращении сравниваем ключ сессии с теми ключами что есть в нашей базе данных/файлах/ну или где мы там сессии храним.
- Если ключ сессии найден, то получаем по нему основные данные авторизованного пользователя.
А у вас нигде и нет попыток записи в БД. Или вы имели в виду, что на время сессии не запоминает пользователя?
Это на js уже писать будете ajax-запросы к серверу на обновление окна (контейнера) чата. После отправки сообщения сразу запрос на обновление содержимого контейнера чата, чтобы отправленное сообщение показалось там сразу, и периодически, вне зависимости от отправки сообщений.
Конечно все это бред и так авторизацию не делают. Стандартный алгоритм примерно такой:
- Получаем логин и пароль от клиента;
- Сравниваем его с базой данных, в которой пароль хранится в зашифрованном виде с использованием одностороннего шифрования;
- Если логин и пароль введен правильно, то создаем сессию которую будем идентифицировать по уникальному ключу. Сохраняем сессию или в базе данных или в файлах или еще где-то.
- Уникальный ключ сессии передаем обратно клиенту.
- При последующем обращении сравниваем ключ сессии с теми ключами что есть в нашей базе данных/файлах/ну или где мы там сессии храним.
- Если ключ сессии найден, то получаем по нему основные данные авторизованного пользователя.
Cпасибо. Я по этому списку, немного сделал. Я сделал регистрацию (с паролем и логином) в MySQL, потом я вот прописал код на вход..
Я делал без css, и там вход работал, но выдавал просто так показывал ошибку, про session_start, хотя всё работает, просто ошибка в виде текст. Не знаю почему. А когда я попробовал вставить этот код в первый, с CSS который. Он регистрирует в базу, а вход не делает.
Может в коде , что то не так?
//Если пришли данные на обработку
if(isset($_POST['login']) && isset($_POST['password']))
{
//Подключаемся к базе данных
include("bd.php");
//Записываем все в переменные
$login=htmlspecialchars(trim($_POST['login']));
$password=htmlspecialchars(trim($_POST['password']));
//Достаем из таблицы инфу о пользователе по логину
$res=mysql_query("SELECT * FROM `users` WHERE `login`='$login' ");
$data=mysql_fetch_array($res);
//Если такого нет, то пишем что нет
if(empty($data['login']))
{
die("Такого пользователя не существует!");
}
//Если пароли не совпадают
if($password!=$data['password'])
{
die("Введенный пароль неверен!");
}
//Запускаем пользователю сессию
session_start();
//Записываем в переменные login и id
$_SESSION['login']=$data['login'];
$_SESSION['id']=$data['id'];
//Переадресовываем на главную
header("location: chat.html");
}
?>
Вот я задумался, над списком Users. Там должны как я понял выводиться люди. Мне стоит написать тогда новый online.php , который будет инклудиться в index? Это ладно, я смогу сделать, а вот, что бы показывали онлайн. Я не сильно понял какой будет код.. Надо создавать в таблице, еще одну строку, с названием online. И потом каждый 30 секунд, проверка, пользователь еще в сети или нет, если нет, то в таблице строка онлайн , меняется на 0, а если он онлайн, то 1.. true и false типо... как я понял. А затем вывод..
Как это можно реализовать, помогите с кодом.
`id` int(5) NOT NULL auto_increment,
`login` varchar(200) NOT NULL,
'password` varchar(1000) NOT NULL,
`online` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
Потом в коде index.php , когда пользователь авторизуется, надо писать, что online будет обновляться так скажем..
// Я задал сессию, которая обновляется 30 секунд каждые.
<?php
$_SESSION['ID'] = $row['id'];
$_SESSION['ONLINE'] = strtotime('+30 sec');
?>
Дальше как я понял надо писать код, где и будет считываться, он онлайн или нет.. Я не знаю как проверить это.
Вот человек написал, что то в чат и значит онлайн? А как же тогда, те кто тупо читают?!
Помогите разобраться.
<div class="users" style="width: 193px;">
<div class="role-user">
<p class="title-user">Users</p>
<ul>
</ul>
<ul>
</ul>
</div>
</div>
Вот человек написал, что то в чат и значит онлайн? А как же тогда, те кто тупо читают?!
Можно на стороне клиента реализовать js-скрипт, который каждую минуту будет посылать безответный запрос серверу о том, что он активен.
На стороне сервера сверять наличие "маячковых" запросов, только не с БД, а с переменной сессии. Если запрос пришел, проверяется: выставлена ли переменная _SESSION['online'] в true? Если нет, то переменная устанавливается и соответствующее изменение заносится в БД вместе со временем последнего сигнала (в TIMEDATE-поле online-time). Если да, то никаких действий не производится.
Когда скрипт на стороне участника чата опрашивает сервер на предмет обновления содержимого чата и списка участников, можно с определенной периодичностью опрашивать БД по выборке всех пользователей с состоянием online, сравнивая текущее время и последнее время, когда от них приходил сигнал. Если разница во времени больше 2-3 минут, то участник переводится в неактивные.
Либо можно повесить это не на запрос обновления, а единичным скриптом, зацикленно выполняющимся спустя короткие промежутки времени, тогда нагрузка будет меньше.