Доброго времени суток, уважаемые форумчане. По данной ссылке находится чат, довольно простой, (я не могу самостоятельно найти ссылку, откуда я брал этот чат, а сам не могу разобраться, поэтому прошу у вас помощи) но существует проблема вывод сообщений из БД. Они путаются, дублируются по непонятной мне причине, подскажите пожалуйста, в чём ошибка? Коды: Спойлер: Непосредственно сам чат PHP: <?php header('Content-Type: text/html; charset=utf-8'); require_once('chat/src/DB_master.php'); // подключаем класс БД $nick = $_SESSION['cw_user']; // ник пользователя из сессии $msg_data = $db->get_msg_list(); // получаем массив со списком сообщений за тек день $msg_list = ''; // html лист сообщений $last_id = 0; // id последнего выводимого сообщения $ // если в списке есть сообщения if(count($msg_data) > 0){ foreach($msg_data as $row){ // заносим их в массив $msg_list .= ' <div class="msg"> <span class="nick">'.$row['user'].': </span> <span class="txt">'.$row['msg'].'</span> </div>'; // запоминаем id $last_id = $row['id']; } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Chat</title> <link href="pages/chat/css/style.css" rel="stylesheet" /> <script type="text/javascript" src="pages/chat/js/jquery-1.6.1.min.js"></script> <script> jQuery(function($){ var user_nick = '<?php echo $nick; ?>'; var last_id = parseInt('<?php echo $last_id; ?>'); var ajax_url = 'pages/chat/src/ajax.php'; function addMSG(user, msg){ var msg = ''+ '<div class="msg">'+ '<span class="nick">'+user+': </span>'+ '<span class="txt">'+msg+'</span>'+ '</div>'; $('#msgs').append(msg); fixScroll(); } function fixScroll(){ var height = $('#msgs')[0].scrollHeight; $('#msgs').scrollTop(height); } function sendForm() { var msg = $("input[name='msg']").val(); if (msg.length > 0 && msg.length <= 256) { $("input[name='msg']").val(''); addMSG(user_nick, msg); $.ajax({ type: "POST", url: ajax_url, data: { req_type: 'send_msg', nick: user_nick, msg: msg }, success: function (res) { last_id = res; } }); }; }; $('#send_btn').click(sendForm); $("input[name='msg']").keydown( function (event) { if (event.keyCode == 13) { sendForm(); } } ); fixScroll(); function interval(){ $.ajax({ type: "POST", url: ajax_url, data: { req_type: 'get_msgs', last_id: last_id }, dataType: "json", success: function(res){ if(res.length > 0){ for(var i=0; i< res.length; i++){ addMSG(res[i].user, res[i].msg); last_id = res[i].id; } } } }); } var update_timer = setInterval(interval, 500); }); </script> </head> Спойлер: AJAX PHP: <?php require_once('DB_master.php'); // обезараживание строки function defString($string) { $string=strip_tags($string); $string=htmlentities($string, ENT_QUOTES, "utf-8"); $string=stripcslashes($string); return $string; } switch( defString($_POST['req_type']) ){ case 'send_msg': echo $db->addMSG( defString($_POST['nick']), defString($_POST['msg']) ); break; case 'get_msgs': echo json_encode( $db->get_msg_list( defString($_POST['last_id']) ) ); break; } Спойлер: DB Master PHP: <?php header('Content-Type: text/html; charset=utf-8'); // устанавливаем серверное время date_default_timezone_set('Asia/Novosibirsk'); class DB_master { private $DB_HOST = "хост"; private $DB_USER = "юзверь"; private $DB_PASS = "пароль"; private $DB_NAME = "бд"; private $connection; function __construct() { $this->open_connection(); } // подключаемся к БД private function open_connection() { $this->connection = mysql_connect ($this->DB_HOST,$this->DB_USER,$this->DB_PASS); // Подключение к MySQL if (!$this->connection) { die ("Database connection failed: ".mysql_error());} else { $db_select = mysql_select_db ($this->DB_NAME); // Подключение к базе по имени $this->DB_NAME if (!$db_select) {die("DataBase selection failed: ".mysql_error());} } mysql_query(); } // возвращает результат передаваемого запроса к БД public function sql($query) { $result = mysql_query($query, $this->connection); if (!$result) { die ("DataBase query faild".mysql_error()); } return $result; } // возвращает список сообщений public function get_msg_list($last_id = 1){ $data = array(); // можно указать id последнего сообщения, после которого необходимо вытягивать инфу if($last_id == 0){ $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 '; }else{ $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 AND `id` > ' . $last_id; } $res = $this->sql($sql); // заносим полученные данные в отдельный массив while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { $data[] = $row; } // возвращаем массив return $data; } // добавляем сообщение в БД public function addMSG($user, $msg){ $cur_date = date('Y-m-d H:i:s'); $res = $this->sql('INSERT INTO `chat`(`user`, `msg`, `msg_date`) VALUES ("'.$user.'","'.$msg.'", "'.$cur_date.'")'); return mysql_insert_id(); } public function close_connect() { mysql_close($this->connection); } } // объявляем класс БД global $db; $db = new DB_master();
Выполни SELECT запросы из DB_master с параметрами при которых были видны глюки. На глаз, можно в SELECT добавить сортировку по дате или id. Возможно поможет. Тут может быть SQL-injection http://phpfaq.ru/mysql/sql_injection
Благодарю за помощь, помогло следущее: PHP: // можно указать id последнего сообщения, после которого необходимо вытягивать инфу if($last_id == 0){ $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 ORDER BY id'; }else{ $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 AND `id` > ' . $last_id; } $res = $this->sql($sql);