PHP

PHP скрипт сообщений

При помощи php можно "отправлять сообщения" друг другу. Предположим что у на сайте есть пользователи и необходимо организовать систему личных сообщений.
Для реализации этого нам потребуются: таблица в БД для сообщений, скрипт для отправки сообщений и скрипт для чтения сообщений.
Идем по порядку-таблица. В таблице будут следующие поля: id, дата отправки, отправитель, получатель, содержимое сообщения и флаг.
Код создания таблицы будет выглядеть так, назовем её messages.

Дамп таблицы

CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `from` int(11) NOT NULL,
  `to` int(11) NOT NULL,
  `message` text NOT NULL,
  `flag` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

В поле data будет дата отправки сообщения,поле from-уникальный номер отправителя,to-номер получателя,message-само сообщение и поле flag-отметка о том-прочтено сообщение или ещё нет.

Теперь займемся клиентской частью-напишем форму отправки сообщения и php обработчик формы отправки.

Форма отправки и обработчик

В форме отправки нам потребуется ввести сам текст сообщения и выбрать адресата. В форме укажем обработчик и метод передачи.

Форма ввода сообщения
<form action="send_mess.php" method="post" enctype="multipart/form-data">
	Адресат: <br />
	<select name="to">
		<option value="1">Костик
		<option value="2">Васёк
		<option value="3">Колька
		<option value="4">Инокентий
	</select>
	Текст сообщения: <br /><textarea name="message"></textarea><br />
	<input type="submit"  value="Отправить" />
</form>


Обработчик отправки сообщения

Обработчик должен принять данные формы и записать их в БД.
/**
 * Принимаем постовые данные. Очистим сообщение от html тэгов
 * и приведем id получателя к типу integer
 */
$message= htmlspecialchars($_POST[&apos;message&apos;]);
$to=(int)$_POST[&apos;to&apos;];
 
/**
 * Я использую библиотеку PDO 
 */
$db_user=&apos;db_username&apos;;
$db_name=&apos;db_name&apos;;
$db_pass=&apos;db_userpassword&apos;;
 
$db  =  new  PDO(&apos;mysql:dbname=&apos;.$db_name.&apos;; host=localhost&apos;,$db_user,$db_pass);
$db->exec("SET CHARACTER SET utf8");
 
$sql="insert into messages (u_from,u_to,message,flag) values 
    (:u_from,:u_to,:message,:flag)";
$sth=$db->prepare($sql);
$sth->bindValue(&apos;:u_from&apos;, 1);// тут 1-это номер отправителя
$sth->bindValue(&apos;:u_to&apos;, $to);
$sth->bindValue(&apos;:message&apos;, $message);
$sth->bindValue(&apos;:flag&apos;, 0);
$sth->execute();
$error=$sth->errorInfo();
/**
 * Проверка результата запроса 
 */
if($error[0]==0){
    echo &apos;Сообщение успешно отправлено&apos;;
}else{
    echo &apos;Ошибка отправки сообщения&apos;;
}

Вот таким образом можно отправить сообщение одному пользователю от другого.
В моем скрипте сообщение отправляется от пользователя с id=1. В вашем случае адрес отправителя берется из массива $_SESSION или $_COOKIE, смотря как у вас устроен сайт.

Теперь напишем скрипт, который выведет все сообщения,адресованные конкретному пользователю. Опять же подтягивайте номер пользователя из сессии или куки.
/**
 * Номер пользователя,для которого отображать сообщения 
 */
$u_id=1;
 
$db_user=&apos;db_username&apos;;
$db_name=&apos;db_name&apos;;
$db_pass=&apos;db_userpassword&apos;;
 
$db  =  new  PDO(&apos;mysql:dbname=&apos;.$db_name.&apos;; host=localhost&apos;,$db_user,$db_pass);
$db->exec("SET CHARACTER SET utf8");
 
/**
 * Достаем сообщения 
 */
$sql="select * from messages where u_to=? order by id desc";
$sth=$db->prepare($sql);
$sth->bindParam(1,$u_id,PDO::PARAM_INT);
$sth->execute();
$res=$sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $row){
    echo &apos;Сообщение №&apos;.$row[&apos;id&apos;].&apos;  <a href="read_mess.php?id=&apos;.$row[&apos;id&apos;].&apos;">Открыть</a><br />&apos;;
}

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

Чтение сообщения

/**
 * Номер пользователя
 */
$u_id=1;
 
/**
 * Получаем номер сообщения. Приводим его типу Integer 
 */
$id_mess=(int)$_GET[&apos;id&apos;];
 
$db_user=&apos;db_username&apos;;
$db_name=&apos;db_name&apos;;
$db_pass=&apos;db_userpassword&apos;;
 
$db = new  PDO(&apos;mysql:dbname=&apos;.$db_name.&apos;; host=localhost&apos;,$db_user,$db_pass);
$db->exec("SET CHARACTER SET utf8");
 
/**
 * Достаем сообщение. Помимо номера сообщения ориентируемся и на id пользователя
 * Это исключит возможность чтения чужого сообщения, методом подбора id сообщения
 */
$sql="select * from messages where u_to = :u_to and id = :id_mess";
$sth=$db->prepare($sql);
$sth->bindParam(&apos;:u_to&apos;,$u_id,PDO::PARAM_INT);
$sth->bindParam(&apos;:id_mess&apos;,$id_mess,PDO::PARAM_INT);
$sth->execute();
$res=$sth->fetch(PDO::FETCH_ASSOC);
 
/**
 * Установим флаг о прочтении сообщения 
 */
$sql="update messages set flag = 1 where  u_to = :u_to and id = :id_mess";
$sth=$db->prepare($sql);
$sth->bindParam(&apos;:u_to&apos;,$u_id,PDO::PARAM_INT);
$sth->bindParam(&apos;:id_mess&apos;,$id_mess,PDO::PARAM_INT);
$sth->execute();
 
/**
 * Выводим сообщение с датой отправки 
 */
if($res[&apos;id&apos;]<>&apos;&apos;){
    echo &apos;<div>&apos;.$res[&apos;message&apos;].&apos;</div>Дата отправки: &apos;.$res[&apos;data&apos;];
}else{
    echo &apos;Данного сообщения не существует или оно предназначено не вам.&apos;;
}

Вот и всё. Если вы поняли как Всё это работает - вы сможете сами сделать список отправленных сообщений. С помощью поля flag можно подсвечивать новые/непрочитанные сообщения.
Задавайте ваши вопросы.

Исходники: php_messages.rar
Теги:
сообщения, отправки, message, messages, bindParam, PARAM, номер, value, сообщения , select, execute, option, bindValue, prepare, скрипт, DEFAULT, localhost, where, можно, userpassword, mysql, dbname, username, пользователю, CHARACTER, чтения, пользователя, напишем, Теперь, error, отправителя, ASSOC, получателя, Номер, пользователя
Добавлено: 31 Декабря 2014 11:31:20 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...