Problem with insertion of multiple notifications

2

Good evening.

I have a notification system where users receive notifications from users of whom they are following. For example, " John commented on x posts " and is working when, for example, there is only one follower. The problem is when the person has more than one follower where the same notification has to be sent to all the users he is following.

Table notificacoes :

CREATE TABLE IF NOT EXISTS 'notificacoes' (
'notificacao_id' int(11) NOT NULL AUTO_INCREMENT,
'user_id' int(11) NOT NULL,
'user_destino_notificacao' int(11) NOT NULL,
'notificacao' varchar(500) COLLATE utf8_unicode_ci NOT NULL,
'tipo' varchar(500) COLLATE utf8_unicode_ci NOT NULL,
'data' datetime NOT NULL,
PRIMARY KEY ('notificacao_id')
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ;

Table notificacoes_visualizacao :

CREATE TABLE IF NOT EXISTS 'notificacoes_visualizacao' (
'id_notificacao' int(11) NOT NULL,
'id_usuario_que_visualizou' int(11) NOT NULL,
PRIMARY KEY ('id_notificacao','id_usuario_que_visualizou'),
KEY 'fk_notificacao_visualizacao_usuario' ('id_usuario_que_visualizou')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

PHP Code:

   <?php

    header('Cache-Control: no-cache, must-revalidate'); 
    //Alteramos o cabeçalho para que o retorno seja do tipo JSON 
    header('Content-Type: application/json; charset=utf-8');

    session_start();

    require_once("../funcoes/funcoes.php");

    $user_actual = $_REQUEST['user_logado'];


    $result_notificacoes = $conexao->prepare("SELECT * FROM notificacoes as noti 
                                        LEFT JOIN notificacoes_visualizacao as noti_vi ON noti_vi.id_notificacao = noti.notificacao_id
                                        INNER JOIN users_social as user ON user.id = noti.user_id
                                        WHERE noti.user_id IN (SELECT seg.followed FROM seguidores as seg WHERE seg.follower = :user_actual) 
                                        AND noti_vi.id_usuario_que_visualizou is NULL 
                                        OR noti.user_destino_notificacao = :user_atual2");                                  

    $result_notificacoes->bindParam(':user_actual', $user_actual, PDO::PARAM_INT);
    $result_notificacoes->bindParam(':user_atual2', $user_actual, PDO::PARAM_INT);
    $result_notificacoes->execute();


    $return = array();

    $notificacoes = $result_notificacoes->fetchAll(PDO::FETCH_ASSOC);

    foreach ($notificacoes as $row_notificacoes) {

    // MOSTRA TEMPO DO POST

    $data_actual = date('Y-m-d H:i:s');

    $data = strtotime($row_notificacoes['data']);

    $data_post = strtotime($data_actual) - $data;

    switch (post_data) {
        // Segundos
        case ($data_post < 60):
            $count = $data_post;
            if($count == 0)
                $count = "Agora mesmo";
            elseif ($count == 1)
                $suffix = "segundo atrás";
            else
                $suffix = "segundos atrás";
        break;
        // Minutos
        case ($data_post > 60 && $data_post < 3600):
            $count = floor($data_post/60);
            if($count == 1)
                $suffix = "minuto atrás";
            else
                $suffix = "minutos atrás";
        break;
        // Horas
        case ($data_post > 3600 && $data_post < 86400):
            $count = floor($data_post/3600);
            if($count == 1)
                $suffix = "hora atrás";
            else
                $suffix = "horas atrás";
        break;
        // Dias
        case ($data_post > 86400 && $data_post < 2629743):
            $count = floor($data_post/86400);
            if($count == 1)
                $suffix = "dia atrás";
            else
                $suffix = "dias atrás";
        break;
        // Meses
        case ($data_post > 2629743 && $data_post < 31556926):
            $count = floor($data_post/2629743);
            if($count == 1)
                $suffix = "mês atrás";
            else
                $suffix = "meses atrás";
        break;
    }       

    $sql = $conexao->prepare("INSERT INTO notificacoes_visualizacao (id_notificacao, id_usuario_que_visualizou) VALUES (:id_notificacao, :id_usuario_que_visualizou)");
    $sql->bindParam(':id_notificacao', $row_notificacoes['notificacao_id'], PDO::PARAM_INT);
    $sql->bindParam(':id_usuario_que_visualizou', $user_actual, PDO::PARAM_INT); 
    $sql->execute();

    $return[] = '
        <table border="0" class="barra_notificacoes" cellpadding="0" cellspacing="0">
            <tr>
                <td valign="top" width="10%">
                    <div style="margin-left: 4px; margin-top: 5px;"><img width="50" height="50" src="'.$row_notificacoes['user_foto'].'"></div>
                </td>
                <td valign="top" width="50%">
                    <div style="margin-left: 5px; margin-top: 2px;"><a href="users/'.$row_notificacoes['slug'].'">'.$row_notificacoes['fb_nome'].'</a></div>
                    <div style="margin-left: 5px;" class="comentario_user">'.$row_notificacoes['notificacao'].'</div>
                    <div style="margin-left: 5px;" class="tempo_do_post">'.$count.' '.$suffix.'</div> 
                </td>
            </tr>
        </table>
        ';                  
}
echo json_encode($return); 
?>
    
asked by anonymous 16.03.2015 / 02:34

0 answers