76

Re: php + sql чат

С кодировкой можно решить одной строкой.

В корне хоста добавить файл .htaccess и прописать в нем строку:

PHP_VALUE default_charset utf-8
DimkaDimka сказал:

header('Content-Type: text/html; charset=UTF-8');

Эту строку лучше убрать.

В файлах запускаемых через Ajax будет так:

if (!isset($_SESSION['name'])) {
  exit();
}

77

Re: php + sql чат

через аякс, как я понимаю, вызываются getlast.php, update.php и chatajax.php, так?

78

Re: php + sql чат

DimkaDimka сказал:

через аякс, как я понимаю, вызываются getlast.php, update.php и chatajax.php, так?

Верно.

79

Re: php + sql чат

вставил проверку в getlast - чуть дольше стали загружаться последние 20 сообщений из бд
вставляю в update - сообщения вообще не грузятся
вставляю в chatajax - вводимые мной сообщения не показываюся

80

Re: php + sql чат

Смотрите логи Apache.

81

Re: php + sql чат

хорошо, буду искать логи
кстати, когда захожу в чат с мобильника - все прекрасно работает, кроме одного: он загружает не последние 20 сообщений, а все сообщения из бд...

82 (изменено: DimkaDimka, 2011-03-09 23:38:26)

Re: php + sql чат

почему происходит задержка (а точнее отключение анимации) загрузки сообщений из бд - так и не понял. в логах ничего толкового не нашел...
если вставить проверку в update.php и getlast.php - сообщения не грузятся из бд, а новые показываются. в файле access.txt пишет следующее:

127.0.0.1 - - [09/Mar/2011:23:30:48 +0300] "POST /index.php HTTP/1.1" 200 3109
127.0.0.1 - - [09/Mar/2011:23:30:49 +0300] "GET /jquery.timers.js HTTP/1.1" 304 -
127.0.0.1 - - [09/Mar/2011:23:30:49 +0300] "GET /getlast.php HTTP/1.1" 200 -
127.0.0.1 - - [09/Mar/2011:23:30:49 +0300] "GET /favicon.ico HTTP/1.1" 304 -
127.0.0.1 - - [09/Mar/2011:23:30:50 +0300] "POST /update.php HTTP/1.1" 200 -
127.0.0.1 - - [09/Mar/2011:23:30:51 +0300] "POST /update.php HTTP/1.1" 200 -
127.0.0.1 - - [09/Mar/2011:23:30:52 +0300] "POST /update.php HTTP/1.1" 200 -

как я понял, это просто время и продолжительность запуска страниц..

83

Re: php + sql чат

DimkaDimka сказал:

загружает не последние 20 сообщений, а все сообщения из бд...

В телефоне должны быть разрешены куки.

Ошибки обычно в файле error.log.

Если появляются ошибки JavaScript, то лучше всего их смотреть с помощью Firebug, расширения браузера Firefox.

84

Re: php + sql чат

Hanut сказал:

Ошибки обычно в файле error.log.

этот файл даже через поиск не нашел
в папке logs есть два файла: access.txt и error.txt
то, что находятся в access - писал выше
в error же находятся ошибки самого денвера, типо favicon.ico не найден и тд

85

Re: php + sql чат

Выложите файлы скрипта.

86

Re: php + sql чат

http://www.sendspace.com/file/jzpqvx

87

Re: php + sql чат

Выложил архив с исправлениями.
http://goo.gl/69WSG

88

Re: php + sql чат

большое спасибо за исправления! все работает прекрасно!)
выходит, что не нужно было создавать в бд поля hour и minute, а можно вытянуть их из поля time?)
вот теперь думаю сделать окошко "кто онлайн". смысл вроде понятен - вывести все зарегистрированные переменные $_SESSION['name']. допустим я сделаю так, чтобы каждый $_SESSION['name'] заносился в таблицу "online" моей бд. а далее этот список выводится на экран. только вот как попроще отслеживать выходы из чата? видимо нужно отслеживать разрушение $_SESSION['name'], потом удалять его из таблицы online и обновлять список на экране. так?

89

Re: php + sql чат

DimkaDimka сказал:

выходит, что не нужно было создавать в бд поля hour и minute

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

DimkaDimka сказал:

допустим я сделаю так, чтобы каждый $_SESSION['name'] заносился в таблицу "online" моей бд. а далее этот список выводится на экран. только вот как попроще отслеживать выходы из чата? видимо нужно отслеживать разрушение $_SESSION['name'], потом удалять его из таблицы online и обновлять список на экране. так?

Все верно.

90

Re: php + sql чат

допустим я сделаю добавление ника в бд сразу при создании $_SESSION['name']. а как отследить разрушение этого имени?

и как сделать удаление ника из бд? делать сравнение row с ником и удалять строку?

91

Re: php + sql чат

DimkaDimka сказал:

делать сравнение row с ником и удалять строку?

Сперва создайте структуру таблицы в которой будете записывать имена пользователей. По идее, достаточно двух полей: id целочисленного идентификатора с автоувеличением, и name строкового типа для имени.

Запрос на удаление по имени будет выглядеть так:

DELETE FROM `table_name` WHERE `name` = 'имя';

92

Re: php + sql чат

создал таблицу online

CREATE TABLE IF NOT EXISTS `online` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

после строки include('db.php'); в index.php пытаюсь выполнить запрос

$sql = "INSERT INTO online (`user`) VALUES 
    ('" . addslashes($_SESSION['name']) . "')";

в таблицу ничего не летит, пробовал много вариантов..

93

Re: php + sql чат

$sql = "INSERT INTO online (`user`) VALUES 
    ('" . addslashes($_SESSION['name']) . "')";
mysql_query($sql); // Эта строка выполняет запрос.

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

94

Re: php + sql чат

в файле exit.php пытаюсь сделать удаление пользователя из таблицы online:

<?php
    session_start();
    $sql = 'DELETE FROM online WHERE 'user' = "' . $_SESSION['name'] . '" ';
    mysql_query($sql);
    unset($_SESSION['name']);
    header('Location: login.php');
    exit();
?>

что-то я совсем путаюсь, когда нужно ставить такие кавычки - ' ', когда такие - " ", когда такие - ` `, а когда такие - ' " . значение . " '

95

Re: php + sql чат

Правильно будет так:

$sql = 'DELETE FROM `online` WHERE `user` = "' . addslashes($_SESSION['name']) . '"';

В SQL запросах косыми кавычками (`) обрамляются имена баз данных, таблиц и полей. Одинарными (') и двойными (") кавычками обрамляются строки.

В PHP одинарными кавычками (') обрамляется строка без переменных внутри; двойными (") кавычками обрамляется строка, которая может содержать внутри переменные.
$str = 'fdsa fdsa';
$str_2 = "fdsa $str fdsa";

Если в строку надо встроить массив, то обычно используется конкатенация (объединение строки через точку).
$str_3 = 'fdsa' . $str . 'fdsa' . $str_2;

96 (изменено: DimkaDimka, 2011-03-12 23:18:28)

Re: php + sql чат

сделал добавление в таблицу online и удаление из нее при нажатии на кнопку exit
а как отследить, что пользователь вышел из чата не нажимая на кнопку exit?

и еще: при обновлении страницы index.php в таблицу online добавляется еще одна запись с этим ником. видимо нужно проводить проверку, что в таблице online еще нет этого ника?

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

97

Re: php + sql чат

DimkaDimka сказал:

а как отследить, что пользователь вышел из чата не нажимая на кнопку exit?

Никак, он будет в чате, пока сессия не закончится, то есть, пока пользователь не закроет браузер.

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

DimkaDimka сказал:

и еще: при обновлении страницы index.php в таблицу online добавляется еще одна запись с этим ником. видимо нужно проводить проверку, что в таблице online еще нет этого ника?

Верно.

DimkaDimka сказал:

получается, что при создании сессии нужно тоже проверять, что этого ника нет в таблице?

Верно.

DimkaDimka сказал:

как вывести на экран, что ник уже занят?

Перенаправлять на скрипт login.php?no=hanut и в самом скрипте проверять переменную $_GET['no'] в которой можно писать занятое имя. Благодаря передаче имени можно вывести текст вида: "Пользователь hanut уже зарегистрирован в чате. Смените имя подключения.".

98

Re: php + sql чат

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

99

Re: php + sql чат

В запросе необходимо подсчитать с помощью COUNT(*) сколько пользователей имеют одинаковое имя, и если значение будет больше нуля, то переводим на страничку авторизации с параметром no=имя_пользователя.

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?no=' . urlencode($_POST['name']));
    exit();
  } else {
    $_SESSION['name'] = $_POST['name'];
  }
}

100

Re: php + sql чат

Hanut сказал:

if ($row = mysql_fetch_assoc($result)) $count = $row['count'];

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