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

Опубликовано 2012.01.17

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

Дамп таблицы

  1. CREATE TABLE IF NOT EXISTS `messages` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  4. `u_from` int(11) NOT NULL,
  5. `u_to` int(11) NOT NULL,
  6. `message` text NOT NULL,
  7. `flag` int(11) NOT NULL DEFAULT '0',
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
В поле data будет дата отправки сообщения,поле from-уникальный номер отправителя,to-номер получателя,message-само сообщение и поле flag-отметка о том-прочтено сообщение или ещё нет. Теперь займемся клиентской частью-напишем форму отправки сообщения и php обработчик формы отправки.

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

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

Форма ввода сообщения

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

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

Обработчик должен принять данные формы и записать их в БД.
  1. /**
  2.  * Принимаем постовые данные. Очистим сообщение от html тэгов
  3.  * и приведем id получателя к типу integer
  4.  */
  5. $message= htmlspecialchars($_POST['message']);
  6. $to=(int)$_POST['to'];
  7.  
  8. /**
  9.  * Я использую библиотеку PDO
  10.  */
  11. $db_user='db_username';
  12. $db_name='db_name';
  13. $db_pass='db_userpassword';
  14.  
  15. $db = new PDO('mysql:dbname='.$db_name.'; host=localhost',$db_user,$db_pass);
  16. $db->exec("SET CHARACTER SET utf8");
  17.  
  18. $sql="insert into messages (u_from,u_to,message,flag) values
  19. (:u_from,:u_to,:message,:flag)";
  20. $sth=$db->prepare($sql);
  21. $sth->bindValue(':u_from', 1);// тут 1-это номер отправителя
  22. $sth->bindValue(':u_to', $to);
  23. $sth->bindValue(':message', $message);
  24. $sth->bindValue(':flag', 0);
  25. $sth->execute();
  26. $error=$sth->errorInfo();
  27. /**
  28.  * Проверка результата запроса
  29.  */
  30. if($error[0]==0){
  31. echo 'Сообщение успешно отправлено';
  32. }else{
  33. echo 'Ошибка отправки сообщения';
  34. }
Вот таким образом можно отправить сообщение одному пользователю от другого. В моем скрипте сообщение отправляется от пользователя с id=1. В вашем случае адрес отправителя берется из массива $_SESSION или $_COOKIE, смотря как у вас устроен сайт. Теперь напишем скрипт, который выведет все сообщения,адресованные конкретному пользователю. Опять же подтягивайте номер пользователя из сессии или куки.
  1. /**
  2.  * Номер пользователя,для которого отображать сообщения
  3.  */
  4. $u_id=1;
  5.  
  6. $db_user='db_username';
  7. $db_name='db_name';
  8. $db_pass='db_userpassword';
  9.  
  10. $db = new PDO('mysql:dbname='.$db_name.'; host=localhost',$db_user,$db_pass);
  11. $db->exec("SET CHARACTER SET utf8");
  12.  
  13. /**
  14.  * Достаем сообщения
  15.  */
  16. $sql="select * from messages where u_to=? order by id desc";
  17. $sth=$db->prepare($sql);
  18. $sth->bindParam(1,$u_id,PDO::PARAM_INT);
  19. $sth->execute();
  20. $res=$sth->fetchAll(PDO::FETCH_ASSOC);
  21. foreach ($res as $row){
  22. echo 'Сообщение №'.$row['id'].' <a href="read_mess.php?id='.$row['id'].'">Открыть</a><br />';
  23. }
И наконец последний скрипт, предназначенный для чтения сообщения из базы и отображения его пользователю.

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

  1. /**
  2.  * Номер пользователя
  3.  */
  4. $u_id=1;
  5.  
  6. /**
  7.  * Получаем номер сообщения. Приводим его типу Integer
  8.  */
  9. $id_mess=(int)$_GET['id'];
  10.  
  11. $db_user='db_username';
  12. $db_name='db_name';
  13. $db_pass='db_userpassword';
  14.  
  15. $db = new PDO('mysql:dbname='.$db_name.'; host=localhost',$db_user,$db_pass);
  16. $db->exec("SET CHARACTER SET utf8");
  17.  
  18. /**
  19.  * Достаем сообщение. Помимо номера сообщения ориентируемся и на id пользователя
  20.  * Это исключит возможность чтения чужого сообщения, методом подбора id сообщения
  21.  */
  22. $sql="select * from messages where u_to = :u_to and id = :id_mess";
  23. $sth=$db->prepare($sql);
  24. $sth->bindParam(':u_to',$u_id,PDO::PARAM_INT);
  25. $sth->bindParam(':id_mess',$id_mess,PDO::PARAM_INT);
  26. $sth->execute();
  27. $res=$sth->fetch(PDO::FETCH_ASSOC);
  28.  
  29. /**
  30.  * Установим флаг о прочтении сообщения
  31.  */
  32. $sql="update messages set flag = 1 where u_to = :u_to and id = :id_mess";
  33. $sth=$db->prepare($sql);
  34. $sth->bindParam(':u_to',$u_id,PDO::PARAM_INT);
  35. $sth->bindParam(':id_mess',$id_mess,PDO::PARAM_INT);
  36. $sth->execute();
  37.  
  38. /**
  39.  * Выводим сообщение с датой отправки
  40.  */
  41. if($res['id']<>''){
  42. echo '<div>'.$res['message'].'</div>Дата отправки: '.$res['data'];
  43. }else{
  44. echo 'Данного сообщения не существует или оно предназначено не вам.';
  45. }
Вот и всё. Если вы поняли как Всё это работает - вы сможете сами сделать список отправленных сообщений. С помощью поля flag можно подсвечивать новые/непрочитанные сообщения. Задавайте ваши вопросы. Все скрипты приаттачены к статье,качайте. На этом всё :)