Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 569

/ вопрос открыт /

Здравствуйте!
Есть две таблицы

DROP TABLE IF EXISTS `users`;
 
CREATE TABLE IF NOT EXISTS `users` (
  `uid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `ip_address` varchar(15) NOT NULL,
  `status` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT '0',
  `nick` varchar(60) NOT NULL,
  `surname` varchar(20) NOT NULL,
  `name` varchar(20) NOT NULL,
  `patronymic` varchar(20) NOT NULL,
  `cabinet` smallint(3) DEFAULT NULL,
  `pc_name` varchar(20) NOT NULL,
  `client_version` varchar(10) NOT NULL,
  `admin_status` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT '0',
  `admin_flags` varchar(3) NOT NULL,
  `connection_time` datetime DEFAULT NULL,
  `about` varchar(2000) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
 
INSERT INTO `users` (`uid`, `ip_address`, `status`, `nick`, `surname`, `name`, `patronymic`, `cabinet`, `pc_name`,
`client_version`, `admin_status`, `admin_flags`, `connection_time`, `about`) VALUES
(NULL, '192.168.0.2', 1, 'Shouldercannon', '', '', '', 305, 'ROMAN', '1.0.0.0', 1, 'z', '2013-03-20 00:00:00', ''),
(NULL, '192.168.0.3', 1, 'Kira', '', '', '', 303, 'KIRA', '1.0.0.0.0', 1, 'ab', '2013-03-20 10:14:46', ''),
(NULL, '192.168.0.4', 1, 'Гость', '', '', '',  302, '302-4', '1.0.0.1', 0, '', '2013-03-20 00:00:55', ''),
(NULL, '192.168.0.5', 0, 'Тестер', '', '', '',  502, '502-1', '1.0.1.1', 0, '', '2013-03-20 00:10:55', '');
 
DROP TABLE IF EXISTS `private_messages`;
 
CREATE TABLE IF NOT EXISTS `private_messages` (
  `uid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `from` int(2) UNSIGNED NOT NULL,
  `to` int(2) UNSIGNED NOT NULL,
  `date` datetime DEFAULT NULL,
  `message` varchar(2000) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
 
INSERT INTO `private_messages` (`uid`, `from`, `to`, `date`, `message`) VALUES
(NULL, 1, 1, '2013-03-20 10:00:00', 'Привет'),
(NULL, 3, 1, '2013-03-20 10:01:27', 'Добрый'),
(NULL, 2, 1, '2013-03-20 10:02:46', 'Как дела'),
(NULL, 4, 1, '2013-03-20 10:04:12', 'Нормально');

Так я получаю всё содержимое private_messages, где вместо from и to подставляются из users ники пользователей
<?php
include "dbconnect.php";
// Проверка на пустоту
if (empty($_GET['usrid']) || empty($_GET['from']) || empty($_GET['pmid'])) {
  die;
}
$query = "SELECT `tpm`.`uid`, `tusr_from`.`nick` AS `from`, `tusr_to`.`nick` AS `to`, `tpm`.`date`, `tpm`.`message`
          FROM `private_messages` AS `tpm`
         JOIN `users` AS `tusr_from` ON `tusr_from`.`uid` = `tpm`.`from`
         JOIN `users` AS `tusr_to` ON `tusr_to`.`uid` = `tpm`.`to`
     WHERE `tpm`.`uid` >= '".intval(mysql_real_escape_string($_GET['pmid']))."'
     ORDER BY `tpm`.`uid`";
$result = mysql_query($query) or die ("ERROR: ".mysql_error());
while ($row = mysql_fetch_array($result)) // Берём результаты из каждой строки
echo $row['uid'].'~'.$row['from'].'~'.$row['to'].'~'.$row['date'].'~'.$row['message'].'!end-post'; // Выводим данные
?>

Помогите, пожалуйста, сделать, чтобы выводились сообщения от указанных from и to

Shouldercannon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 4 декабря 2014, 15:41
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Ins

Здравствуйте, Shouldercannon!
Во первых следует отказаться от mysql и перейти на PDO или mysqli, во вторых в данном случае вообще не нужно использовать die, в третьих никогда не нужно показывать юзерам ошибки пыхи и мускула. нужно писать их в лог, а выводить свой текст. Это касательно пыхи.

По мускулу:
1) создать индексы на поля: from и to. в данном случае отдельный индекс для каждого поля т.к. используется OR.
2) Запрос приложен. Показывает приватные сообщения для/от пользователя под номером 1.
3) Сортировку лучше делать по дате/времени. оно ка кто логичнее.
4) Поле uid из таблицы сообщений выкинуть, не нужно оно там.
5) Если уже используется InnoDB(который требует "ведро" памяти) - нужно пользоваться его преимуществами, в данном случае внешними ключами

Приложение:
  1. SELECT `tpm`.`uid`, `tusr_from`.`nick` AS `from`, `tusr_to`.`nick` AS `to`, `tpm`.`date`, `tpm`.`message`
  2. FROM `private_messages` AS `tpm`
  3. JOIN `users` AS `tusr_from` ON `tusr_from`.`uid` = `tpm`.`from`
  4. JOIN `users` AS `tusr_to` ON `tusr_to`.`uid` = `tpm`.`to`
  5. WHERE `tpm`.`from` = '1' or `tpm`.`to` = '1'
  6. ORDER BY `tpm`.`date`


Ответ отправил: Ins (статус: 1-ый класс)
Время отправки: 15 декабря 2014, 06:53


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 15:28
Выполнено за 0.05 сек.