За последние 24 часа нас посетили 37259 программистов и 7910 роботов. Сейчас ищут 1782 программиста ...

Дублирует сообщения при обновлении страницы

Тема в разделе "PHP для новичков", создана пользователем Сергей1231, 21 фев 2023.

  1. Сергей1231

    Сергей1231 Новичок

    С нами с:
    20 фев 2023
    Сообщения:
    5
    Симпатии:
    0
    Доброго времени суток , возникла проблема , при отправке сообщения , потом если обновить страницу , оно дублируется ( в датабазу тоже дублируется ) Код прилагаю . Помогите пожалуйста
    Код (Text):
    1. <?php
    2. session_start();
    3. ini_set('display_errors', 'on');
    4. require_once("./Connector/DbConnectorPDO.php");
    5. require("./helper/helperFunctions.php");
    6. $userId = isset($_SESSION["userId"]) && !IsVariableIsSetOrEmpty($_SESSION["userId"]) ? $_SESSION["userId"] : 0;
    7. $connection = getConnection();
    8. $userObj = $userId !== 0 && !IsVariableIsSetOrEmpty($_SESSION["user"]) ? $_SESSION["user"] : "";
    9. $msgList = [];
    10. $recentMsgList = [];
    11. $msgToUserId = isset($_GET["id"]) && !IsVariableIsSetOrEmpty($_GET["id"]) ? $_GET["id"] : 0;
    12.  
    13. if (isset($_POST["SendMessage"]) && !IsVariableIsSetOrEmpty($_POST["SendMessage"])) {
    14.     $msg = $_POST["msg"];
    15.     if (isset($msg) && !IsVariableIsSetOrEmpty($msg)) {
    16.         $insertMessageQuery = "INSERT INTO messages(msg_from_user_id,msg,msg_to_user_id,msg_date,is_msg_read)
    17.                                values(:userId,:msg,:msgToUserId,NOW(),0)";
    18.         $insertStmt = $connection->prepare($insertMessageQuery);
    19.         $insertStmt->bindParam(':userId', $userId);
    20.         $insertStmt->bindParam(':msg', $msg);
    21.         $insertStmt->bindParam(':msgToUserId', $msgToUserId);
    22.         $insertStmt->execute();
    23.        
    24.     }
    25.  
    26. }
    27.  
    28. if ($userId === 0 || (!isset($_GET["id"]) && !isset($msgToUserId))) {
    29.     header("location:./view-profiles.php");
    30.     exit;
    31. }
    32.  
    33. if ($msgToUserId !== 0) {
    34.  
    35.     $recentMsgQuery = "SELECT
    36.     *
    37. FROM
    38.     (
    39.     SELECT profile
    40.         .id,
    41.         profile.firstName,
    42.         profile.lastName,
    43.         profile.imgUrl,
    44.         (
    45.         SELECT
    46.             msg
    47.         FROM
    48.             messages
    49.         WHERE
    50.             messages.msg_from_user_id = profile.id OR messages.msg_to_user_id = profile.id
    51.         ORDER BY
    52.             id
    53.         DESC
    54.     LIMIT 1
    55.     ) AS lastMessage,
    56.     (
    57.     SELECT
    58.         msg_date
    59.     FROM
    60.         messages
    61.     WHERE
    62.         messages.msg_from_user_id = profile.id OR messages.msg_to_user_id = profile.id
    63.     ORDER BY
    64.         id
    65.     DESC
    66. LIMIT 1
    67. ) AS msgDate
    68. FROM profile
    69. WHERE
    70.     id <> :userId
    71. ) X
    72. LEFT JOIN (
    73.     Select DISTINCT ids
    74.     from (
    75.             select msg_from_user_id as ids
    76.             from messages
    77.             where msg_from_user_id =:userId  or msg_to_user_id=:userId
    78.             UNION
    79.             select msg_to_user_id as ids
    80.             from messages
    81.             where msg_from_user_id =:userId  or msg_to_user_id=:userId
    82.         )uniqueIdList
    83.         where ids <> :userId
    84.    )IdList on X.id=IdList.ids
    85. WHERE
    86.     ids IS NOT NULL
    87.     AND
    88.     lastMessage IS NOT NULL
    89.     ORDER BY msgDate desc";
    90.     $recentQueryStmt = $connection->prepare($recentMsgQuery);
    91.     $recentQueryStmt->bindParam(':userId', $userId);
    92.     $recentQueryStmt->execute();
    93.     $recentMsgList = $recentQueryStmt->fetchAll();
    94.    
    95.  
    96.  
    97.     $query = "SELECT m.id as msg_id
    98.       ,msg_from_user_id
    99.       ,msg_to_user_id
    100.       ,msg
    101.       ,msg_date
    102.       ,is_msg_read
    103.       ,msg_read_date
    104.       ,fromUser.id as fromUserId
    105.       ,fromUser.firstName as fromFirstName
    106.       ,fromUser.lastName as fromLastName
    107.       ,fromUser.imgUrl as fromUserImgUrl
    108.       ,toUser.id as toUserId
    109.       ,toUser.firstName as toUserFirstName
    110.       ,toUser.lastName as toUserLastName
    111.       ,toUser.imgUrl as toUserImgUrl
    112. FROM messages m
    113. left join profile as fromUser on m.msg_from_user_id=fromUser.id
    114. left JOIN profile as toUser on m.msg_to_user_id=toUser.id
    115. WHERE (msg_from_user_id =:userId and msg_to_user_id=:sentToUserID) or (msg_from_user_id=:sentToUserID and msg_to_user_id=:userId)";
    116. //ORDER BY msg_date DESC";
    117.  
    118.     $stmt = $connection->prepare($query);
    119.     $stmt->bindParam(':userId', $userId);
    120.     $stmt->bindParam(':sentToUserID', $_GET["id"]);
    121.     $stmt->execute();
    122.     $msgList = $stmt->fetchAll();
    123.    
    124.  
    125.     if (count($msgList) > 0) {
    126.         $lastMsgRow = end($msgList);
    127.         if ($lastMsgRow["msg_from_user_id"] === $msgToUserId && $lastMsgRow["msg_to_user_id"] === $userId && intval($lastMsgRow["is_msg_read"]) === 0) {
    128.             $updateAllMsgReadQuery = "UPDATE messages set is_msg_read=1,msg_read_date=NOW() where msg_from_user_id=:sentToUserID and msg_to_user_id=:userId and is_msg_read=0";
    129.             $stmt = $connection->prepare($updateAllMsgReadQuery);
    130.             $stmt->bindParam(':sentToUserID', $msgToUserId);
    131.             $stmt->bindParam(':userId', $userId);
    132.             $stmt->execute();
    133.            
    134.         }
    135.     }
    136. }
    137.  
    138. ?>
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    После размещения сообщения в БД надо делать редирект.