101

Re: php + sql чат

DimkaDimka сказал:

понял все кроме этой строки

if ($row = mysql_fetch_assoc($result)) // Если запрос вернул строку с данными
$count = $row['count']; // Записываем в переменную $count подсчитанных пользователей с искомым именем.

102

Re: php + sql чат

извините, долго не заходил - учеба

такой вопрос: если я сделаю этот запрос (который смотрит, сколько введенных user в таблице. и если больше нуля, то выкидывает на повторную авторизацию), то что же будет происходить при перезагрузке index.php ? получается, что будет производиться проверка на наличие этого ника в таблице - и далее выкинет на login.php

не понимаю...

103

Re: php + sql чат

DimkaDimka сказал:

будет производиться проверка на наличие этого ника в таблице - и далее выкинет на login.php

При наличии записи имени пользователя в сессии проверку делать не надо.

104

Re: php + sql чат

<?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'] не пустой. но в чат можно зайти, даже если не указывать ник. это ведь не правильно..

105

Re: php + sql чат

Проверку пустой строки в переменной $_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();
}

?>

Если не начнете экспериментировать с кодом, то не научитесь, поэтому пробуйте.

106

Re: php + sql чат

Привет, всем. Пожалуйста выложите куда нибудь последнюю версию чата.
У очень понравился принцип. Хочу доработать его.

Спасибо.

107

Re: php + sql чат

pnn80 сказал:

Пожалуйста выложите куда нибудь последнюю версию чата.

Что у меня есть, лежит здесь: http://goo.gl/8EXTo

108 (изменено: DimkaDimka, 2011-04-02 10:22:15)

Re: php + sql чат

а не подскажите ли, где почитать про работу с хедерами? header('Location: ...'); 
интересует передача параметров. header('Location: login.php?name=no');
что искать?

109

Re: php + sql чат

DimkaDimka сказал:

а не подскажите ли, где почитать про работу с хедерами? header('Location: ...');

Описание функции находится здесь: http://php.net/manual/en/function.header.php

Параметры передаются через URL, то есть методом GET. В данном случае, name=no был использован, чтобы в скрипте авторизации по данному параметру можно было вывести соответствующее сообщение о некорректном имени.

110

Re: php + sql чат

это все ясно..
сделал сейчас такой хедер в 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 'Нет ника';
}
?>

что я делаю не так?

111

Re: php + sql чат

разобрался! сделал так:

<?php
if ($_GET['noname']=='1') {
echo 'Введите пожалуйста ник';
}
?>

112

Re: php + sql чат

решил протестировать чат
зашел с одного компьютера под ником 123
пытаюсь зайти с другого компьютера под тем же ником -  вроде бы работает (перекидывает на страницу авторизации с просьбой сменить ник), но почему то крайне долго...
chat196.u-gu.ru

113

Re: php + sql чат

DimkaDimka сказал:

вроде бы работает (перекидывает на страницу авторизации с просьбой сменить ник), но почему то крайне долго

Не заметил, чтобы было медленно.

В Firefox можно установить расширение Firebug, в котором видна скорость загрузки элементов страницы. Возможно это не скрипт долго грузится, а реклама.

114 (изменено: DimkaDimka, 2011-04-02 13:01:42)

Re: php + sql чат

реклама почему то при перекидывании с 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 выкидывает, мол ник уже занят

115

Re: php + sql чат

DimkaDimka сказал:

первая проблема в том, что при заходе в чат по прямой ссылке (chat196.u-gu.ru) сразу же срабатывает noname (требует указать ник).

Раз требует - значит в сессии его нет.

DimkaDimka сказал:

вторая проблема - при перезагрузке index.php выкидывает, мол ник уже занят

Смотрите в БД, занят он или нет.

116

Re: php + sql чат

первая - сессии естественно нет, так как первый раз захожу. возможно надо както изменить проверку
вторая - в бд естесственно он есть. какую-то проверку нужно добавить (возможно искать этот ник в бд и сравнивать с ником в сессии, и если равны - ничего не делать)

117

Re: php + sql чат

DimkaDimka сказал:

первая - сессии естественно нет, так как первый раз захожу. возможно надо както изменить проверку

Вроде так и должно работать. В сессии ничего нет, значит на странице выводится требование ввести имя (name).

DimkaDimka сказал:

вторая - в бд естесственно он есть. какую-то проверку нужно добавить (возможно искать этот ник в бд и сравнивать с ником в сессии, и если равны - ничего не делать)

Если в сессии есть имя (name), то никакой проверки в БД быть не должно. По коду такой проверки я не вижу.

INSERT INTO `online` поместите внутрь условия if (isset($_POST['name'])) {, после строки
$_SESSION['name'] = $_POST['name'];

118

Re: php + sql чат

тут у меня несколько вопросов возникло:
1. isset - это ведь проверка на существование?
2. переменная ведь может существовать и быть пустой (isset и empty одновременно)?
3. зачем по сто раз проверять переменную на существование? 1 раз проверили - существует. значит дальше нет смысла проверять. или я не прав?
4. допустим, я хочу создать такие таблицы:

таблица "кто онлайн"
таблица "лог"
таблица "сообщения"
таблица "логин-пароль"

возможно сделаю систему комнат в чате, тогда нужно ли будет для каждой комнаты создавать свою таблицу? или просто ввести еще id комнаты?

сильно ли нагружают таблицы и базы данных проект?

119

Re: php + sql чат

DimkaDimka сказал:

2. переменная ведь может существовать и быть пустой (isset и empty одновременно)?

isset() - это наличие переменной.
empty() - это наличие переменной и проверка на содержание пустого значения.
isset от empty отличается тем, что empty вернет true если переменная существует и не имеет значения, либо ее значение равно нулю или пустой строке. isset не проверяет содержимого переменной, только ее наличие.

Проверять переменную можно и один раз, но все зависит от кода. Если вас смутила какая-то двойная проверка, то покажите где именно, я не помню такого в коде.

Для комнат чата надо иметь таблицу самих комнат с идентификатором и названием комнаты и связать ее с таблицей пользователя добавив поле идентификатора комнаты в таблицу пользователя.

Оценить нагрузку я не могу, это зависит от сервера. Снять нагрузку можно через управление таймером запросов к серверу. К примеру, если пользователь в текстовое поле установил курсор, то загружать чаще, если курсор убрал, то запрашивать сервер реже.

120

Re: php + sql чат

не могли бы вы мне помочь с окном "кто онлайн"

создал 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">'
            .   '&nbsp;&nbsp;<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>

но чтот не выводит он ничего в окне((

121

Re: php + sql чат

В стиле отображение выключено.
<li class="box" style="display:none">

122

Re: php + sql чат

хм.. в getlast.php (получение 20 сообщений) тот же самый стиль..

123

Re: php + sql чат

все, заработало! только он выводит содержание таблицы онлайн через каждую секунду - такой таймер. а как сделать, чтоб он перед этим стирал содержимое div?

124

Re: php + sql чат

DimkaDimka сказал:

хм.. в getlast.php (получение 20 сообщений) тот же самый стиль..

Обратите внимание в index.php на FadeIn в JavaScript.

DimkaDimka сказал:

как сделать, чтоб он перед этим стирал содержимое div?

Перед
$('ol#online').append(data);
Добавьте
$('ol#online').empty();

125

Re: php + sql чат

отлично! все прекрасно работает!
теперь такой момент:
как же все таки отследить, что человек вышел из чата, не нажав exit? видимо нужно отследить время его последнего сообщения. и если оно больше 15 минут - удалять из таблицы online.
но что же будет происходить на экране у пользователя? ничего! он все так же сможет писать под своим ником в чате, хотя его ника в таблице нет - неувязочка..
к тому ж где отслеживать время от последнего сообщения? если закрыть браузер - то кто отслеживать то будет?)