Скрипт личных сообщений на PHP

Личные сообщения на PHP

Приветствую! Сегодня будем учиться создавать систему личных сообщений на PHP. Для чего это нужно, думаю, всем будет понятно. Предположительно, на вашем сайте есть некоторые пользователи, которые бы хотели связываться между собой не прибегая к помощи посторонних сервисов и оставаясь на вашем сайте. PHP сообщения решают эту проблему. Мы сделаем скрипт личных сообщений на PHP, который будет состоять из таблицы БД для хранения личных сообщений, скрипта отправки сообщения и скрипта чтения сообщения.

Оглавление:
Создания таблицы БД на PHP
Форма отправки сообщения PHP
Чтение сообщений

Создания таблицы БД на PHP:

Начнем с базы данных для наших личных сообщения. Она представляет собой таблицу со следующими полями:

  1. ID
  2. Дата отправки
  3. Отправитель
  4. Получатель
  5. Содержимое
  6. Флаг сообщения

Мы назовем таблицу 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-обработчик формы отправки.

Форма отправки сообщения 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['message']);
$to=(int)$_POST['to'];

/**
 * Я использую библиотеку PDO
 */
$db_user='db_username';
$db_name='db_name';
$db_pass='db_userpassword';

$db  =  new  PDO('mysql:dbname='.$db_name.'; host=localhost',$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(':u_from', 1);// 1 - ID отправителя
$sth->bindValue(':u_to', $to);
$sth->bindValue(':message', $message);
$sth->bindValue(':flag', 0);
$sth->execute();
$error=$sth->errorInfo();
/**
 * Проверка результата запроса
 */
if($error[0]==0){
    echo 'Сообщение успешно отправлено';
}else{
    echo 'Ошибка отправки сообщения';
}

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

/**
 * Номер пользователя,для которого отображать сообщения
 */
$u_id=1;

$db_user='db_username';
$db_name='db_name';
$db_pass='db_userpassword';

$db  =  new  PDO('mysql:dbname='.$db_name.'; host=localhost',$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 'Сообщение №'.$row['id'].'  <a href="read_mess.php?id='.$row['id'].'">Открыть</a><br />';
}

Чтение сообщений:

Последний скрипт направлен на чтение личных сообщений, которые он вытаскивает из БД.

/**
 * Номер пользователя
 */
$u_id=1;

/**
 * Получаем номер сообщения. Приводим его типу Integer
 */
$id_mess=(int)$_GET['id'];

$db_user='db_username';
$db_name='db_name';
$db_pass='db_userpassword';

$db = new  PDO('mysql:dbname='.$db_name.'; host=localhost',$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(':u_to',$u_id,PDO::PARAM_INT);
$sth->bindParam(':id_mess',$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(':u_to',$u_id,PDO::PARAM_INT);
$sth->bindParam(':id_mess',$id_mess,PDO::PARAM_INT);
$sth->execute();

/**
 * Выводим сообщение с датой отправки
 */
if($res['id']<>''){
    echo '<div>'.$res['message'].'</div>Дата отправки: '.$res['data'];
}else{
    echo 'Данного сообщения не существует или оно предназначено не вам.';
}

44
Поделиться
Mentor

Уже более четырех лет интернет - моё хобби. Больше всего мне удалось освоить веб-дизайн. В настоящее время активно занят продвижением сайтов.

3 коммент.

  1. Обновите код пожалуйста. Создаем таблицу с колонками from, to в коде же u_from и u_to.

    И так же после того как были приведены колонки к общему имени — не пашет код выдавая ошибку — Unknown column ‘from’ in ‘field list’. Хотя странно, так как в БД есть такой столбец и как понять что он ему неизвестный не знаю.

    Может подскажите?

Оставить комментарий

Войти с помощью: 
Яндекс.Метрика