Палата9

Вы здесь: Главная > Все блоги > "Паяльник" > Исходники чата (с комментариями, чтоб не забыть)


Исходники чата (с комментариями, чтоб не забыть)

AuthenticAMD

25 блогов

5667 комментариев

Не в сети

Создан: 06.05.2015 2:50

Для себя, чтоб потом не ломать голову че да как... Хотя потом, чувствую, за такой быдлокод будет стыдно...

Начнем.

Code:



<?php

/************************************************************************************************
* Подключаемся к базе данных, где "localhost" - сервер, где находится БД, в данном случае - *
* локальная машина, т.к. и скрипт, и БД у нас на одном сервере; "user" - имя пользователя; *
* "password" - пароль *
************************************************************************************************/

mysql_connect("localhost", "user", "password");

//Выбираем конкретную базу данных; может быть несколько.

mysql_select_db("data_base");

/************************************************************************************************
* Чтобы пользователи могли писать под своими никами с сайта выбираем куку, хранящую информацию *
* о сессии пользователя, конкретно - id сессии *
************************************************************************************************/

$cook = $_COOKIE['cookiename']; //имя куки, конечно же, не такое, реальное светить не буду...

/************************************************************************************************
* Получив нужное значение куки, обращаемся к БД, чтобы узнать, кто конкретно из пользователей *
* имеет такой id. Для этого используем синтаксис mysql, обратившись к ней с помощью mysql_query.*
* Что хотим спросить, думаю и так понятно (ну, тем, кто знает немного английский... ) Здесь *
* #_session - имя таблицы, в которой Joomla хранит информацию о сессиях пользователей. *
* Решетка '#' - это уникальный для каждой БД жумлы префикс. *
************************************************************************************************/

$userid = mysql_query("SELECT username FROM #_session WHERE session_id = '$cook'");

/************************************************************************************************
* Да, синтаксис очень важен! Каждая кавычка влияет на запрос, если что не так, сервер выкинет *
* ошибку и не обработает запрос *
************************************************************************************************/

/************************************************************************************************
* Далее проходимся по БД циклом, получив массив из строк таблицы. mysql_fetch_array() получает *
* массив из одной строки таблицы. В данном случае нам нужна одна, та, session_id которой *
* совпадает со взятым из куки пользователя; так же можно получить хоть все строки. *
************************************************************************************************/

while($session = mysql_fetch_array($userid, MYSQL_NUM)) {

/************************************************************************************************
* MYSQL_NUM означает, что ключами массива будут числа, MYSQL_ASSOC дает строковые ключи, т.е. *
* названия рядов таблицы. *
************************************************************************************************/

/************************************************************************************************
* Получаем переменную с именем пользователя и закрываем цикл *
************************************************************************************************/

$username = $session[0];
}

/************************************************************************************************
* Если пользователь не зарегистрирован в системе, т.е. либо у него нет соответствующей куки, *
* либо, скорее всего, истекло время сессии или он вообще кто-то левый, проверяем это и выводим *
* сообщение об ошибке (сообщение будет почти в конце кода). Если пользователь определен, то *
* продолжаем выполнение программы. *
************************************************************************************************/
if(!empty($username)) { //!empty() означает "не пустой".

/************************************************************************************************
* Далее проверяем нажата ли кнопка "отправить сообщение", в нашем случае кнопка "Готово!" *
* Если этого не сделать, то скрип будет запускаться при каждом обращении к нему (при обновлении *
* страницы, например *
************************************************************************************************/

if(isset($_POST['submit'])) {

/************************************************************************************************
* Супер (ага, прямо так) глобальная переменная $_POST[] берет информацию из формы отправки html.*
* Сама форма будет ниже. В квадратных скобках - имя формы из которой берется информация *
************************************************************************************************/

/************************************************************************************************
* Далее таким же способом получаем содержимое самого сообщения, взятой из textarea *
************************************************************************************************/

$messg = $_POST['messg'];

/************************************************************************************************
* Обрезаем лишние пробелы и переносы строк, чат же... А так же преобразуем спецсимволы кода *
* html вроде треугольных скобок '<>', а так же кавычки в специальный код (посмотреть можно в *
* исходном html коде страницы). *
************************************************************************************************/

$messg = htmlspecialchars(trim($messg));

/************************************************************************************************
* Простое форматирование текста пользователем. Например, выделение слова звездочками "*слово*" *
* сделает его жирным, а двойным слешем (//*//) - курсив и т.д. Для этого используем функцию *
* preg_replace() *
************************************************************************************************/

$messg = preg_replace("!\*(.*?)\*!si", "<b></b>", $messg);
$messg = preg_replace("!\-\-(.*?)\-\-!si", "<s></s>", $messg);
$messg = preg_replace("!\_(.*?)\_!si", "<u></u>", $messg);
$messg = preg_replace("!\/\/(.*?)\/\/!si", "<i></i>", $messg);

/************************************************************************************************
* А для замены символьных конструкций целиком, например для смайлов, используем str_replace. *
* Он проще. *
************************************************************************************************/

$messg = str_replace(")))", "<img src=http://palata9.ru/media/kunena/emoticons/015.gif>", $messg);
$messg = str_replace("))", "<img src=http://palata9.ru/media/kunena/emoticons/sarcastic.gif>", $messg);
$messg = str_replace("о_О", "<img src=http://palata9.ru/media/kunena/emoticons/ai.gif>", $messg);

/************************************************************************************************
* Дальше получаем время в формате UNIX, т.е. сколько секунд прошло с 1 января 1970 г. Это число *
* будет id сообщения (ну, оно, во-первых, уникально всегда, во вторых, всегда же возрастает). К *
* тому же, была задумка сделать, чтобы сообщения удалялись по времени, но сделано по-другому... *
************************************************************************************************/

$date = time();


/************************************************************************************************
* Следующим получаем дату и время в привычном нам формате (почему date и time перепутаны я и *
* сам не помню уже... *
************************************************************************************************/

$time = date('d.m.Y_H:i:s');

/************************************************************************************************
* Проверяем, не пустое ли сообщение. Ну, думаю, понятно зачем... *
************************************************************************************************/

if(!empty($messg)) {

/************************************************************************************************
* Отправляем полученные данные в базу данных в предварительно созданную таблицу со строками: *
* mesid - id сообщения (время UNIX); *
* username - имя пользователя; *
* message - само сообщение; *
* date - дата и время. *
* Если произошла ошибка, выводим ошибку mysql (удобно для отладки). *
* На этом оба условия (нажата ли кнопка "отправить" и есть ли сообщение) закончены *
************************************************************************************************/

mysql_query("INSERT INTO chat_messages(mesid,username,message,date) VALUES('$date','$username','$messg','$time')") or die(mysql_error());
}
}

/************************************************************************************************
* Теперь надо вывести, что имеем, на экран. Для отображения в браузере нужен правильный код *
* html. Его выводим на экран эхом. *
************************************************************************************************/

echo "<!DOCTYPE html>
<html>
<head>
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">
<title>Чат палаты</title>
<link rel='stylesheet' type='text/css' href='chat_style.css'>
</head>
<body>

<div class='main'>";

/************************************************************************************************
* Последняя строка начинает контейнер <div> с непосредственно сообщениями *
* *
* Снова обращаемся к базе данных, но на этот раз, чтобы прочитать из нее, то, что сами же и *
* записали. При этом порядок отображения делаем обратным, чтобы новые сообщения были вверху с *
* помощью команды "ORDER BY DESC" *
************************************************************************************************/

$query = mysql_query('SELECT mesid, username, message, date FROM chat_messages ORDER BY mesid DESC');

/************************************************************************************************
* Так же, как и до того получаем массив каждой строки и, пройдя по таблице циклом, выводим *
* сообщения. Т.к. условий выборки нет, но выводим все, что есть *
************************************************************************************************/

while ($arr = mysql_fetch_array($query, MYSQL_ASSOC)) {
echo "<p style='color: #435743; margin-bottom: 5px;'>" . $arr["username"] . " написал</p><p style='font-size: 60%; margin-bottom: 20px; margin-top: 5px;'>" . $arr["date"] . "</p>
<p style='font-size: 80%;'>" . $arr["message"] . "</p><hr>";
}

/************************************************************************************************
* Подсчитываем количество строк (т.е. сообщений) в таблице, чтобы потом удалить лишние... *
************************************************************************************************/

$num_rows = mysql_num_rows($query);

/************************************************************************************************
* Если сообщений больше определенного количества (в данном случае 20-и), выбираем сообщение с *
* минимальным значением id (самое старое) командой "SELECT MIN()" и удаляем его ("DELETE FROM") *
************************************************************************************************/

if($num_rows > 20) {
$minid = mysql_query("SELECT MIN(mesid) FROM chat_messages");
while($fordel = mysql_fetch_array($minid, MYSQL_NUM)) {
$delete = $fordel[0];
mysql_query("DELETE FROM chat_messages WHERE mesid = '$delete'") or die(mysql_error());
}
} //На этом весь цикл закончен, все сообщения выведены.


/************************************************************************************************
* Тут грязный хак для обновления чата, чтобы не возиться с JS, который я, если честно, знаю *
* плохо... Кто догадался зачем - молодец, нет, ну и хуй с ним! *
************************************************************************************************/

$serv = $_SERVER['SCRIPT_NAME'];
$serv = basename($serv);
if($serv === "chat.php") {$ref = "chat_ex.php";}


/************************************************************************************************
* И вот только теперь выводим кнопки "Написать" и "Обновить", а так же форму для отправки *
* сообщения, хотя в чате они сверху! *
************************************************************************************************/

echo "</div><script>
function showHide(block_id) {
var obj = document.getElementById(block_id);
if (obj.style.display != 'block') {
obj.style.display = 'block';
}
else obj.style.display = 'none';
}
</script>
<div id='1' class='footer'>
<div class='title'><h3>Чат.Палата 9</h3></div>
<div class='button' style='width: 55px; display: inline-block; margin-right: 10px;'>
<a href=\"javascript:void(0)\" onclick=\"showHide('block_id')\">Написать</a></div>
<div class='button' style='width: 55px; display: inline-block;'>
<a href=\"$ref\">Обновить</a></div>

<div id='block_id' class='mess' style='display: none;'>
<form action='chat.php' method='POST'>
<textarea rows='4' name='messg'></textarea>
<input type='submit' class='button' style='color: black; margin-top: 8px;' name='submit' value='Готово!'>
</form>
</div>
</div>";

//Код JavaScript честно спижен мной откуда-то, но там ничего сложного....

/************************************************************************************************
* И опять, только сейчас мы подошли к условию: а есть ли пользователь вообще? Если есть, то *
* выполняется все, что описано выше, а если нет, то выводим рамку с информацией об ошибке и *
* возможных способах ее устранения. Так же - это заглушка, предотвращающая чтение чата не *
* зарегистрированными пользователями. *
************************************************************************************************/

} else {
echo "<!DOCTYPE html><html><body><div style='margin: auto; width: 80%; max-width: 600px; border: 1px solid grey; border-radius: 10px; margin-top: 80px; padding: 20px;'><p style='font-family: arial, sans sherif;'>Хм... Произошла какая-то ошибка. Попробуйте перезагрузить страницу. Если вы попали в чат по прямой ссылке, выполните вход на главной странице.</p></div>";
}

/************************************************************************************************
* Под конец "подбираем хвосты" - закрываем html-теги. *
************************************************************************************************/

echo "<p></p>
</body>
</html>";



Показаны последние комментарии

Исходники чата (с комментариями, чтоб не забыть)

06.05.2015 2:50

#1

Для себя, чтоб потом не ломать голову че да как... Хотя потом, чувствую, за такой быдлокод будет стыдно...

Начнем.

Code:



<?php

/************************************************************************************************
* Подключаемся к базе данных, где "localhost" - сервер, где находится БД, в данном случае - *
* локальная машина, т.к. и скрипт, и БД у нас на одном сервере; "user" - имя пользователя; *
* "password" - пароль *
************************************************************************************************/

mysql_connect("localhost", "user", "password");

//Выбираем конкретную базу данных; может быть несколько.

mysql_select_db("data_base");

/************************************************************************************************
* Чтобы пользователи могли писать под своими никами с сайта выбираем куку, хранящую информацию *
* о сессии пользователя, конкретно - id сессии *
************************************************************************************************/

$cook = $_COOKIE['cookiename']; //имя куки, конечно же, не такое, реальное светить не буду...

/************************************************************************************************
* Получив нужное значение куки, обращаемся к БД, чтобы узнать, кто конкретно из пользователей *
* имеет такой id. Для этого используем синтаксис mysql, обратившись к ней с помощью mysql_query.*
* Что хотим спросить, думаю и так понятно (ну, тем, кто знает немного английский... ) Здесь *
* #_session - имя таблицы, в которой Joomla хранит информацию о сессиях пользователей. *
* Решетка '#' - это уникальный для каждой БД жумлы префикс. *
************************************************************************************************/

$userid = mysql_query("SELECT username FROM #_session WHERE session_id = '$cook'");

/************************************************************************************************
* Да, синтаксис очень важен! Каждая кавычка влияет на запрос, если что не так, сервер выкинет *
* ошибку и не обработает запрос *
************************************************************************************************/

/************************************************************************************************
* Далее проходимся по БД циклом, получив массив из строк таблицы. mysql_fetch_array() получает *
* массив из одной строки таблицы. В данном случае нам нужна одна, та, session_id которой *
* совпадает со взятым из куки пользователя; так же можно получить хоть все строки. *
************************************************************************************************/

while($session = mysql_fetch_array($userid, MYSQL_NUM)) {

/************************************************************************************************
* MYSQL_NUM означает, что ключами массива будут числа, MYSQL_ASSOC дает строковые ключи, т.е. *
* названия рядов таблицы. *
************************************************************************************************/

/************************************************************************************************
* Получаем переменную с именем пользователя и закрываем цикл *
************************************************************************************************/

$username = $session[0];
}

/************************************************************************************************
* Если пользователь не зарегистрирован в системе, т.е. либо у него нет соответствующей куки, *
* либо, скорее всего, истекло время сессии или он вообще кто-то левый, проверяем это и выводим *
* сообщение об ошибке (сообщение будет почти в конце кода). Если пользователь определен, то *
* продолжаем выполнение программы. *
************************************************************************************************/
if(!empty($username)) { //!empty() означает "не пустой".

/************************************************************************************************
* Далее проверяем нажата ли кнопка "отправить сообщение", в нашем случае кнопка "Готово!" *
* Если этого не сделать, то скрип будет запускаться при каждом обращении к нему (при обновлении *
* страницы, например *
************************************************************************************************/

if(isset($_POST['submit'])) {

/************************************************************************************************
* Супер (ага, прямо так) глобальная переменная $_POST[] берет информацию из формы отправки html.*
* Сама форма будет ниже. В квадратных скобках - имя формы из которой берется информация *
************************************************************************************************/

/************************************************************************************************
* Далее таким же способом получаем содержимое самого сообщения, взятой из textarea *
************************************************************************************************/

$messg = $_POST['messg'];

/************************************************************************************************
* Обрезаем лишние пробелы и переносы строк, чат же... А так же преобразуем спецсимволы кода *
* html вроде треугольных скобок '<>', а так же кавычки в специальный код (посмотреть можно в *
* исходном html коде страницы). *
************************************************************************************************/

$messg = htmlspecialchars(trim($messg));

/************************************************************************************************
* Простое форматирование текста пользователем. Например, выделение слова звездочками "*слово*" *
* сделает его жирным, а двойным слешем (//*//) - курсив и т.д. Для этого используем функцию *
* preg_replace() *
************************************************************************************************/

$messg = preg_replace("!\*(.*?)\*!si", "<b></b>", $messg);
$messg = preg_replace("!\-\-(.*?)\-\-!si", "<s></s>", $messg);
$messg = preg_replace("!\_(.*?)\_!si", "<u></u>", $messg);
$messg = preg_replace("!\/\/(.*?)\/\/!si", "<i></i>", $messg);

/************************************************************************************************
* А для замены символьных конструкций целиком, например для смайлов, используем str_replace. *
* Он проще. *
************************************************************************************************/

$messg = str_replace(")))", "<img src=http://palata9.ru/media/kunena/emoticons/015.gif>", $messg);
$messg = str_replace("))", "<img src=http://palata9.ru/media/kunena/emoticons/sarcastic.gif>", $messg);
$messg = str_replace("о_О", "<img src=http://palata9.ru/media/kunena/emoticons/ai.gif>", $messg);

/************************************************************************************************
* Дальше получаем время в формате UNIX, т.е. сколько секунд прошло с 1 января 1970 г. Это число *
* будет id сообщения (ну, оно, во-первых, уникально всегда, во вторых, всегда же возрастает). К *
* тому же, была задумка сделать, чтобы сообщения удалялись по времени, но сделано по-другому... *
************************************************************************************************/

$date = time();


/************************************************************************************************
* Следующим получаем дату и время в привычном нам формате (почему date и time перепутаны я и *
* сам не помню уже... *
************************************************************************************************/

$time = date('d.m.Y_H:i:s');

/************************************************************************************************
* Проверяем, не пустое ли сообщение. Ну, думаю, понятно зачем... *
************************************************************************************************/

if(!empty($messg)) {

/************************************************************************************************
* Отправляем полученные данные в базу данных в предварительно созданную таблицу со строками: *
* mesid - id сообщения (время UNIX); *
* username - имя пользователя; *
* message - само сообщение; *
* date - дата и время. *
* Если произошла ошибка, выводим ошибку mysql (удобно для отладки). *
* На этом оба условия (нажата ли кнопка "отправить" и есть ли сообщение) закончены *
************************************************************************************************/

mysql_query("INSERT INTO chat_messages(mesid,username,message,date) VALUES('$date','$username','$messg','$time')") or die(mysql_error());
}
}

/************************************************************************************************
* Теперь надо вывести, что имеем, на экран. Для отображения в браузере нужен правильный код *
* html. Его выводим на экран эхом. *
************************************************************************************************/

echo "<!DOCTYPE html>
<html>
<head>
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">
<title>Чат палаты</title>
<link rel='stylesheet' type='text/css' href='chat_style.css'>
</head>
<body>

<div class='main'>";

/************************************************************************************************
* Последняя строка начинает контейнер <div> с непосредственно сообщениями *
* *
* Снова обращаемся к базе данных, но на этот раз, чтобы прочитать из нее, то, что сами же и *
* записали. При этом порядок отображения делаем обратным, чтобы новые сообщения были вверху с *
* помощью команды "ORDER BY DESC" *
************************************************************************************************/

$query = mysql_query('SELECT mesid, username, message, date FROM chat_messages ORDER BY mesid DESC');

/************************************************************************************************
* Так же, как и до того получаем массив каждой строки и, пройдя по таблице циклом, выводим *
* сообщения. Т.к. условий выборки нет, но выводим все, что есть *
************************************************************************************************/

while ($arr = mysql_fetch_array($query, MYSQL_ASSOC)) {
echo "<p style='color: #435743; margin-bottom: 5px;'>" . $arr["username"] . " написал</p><p style='font-size: 60%; margin-bottom: 20px; margin-top: 5px;'>" . $arr["date"] . "</p>
<p style='font-size: 80%;'>" . $arr["message"] . "</p><hr>";
}

/************************************************************************************************
* Подсчитываем количество строк (т.е. сообщений) в таблице, чтобы потом удалить лишние... *
************************************************************************************************/

$num_rows = mysql_num_rows($query);

/************************************************************************************************
* Если сообщений больше определенного количества (в данном случае 20-и), выбираем сообщение с *
* минимальным значением id (самое старое) командой "SELECT MIN()" и удаляем его ("DELETE FROM") *
************************************************************************************************/

if($num_rows > 20) {
$minid = mysql_query("SELECT MIN(mesid) FROM chat_messages");
while($fordel = mysql_fetch_array($minid, MYSQL_NUM)) {
$delete = $fordel[0];
mysql_query("DELETE FROM chat_messages WHERE mesid = '$delete'") or die(mysql_error());
}
} //На этом весь цикл закончен, все сообщения выведены.


/************************************************************************************************
* Тут грязный хак для обновления чата, чтобы не возиться с JS, который я, если честно, знаю *
* плохо... Кто догадался зачем - молодец, нет, ну и хуй с ним! *
************************************************************************************************/

$serv = $_SERVER['SCRIPT_NAME'];
$serv = basename($serv);
if($serv === "chat.php") {$ref = "chat_ex.php";}


/************************************************************************************************
* И вот только теперь выводим кнопки "Написать" и "Обновить", а так же форму для отправки *
* сообщения, хотя в чате они сверху! *
************************************************************************************************/

echo "</div><script>
function showHide(block_id) {
var obj = document.getElementById(block_id);
if (obj.style.display != 'block') {
obj.style.display = 'block';
}
else obj.style.display = 'none';
}
</script>
<div id='1' class='footer'>
<div class='title'><h3>Чат.Палата 9</h3></div>
<div class='button' style='width: 55px; display: inline-block; margin-right: 10px;'>
<a href=\"javascript:void(0)\" onclick=\"showHide('block_id')\">Написать</a></div>
<div class='button' style='width: 55px; display: inline-block;'>
<a href=\"$ref\">Обновить</a></div>

<div id='block_id' class='mess' style='display: none;'>
<form action='chat.php' method='POST'>
<textarea rows='4' name='messg'></textarea>
<input type='submit' class='button' style='color: black; margin-top: 8px;' name='submit' value='Готово!'>
</form>
</div>
</div>";

//Код JavaScript честно спижен мной откуда-то, но там ничего сложного....

/************************************************************************************************
* И опять, только сейчас мы подошли к условию: а есть ли пользователь вообще? Если есть, то *
* выполняется все, что описано выше, а если нет, то выводим рамку с информацией об ошибке и *
* возможных способах ее устранения. Так же - это заглушка, предотвращающая чтение чата не *
* зарегистрированными пользователями. *
************************************************************************************************/

} else {
echo "<!DOCTYPE html><html><body><div style='margin: auto; width: 80%; max-width: 600px; border: 1px solid grey; border-radius: 10px; margin-top: 80px; padding: 20px;'><p style='font-family: arial, sans sherif;'>Хм... Произошла какая-то ошибка. Попробуйте перезагрузить страницу. Если вы попали в чат по прямой ссылке, выполните вход на главной странице.</p></div>";
}

/************************************************************************************************
* Под конец "подбираем хвосты" - закрываем html-теги. *
************************************************************************************************/

echo "<p></p>
</body>
</html>";


Так!


Исходники чата (с комментариями, чтоб не забыть)

06.05.2015 3:01

#2

а нафиг в этот раздел засунул?



Исходники чата (с комментариями, чтоб не забыть)

06.05.2015 3:08

#3

А куда?


Так!


Исходники чата (с комментариями, чтоб не забыть)

06.05.2015 3:10

#4

Исходный код прошивки Микаса, например, ты в какой раздел поместишь?


Так!


Исходники чата (с комментариями, чтоб не забыть)

06.05.2015 5:00

#5

Пользователь AuthenticAMD написал:

А куда?



нууу, в админский наверно



Исходники чата (с комментариями, чтоб не забыть)

06.05.2015 12:12

#6

А зачем? Тут ничего такого секретного нет.


Так!