Re: php + sql чат
понял все кроме этой строки
if ($row = mysql_fetch_assoc($result)) // Если запрос вернул строку с данными
$count = $row['count']; // Записываем в переменную $count подсчитанных пользователей с искомым именем.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форум PHP-MyAdmin.RU → Курилка → php + sql чат
понял все кроме этой строки
if ($row = mysql_fetch_assoc($result)) // Если запрос вернул строку с данными
$count = $row['count']; // Записываем в переменную $count подсчитанных пользователей с искомым именем.
извините, долго не заходил - учеба
такой вопрос: если я сделаю этот запрос (который смотрит, сколько введенных user в таблице. и если больше нуля, то выкидывает на повторную авторизацию), то что же будет происходить при перезагрузке index.php ? получается, что будет производиться проверка на наличие этого ника в таблице - и далее выкинет на login.php
не понимаю...
будет производиться проверка на наличие этого ника в таблице - и далее выкинет на login.php
При наличии записи имени пользователя в сессии проверку делать не надо.
<?php
session_start();
if (!isset($_SESSION['name']) && !isset($_POST['name'])) {
header('Location: login.php');
exit();
}
if (isset($_POST['name'])) {
$_SESSION['name'] = $_POST['name'];
}
хмм.. и в какую же часть кода вставлять проверку?
и еще
if (!isset($_SESSION['name']) && !isset($_POST['name'])) {
сдесь идет проверка, что $_POST['name'] не пустой. но в чат можно зайти, даже если не указывать ник. это ведь не правильно..
Проверку пустой строки в переменной $_POST['name'] можно делать функцией empty(), либо strlen().
<?php
session_start();
if (!isset($_SESSION['name']) && !empty($_POST['name'])) {
$sql = 'SELECT COUNT(*) FROM... WHERE `name` = "' . addslashes($_POST['name']) . '"';
// Если пользователь найден, то выходим.
header('Location: login.php?no=' . urlencode($_POST['name']));
exit();
// Если пользователя с таким именем нет, то заносим его в сессию.
$_SESSION['name'] = $_POST['name'];
}
if (!isset($_SESSION['name'])) {
header('Location: login.php');
exit();
}
?>
Если не начнете экспериментировать с кодом, то не научитесь, поэтому пробуйте.
Привет, всем. Пожалуйста выложите куда нибудь последнюю версию чата.
У очень понравился принцип. Хочу доработать его.
Спасибо.
Пожалуйста выложите куда нибудь последнюю версию чата.
Что у меня есть, лежит здесь: http://goo.gl/8EXTo
а не подскажите ли, где почитать про работу с хедерами? header('Location: ...');
интересует передача параметров. header('Location: login.php?name=no');
что искать?
а не подскажите ли, где почитать про работу с хедерами? header('Location: ...');
Описание функции находится здесь: http://php.net/manual/en/function.header.php
Параметры передаются через URL, то есть методом GET. В данном случае, name=no был использован, чтобы в скрипте авторизации по данному параметру можно было вывести соответствующее сообщение о некорректном имени.
это все ясно..
сделал сейчас такой хедер в index.php:
if (!isset($_SESSION['name']) && empty($_POST['name'])) {
header('Location: login.php?noname=1');
exit();
}
далее отлавливаю noname в login.php:
<?php
if ($_GET['noname']="1") {
echo 'Нет ника';
}
?>
что я делаю не так?
разобрался! сделал так:
<?php
if ($_GET['noname']=='1') {
echo 'Введите пожалуйста ник';
}
?>
решил протестировать чат
зашел с одного компьютера под ником 123
пытаюсь зайти с другого компьютера под тем же ником - вроде бы работает (перекидывает на страницу авторизации с просьбой сменить ник), но почему то крайне долго...
chat196.u-gu.ru
вроде бы работает (перекидывает на страницу авторизации с просьбой сменить ник), но почему то крайне долго
Не заметил, чтобы было медленно.
В Firefox можно установить расширение Firebug, в котором видна скорость загрузки элементов страницы. Возможно это не скрипт долго грузится, а реклама.
реклама почему то при перекидывании с index.php на login.php (просьба сменить ник) загружается без стилей (синие гипперссылки без картинок). ну да ладно
помогите мне пожалуйста с двумя проблемами:
<?php
session_start();
if (!isset($_SESSION['name']) && empty($_POST['name'])) {
header('Location: login.php?noname=true');
exit();
}
include('db.php');
if (isset($_POST['name'])) {
$count = 0;
$sql = 'SELECT COUNT(*) AS `count` FROM `online` WHERE `user` = "' . addslashes($_POST['name']) . '"';
if ($result = mysql_query($sql)) {
if ($row = mysql_fetch_assoc($result)) $count = $row['count'];
}
if ($count > 0) {
header('Location: login.php?chname=true');
exit();
} else {
$_SESSION['name'] = $_POST['name'];
}
}
$sql = "INSERT INTO `online` (`user`) VALUES
('" . addslashes($_SESSION['name']) . "')";
mysql_query($sql);
?>
первая проблема в том, что при заходе в чат по прямой ссылке (chat196.u-gu.ru) сразу же срабатывает noname (требует указать ник).
вторая проблема - при перезагрузке index.php выкидывает, мол ник уже занят
первая проблема в том, что при заходе в чат по прямой ссылке (chat196.u-gu.ru) сразу же срабатывает noname (требует указать ник).
Раз требует - значит в сессии его нет.
вторая проблема - при перезагрузке index.php выкидывает, мол ник уже занят
Смотрите в БД, занят он или нет.
первая - сессии естественно нет, так как первый раз захожу. возможно надо както изменить проверку
вторая - в бд естесственно он есть. какую-то проверку нужно добавить (возможно искать этот ник в бд и сравнивать с ником в сессии, и если равны - ничего не делать)
первая - сессии естественно нет, так как первый раз захожу. возможно надо както изменить проверку
Вроде так и должно работать. В сессии ничего нет, значит на странице выводится требование ввести имя (name).
вторая - в бд естесственно он есть. какую-то проверку нужно добавить (возможно искать этот ник в бд и сравнивать с ником в сессии, и если равны - ничего не делать)
Если в сессии есть имя (name), то никакой проверки в БД быть не должно. По коду такой проверки я не вижу.
INSERT INTO `online` поместите внутрь условия if (isset($_POST['name'])) {, после строки
$_SESSION['name'] = $_POST['name'];
тут у меня несколько вопросов возникло:
1. isset - это ведь проверка на существование?
2. переменная ведь может существовать и быть пустой (isset и empty одновременно)?
3. зачем по сто раз проверять переменную на существование? 1 раз проверили - существует. значит дальше нет смысла проверять. или я не прав?
4. допустим, я хочу создать такие таблицы:
таблица "кто онлайн"
таблица "лог"
таблица "сообщения"
таблица "логин-пароль"
возможно сделаю систему комнат в чате, тогда нужно ли будет для каждой комнаты создавать свою таблицу? или просто ввести еще id комнаты?
сильно ли нагружают таблицы и базы данных проект?
2. переменная ведь может существовать и быть пустой (isset и empty одновременно)?
isset() - это наличие переменной.
empty() - это наличие переменной и проверка на содержание пустого значения.
isset от empty отличается тем, что empty вернет true если переменная существует и не имеет значения, либо ее значение равно нулю или пустой строке. isset не проверяет содержимого переменной, только ее наличие.
Проверять переменную можно и один раз, но все зависит от кода. Если вас смутила какая-то двойная проверка, то покажите где именно, я не помню такого в коде.
Для комнат чата надо иметь таблицу самих комнат с идентификатором и названием комнаты и связать ее с таблицей пользователя добавив поле идентификатора комнаты в таблицу пользователя.
Оценить нагрузку я не могу, это зависит от сервера. Снять нагрузку можно через управление таймером запросов к серверу. К примеру, если пользователь в текстовое поле установил курсор, то загружать чаще, если курсор убрал, то запрашивать сервер реже.
не могли бы вы мне помочь с окном "кто онлайн"
создал online.php
<?php
session_start();
if (!isset($_SESSION['name'])) {
exit();
}
include('db.php');
$sql = 'SELECT `user` FROM `online`;';
if ($result = mysql_query($sql)) {
while ($row = mysql_fetch_assoc($result)) {
print '<li class="box" style="display:none">'
. ' <b><FONT color="#3A3A80">' . htmlspecialchars($row['user']) . '</FONT></b>
</li>' . "\n";
}
}
?>
дописал в index.php
$('body').everyTime('10s','timer1',function(){
$.ajax({
url:'online.php',
dataType:'html',
success: function(data){
if(data!=0){
$('ol#online').append(data);
}
}
});
});
div:
<div id="online" style="width:300px; height:500px; max-height:500px; margin:30px; border:1px solid; overflow: auto; padding:5px; float: left">
<ol id="online" >
</ol>
<div id="flash"></div>
</div>
но чтот не выводит он ничего в окне((
В стиле отображение выключено.
<li class="box" style="display:none">
хм.. в getlast.php (получение 20 сообщений) тот же самый стиль..
все, заработало! только он выводит содержание таблицы онлайн через каждую секунду - такой таймер. а как сделать, чтоб он перед этим стирал содержимое div?
хм.. в getlast.php (получение 20 сообщений) тот же самый стиль..
Обратите внимание в index.php на FadeIn в JavaScript.
как сделать, чтоб он перед этим стирал содержимое div?
Перед
$('ol#online').append(data);
Добавьте
$('ol#online').empty();
отлично! все прекрасно работает!
теперь такой момент:
как же все таки отследить, что человек вышел из чата, не нажав exit? видимо нужно отследить время его последнего сообщения. и если оно больше 15 минут - удалять из таблицы online.
но что же будет происходить на экране у пользователя? ничего! он все так же сможет писать под своим ником в чате, хотя его ника в таблице нет - неувязочка..
к тому ж где отслеживать время от последнего сообщения? если закрыть браузер - то кто отслеживать то будет?)
Форум PHP-MyAdmin.RU → Курилка → php + sql чат
Форум работает на PunBB, при поддержке Informer Technologies, Inc
Currently installed 7 official extensions. Copyright © 2003–2009 PunBB.