За последние 24 часа нас посетили 17795 программистов и 1665 роботов. Сейчас ищут 852 программиста ...

Путаница с выводом сообщений в чате

Тема в разделе "PHP и базы данных", создана пользователем opiums, 24 сен 2016.

  1. opiums

    opiums Активный пользователь

    С нами с:
    6 фев 2015
    Сообщения:
    24
    Симпатии:
    0
    Доброго времени суток, уважаемые форумчане. По данной ссылке находится чат, довольно простой, (я не могу самостоятельно найти ссылку, откуда я брал этот чат, а сам не могу разобраться, поэтому прошу у вас помощи) но существует проблема вывод сообщений из БД. Они путаются, дублируются по непонятной мне причине, подскажите пожалуйста, в чём ошибка?

    Коды:
    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. require_once('chat/src/DB_master.php');  // подключаем класс БД
    4. $nick = $_SESSION['cw_user'];   // ник пользователя из сессии
    5. $msg_data = $db->get_msg_list();    // получаем массив со списком сообщений за тек день
    6. $msg_list = ''; // html лист сообщений
    7. $last_id = 0;   // id последнего выводимого сообщения $
    8.  
    9. // если в списке есть сообщения
    10. if(count($msg_data) > 0){
    11.     foreach($msg_data as $row){
    12.         // заносим их в массив
    13.         $msg_list .= '
    14.        <div class="msg">
    15.            <span class="nick">'.$row['user'].': </span>
    16.            <span class="txt">'.$row['msg'].'</span>
    17.        </div>';
    18.  
    19.         // запоминаем id
    20.         $last_id = $row['id'];
    21.     }
    22. }
    23.  
    24. ?>
    25.  
    26. <html>
    27. <head>
    28. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    29.     <title>Chat</title>
    30.     <link href="pages/chat/css/style.css" rel="stylesheet" />
    31.     <script type="text/javascript" src="pages/chat/js/jquery-1.6.1.min.js"></script>
    32.     <script>
    33.     jQuery(function($){
    34.         var user_nick = '<?php echo $nick; ?>';
    35.         var last_id = parseInt('<?php echo $last_id; ?>');
    36.         var ajax_url = 'pages/chat/src/ajax.php';
    37.  
    38.         function addMSG(user, msg){
    39.             var msg = ''+
    40.             '<div class="msg">'+
    41.                 '<span class="nick">'+user+': </span>'+
    42.                 '<span class="txt">'+msg+'</span>'+
    43.             '</div>';
    44.             $('#msgs').append(msg);
    45.             fixScroll();
    46.         }
    47.  
    48.         function fixScroll(){
    49.             var height = $('#msgs')[0].scrollHeight;
    50.             $('#msgs').scrollTop(height);
    51.         }
    52.  
    53. function sendForm() {
    54.     var msg = $("input[name='msg']").val();
    55.     if (msg.length > 0 && msg.length <= 256) {
    56.         $("input[name='msg']").val('');
    57.         addMSG(user_nick, msg);
    58.         $.ajax({
    59.             type: "POST",
    60.             url: ajax_url,
    61.             data: {
    62.                 req_type: 'send_msg',
    63.                 nick: user_nick,
    64.                 msg: msg
    65.             },
    66.             success: function (res) {
    67.                 last_id = res;
    68.             }
    69.         });
    70.     };
    71. };
    72. $('#send_btn').click(sendForm);
    73. $("input[name='msg']").keydown(
    74.     function (event) {
    75.         if (event.keyCode == 13) {
    76.             sendForm();
    77.         }
    78.     }
    79. );
    80.    
    81.         fixScroll();
    82.  
    83.         function interval(){
    84.             $.ajax({
    85.                 type: "POST",
    86.                 url: ajax_url,
    87.                 data: {
    88.                     req_type: 'get_msgs',
    89.                     last_id: last_id
    90.                 },
    91.                 dataType: "json",
    92.                 success: function(res){
    93.  
    94.                     if(res.length > 0){
    95.  
    96.                         for(var i=0; i< res.length; i++){
    97.                             addMSG(res[i].user, res[i].msg);
    98.                             last_id = res[i].id;
    99.                         }
    100.                     }
    101.                 }
    102.             });
    103.         }
    104.  
    105.  
    106.         var update_timer = setInterval(interval, 500);
    107.     });
    108.     </script>
    109. </head>
    PHP:
    1. <?php
    2.  
    3. require_once('DB_master.php');
    4.  
    5. // обезараживание строки
    6. function defString($string) {
    7.     $string=strip_tags($string);
    8.     $string=htmlentities($string, ENT_QUOTES, "utf-8");
    9.     $string=stripcslashes($string);
    10.     return $string;
    11. }
    12.  
    13. switch( defString($_POST['req_type']) ){
    14.     case 'send_msg':
    15.         echo $db->addMSG( defString($_POST['nick']), defString($_POST['msg']) );
    16.         break;
    17.     case 'get_msgs':
    18.         echo json_encode( $db->get_msg_list( defString($_POST['last_id']) ) );
    19.         break;
    20. }
    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8');
    3. // устанавливаем серверное время
    4. date_default_timezone_set('Asia/Novosibirsk');
    5.  
    6. class DB_master {
    7.     private $DB_HOST  = "хост";
    8.     private $DB_USER  = "юзверь";
    9.     private $DB_PASS  = "пароль";
    10.     private $DB_NAME  = "бд";
    11.     private $connection;
    12.  
    13.     function __construct() {
    14.         $this->open_connection();
    15.     }
    16.  
    17.     // подключаемся к БД
    18.     private function open_connection() {
    19.         $this->connection = mysql_connect ($this->DB_HOST,$this->DB_USER,$this->DB_PASS); // Подключение к MySQL
    20.         if (!$this->connection) { die ("Database connection failed: ".mysql_error());}
    21.         else {
    22.             $db_select = mysql_select_db ($this->DB_NAME); // Подключение к базе по имени $this->DB_NAME
    23.             if (!$db_select) {die("DataBase selection failed: ".mysql_error());}
    24.         }
    25.         mysql_query();
    26.     }
    27.  
    28.     // возвращает результат передаваемого запроса к БД
    29.     public function sql($query) {
    30.         $result = mysql_query($query, $this->connection);
    31.         if (!$result) {
    32.             die ("DataBase query faild".mysql_error());
    33.         }
    34.         return $result;
    35.     }
    36.  
    37.     // возвращает список сообщений
    38.     public function get_msg_list($last_id = 1){
    39.         $data = array();
    40.  
    41.         // можно указать id последнего сообщения, после которого необходимо вытягивать инфу
    42.         if($last_id == 0){
    43.             $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 ';
    44.         }else{
    45.             $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 AND `id` > ' . $last_id;
    46.         }
    47.  
    48.         $res = $this->sql($sql);
    49.  
    50.         // заносим полученные данные в отдельный массив
    51.         while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
    52.             $data[] = $row;
    53.         }
    54.  
    55.         // возвращаем массив
    56.         return $data;
    57.     }
    58.  
    59.     // добавляем сообщение в БД
    60.     public function addMSG($user, $msg){
    61.         $cur_date = date('Y-m-d H:i:s');
    62.         $res = $this->sql('INSERT INTO `chat`(`user`, `msg`, `msg_date`) VALUES ("'.$user.'","'.$msg.'", "'.$cur_date.'")');
    63.         return mysql_insert_id();
    64.     }
    65.  
    66.     public function close_connect() {
    67.         mysql_close($this->connection);
    68.     }
    69. }
    70.  
    71. // объявляем класс БД
    72. global $db;
    73. $db = new DB_master();
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Выполни SELECT запросы из DB_master с параметрами при которых были видны глюки.
    На глаз, можно в SELECT добавить сортировку по дате или id. Возможно поможет.


    Тут может быть SQL-injection http://phpfaq.ru/mysql/sql_injection
     
  3. opiums

    opiums Активный пользователь

    С нами с:
    6 фев 2015
    Сообщения:
    24
    Симпатии:
    0
    Приведите пожалуйста пример, как можно сделать сортировку по дате или id?
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    поищи по словам mysql order будет много примеров, в документации по mysql тоже должны быть
     
  5. opiums

    opiums Активный пользователь

    С нами с:
    6 фев 2015
    Сообщения:
    24
    Симпатии:
    0
    Благодарю за помощь, помогло следущее:

    PHP:
    1.         // можно указать id последнего сообщения, после которого необходимо вытягивать инфу
    2.         if($last_id == 0){
    3.             $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 ORDER BY id';
    4.         }else{
    5.             $sql = 'SELECT * FROM `chat` WHERE TO_DAYS(NOW()) - TO_DAYS(`msg_date`) <= 365 AND `id` > ' . $last_id;
    6.         }
    7.  
    8.         $res = $this->sql($sql);