Make the page refresh and the message appear next

Asked

Viewed 825 times

5

Hello, How do I send a contact form for example, refresh the page and display the sending message?

Code: Javascript:

function showAlert(type, message)
{
    if (message !== '')
    {
        if (type === '')
        {
            type = 'success';
            type = 'danger';
            type = 'info';
            type = 'warning';
        }
        $('#alert').removeClass();
        $('#alert').addClass('alert alert-' + type).html(message).slideDown();
        setTimeout("closeAlert()", 15000);
}

$(function ()
{
    $('#alert').click(function ()
    {
        closeAlert();
    });
});

function closeAlert()
{
    $('#alert').slideUp();
    $('#alert').removeClass();
}

HTML:

<div id='alert'></div>

PHP:

echo "<script>
window.onload = function ()
{
showAlert('success', 'Perfil atualizado com sucesso.');
};
</script>";

Displaying the message in a different way, only it seems to me there are security holes in it if there is no way..
messages.php

<?php

if (isset($_GET['action']))
{
    $action = $_GET['action'];

    if($action=='registered')
    {
        echo '<div class="alert alert-success">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        <strong>Sucesso!</strong> avaliação cadastrada obrigado pela colaboração.
        </div>';
    }
}
?>

Then I’ll include the message where I want it:

include("/system/messages.php");

and call via _GET:

echo '<script language= "JavaScript">
location.href="?p=cadastro&action=registered";
</script>';

With that the invader can, for example, put a path from an external script in place of the variable: http://www.meusite.com.br/? p=http://sitedumal.net/deleta-banco.php Your site would include the file normally and run everything within it... The rest you can imagine.

Do it in a safe way:

// Define uma lista com os array que poderão ser chamados na URL
    $allowed = array($nomeUsuario, 'perfil-updated', 'perfil-updated-error');

 // Verifica se a variável $_GET['action'] existe E se ela faz parte da lista de arquivos permitidos
    if (isset($_GET['action']) AND (array_search($_GET['action'], $allowed) !== false))
    {
        $action = $_GET['action'];
        if($action=='perfil-updated')
        {
            echo '<div class="alert alert-success">
            <button type="button" class="close" data-dismiss="alert">&times;</button>
            <strong>Sucesso!</strong> Perfil atualizado.
            </div>';
        }
        if($action=='perfil-updated-error')
        {
            echo '<div class="alert alert-danger">
            <button type="button" class="close" data-dismiss="alert">&times;</button>
            <strong>Erro ao atualizar!</strong> Não foi possível atualizar o perfil.
            </div>';
        }
    }
    else
    {
// Se não existir variável $_GET ou ela não estiver na lista de permissões, define um valor padrão
        echo '<script language= "JavaScript">
        location.href="?p=profile&action='.$nomeUsuario.'";
        </script>';
    }

3 answers

7


I already gave +1 in the answer of Pro Hands, because I think it will be difficult to have simpler and objective solution than this.

I only posted a variant, so that it is clear to the author of the question how to avoid someone showing arbitrary messages (which would have no security risk, by the way).

Instead of sending the message through query, would pass her code only (you can do this by keeping the original redirect, to avoid duplicate submissions):

http://pagina.com/diretorio?msg=1

And in the $_GET part, you choose the message with the desired code:

 <?php
    // convertendo o GET para numero
    $msg = isset( $_GET["msg"] ) ? abs( intval( $_GET["msg"] ) ) : 0;

    // de acordo com o numero, mostramos a mensagem correspondente:
    if( $msg == 1 ) {
       echo 'Parabéns, você conseguiu!';
    } elseif ( $msg == 2 ) {
       echo 'Faltou preencher o campo recomendação';
    } elseif ( $msg == 3 ) {
       echo 'Já existe cadastro neste email';
    } else {
       // se o número da mensagem não for 1, 2 ou 3:
       echo 'Ocorreu um problema com a mensagem de retorno.';
    }
    ...

Of course there in your code you put how many elseif precise, and numbers the messages according to the actual case.


"Wiping" the code with array:

Instead of echo, you can just use one array with the values, making the code very short and easy to maintain:

    $msgs = array(
       'Ocorreu um problema com a mensagem de retorno.',  // 0
       'Parabéns, você conseguiu!',                       // 1
       'Faltou preencher o campo recomendação',           // 2
       'Já existe cadastro neste email'                   // 3
    );

    // pega a mensagem e converte em numero
    $msg = isset( $_GET["msg"] ) ? abs( intval( $_GET["msg"] ) ) : 0;

    // se for maior do que o numero de mensagens, usa a mensagem 0
    $msg = if( $msg > count( $msgs ) ? 0 : $msg );

    echo '<div class="mensagem">' . htmlentities( $msgs[$msg] ) . '</div>';


Applying styles

If you want to use different styles by message:

    $msgs = array(
       'Ocorreu um problema com a mensagem de retorno.',  // 0
       'Parabéns, você conseguiu!',                       // 1
       'Faltou preencher o campo recomendação',           // 2
       'Já existe cadastro neste email'                   // 3
    );

    $estilos = array(
       'vermelho-desastre',  // 0
       'verde-do-bem',       // 1
       'vermelho-erro',      // 2
       'vermelho-erro'       // 3
    );

    $msg = isset( $_GET["msg"] ) ? abs( intval( $_GET["msg"] ) ) : 0;
    $msg = if( $msg > count( $msgs ) ? 0 : $msg );

    echo '<div class="'.$estilos[$msg].'">'.htmlentities( $msgs[$msg] ).'</div>';

6

A simple way is using $_GET with the message (encoding it to the URL) on the page.

Example:

"http://pagina.com/diretorio?msg=Hello2F%Welcome"

Then echo into $_GET["msg"] if it exists, wherever you want.

It would be something like this:

<div class="_dTC">
    <div class="_vAM">
        <?php
        if(isset($_GET["msg"])){
            echo $_GET["msg"];
        }
        ?>
    </div>
</div>
  • Yes, via _GET I managed to do, only it has gives security problems to the site

  • I edited my post, please take a look

  • 2

    Basically, all kinds of methods you use will result in the same. Anyone can post something to the URL or create a cookie. To avoid this "insecurity" you must use conditions if to check if such a thing is incorrect, if it is various or if it already exists. I hope it is useful to you.

3

Save a cookie flag and check if it exists.

This technique is also useful to prevent duplicate submissions. However, we will not address here the rules for blocking duplicate sending.

Example of technique using Javascript only

function createCookie(name, value, days) {
    var date, expires;
    if (days) {
        date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

if (document.cookie.indexOf("updated") >= 0) {
    alert("ok, foi atualizado");

    // Remove o cookie
    createCookie("updated", 1, -1);
}else{
    // Cria o cookie
    createCookie("updated", 1, 1);
}

If you are using Google Chrome, you can check the execution by "Developer tools" -> Resources -> Cookies

In this image, it is the initial state when the cookie was generated:

inserir a descrição da imagem aqui

Give a new refresh and then the alert will appear. This happens because at this time the cookie exists.

inserir a descrição da imagem aqui

Click OK to close the alert. Note that in Veloper tools the cookie has been removed.

inserir a descrição da imagem aqui

A more real example with PHP and HTML

This is the PHP script where you receive data from a form. Let’s call it "tmp.php"

// Recebeu de um formulário, fez as firulas que tinha que fazer e agora está setando o cookie:
if (isset($_GET['foo']))
{
    $cookie_name = 'updated';
    $cookie_value = 1;
    setcookie($cookie_name, $cookie_value, time() + (86400 * 30), '/'); // 86400 = 1 day

    /**
    Isso é necessário quando precisar acessar o cookie na corrente sessão pelo PHP pois a função setcookie() não atualiza os headers. 
    Caso não necessite, apenas remova ou comente a linha abaixo.
    */
    $_COOKIE[$cookie_name] = $cookie_value;
}

/**
Aqui pode fazer um include ou um header(location:...)
Um include consumirá menos em requisições, mas consumirá mais memória pois o PHP vai parsear o arquivo incluso.
Utilize o que for conveniente para o seu caso.
*/
include 'tmp.html';

//header("location: http://localhost/tmp.html");

This is the HTML page containing the form and a cookie checker. Let’s call "tmp.html"

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test</title>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript">

function createCookie(name, value, days) {
    var date, expires;
    if (days) {
        date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

if (document.cookie.indexOf("updated") >= 0) {
    alert("ok, foi atualizado");

    // Remove o cookie
    createCookie("updated", 1, -1);
}
</script>


</head>
<body>

<form action="tmp.php" method="get">
<input type="hidden" name="foo" value="1" />
<input type="submit" value="enviar" />
</form>

</body>
</html>

To test, go to the HTML page. Example: http://localhost/tmp.html

Press the "send" button. It will be directed to http://localhost/tmp.php?foo=1 where Javascript will verify that the cookie exists, will issue the Alert() and then remove the cookie.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.