Porque o comando alert não está funcionando no php?

Eu tenho um código php que verifica se já existe um usuário no banco de dados

$email = $_POST['email'];

$result = mysqli_query($conexao, "SELECT * FROM usuarios WHERE Email = '{$email}'") or print mysql_error();
 
        #Se o retorno for maior do que zero, diz que já existe um.
        if(mysqli_num_rows($result)>0) {
            echo '<script>
                    document.querySelector("#pagamento").style.display = "none";
                    alert("Este email já existe porfavor coloque outro.");
                </script>';
        }

Porém quando o código é executado não acontece nada mesmo se o usuário já existe
queria que vocês pudessem me ajudar

Ps:Lembrando que o código fica nas primeiras linhas.

Aparece algum erro no console do navegador?

Então provavelmente esse é o problema. Se está no início, ele tenta rodar o querySelector antes que o restante da página esteja carregado. Ou seja, ele está tentando buscar um elemento que ainda não existe.

Veja no console do browser (aperte F12), provavelmente vai ter algum erro (eu chutaria que é algo como “TypeError: Cannot read properties of null (reading ‘style’)”).

Uma maneira de resolver é fazer com que este código só rode depois que a página for carregada, pois aí o elemento já existirá:

echo '<script>
        document.addEventListener("DOMContentLoaded", function() {
            document.querySelector("#pagamento").style.display = "none";
            alert("Este email já existe porfavor coloque outro.");
        });
      </script>';

No caso, o evento DOMContentLoaded é acionado depois que o HTML da página foi carregado.


Não diretamente relacionado, mas evite concatenar os valores diretamente na query, pois isso deixa a aplicação vulnerável a ataques de SQL Injection.

Uma forma simples de evitar SQL Injection é usar prepared statements. Assumindo que a variável $conexao é o retorno de um mysqli_connect, seria algo assim:

$stmt = $conexao->prepare("SELECT * FROM usuarios WHERE Email = ?");
if(!$stmt){
    echo 'erro na consulta: '. $conexao->errno .' - '. $conexao->error;
}
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->store_result(); // necessário para obter o num_rows abaixo
if ($stmt->num_rows > 0) {
    // já existe
}

// ou, se quiser usar o result
$results = $stmt->get_result();
while ($result = $results->fetch_assoc()) {
    // faz algo com $result
}

$stmt->close();
1 curtida

Não

Não estava aparecendo nenhum erro, quando eu olhava a rede no devtools ele recebia o script o problema é que o script não está rodando.

Bom, no teste que fiz aqui funcionou. Sugiro que tente isolar o problema removendo o código desnecessário.

Por exemplo, tire toda essa parte do MySQL e deixe somente echo '<script>alert('oi')</script>'. Se não rodar, veja se aparece algo no console, ou na aba Network pra ver o que foi retornado (veja no código fonte da página se veio esse script). E se rodar, vc sabe que o problema deve estar em outro lugar (provavelmente no querySelector, por exemplo).

Sem ver o exemplo completo (HTML, o que foi digitado para testar, etc), é o que dá pra sugerir…

<script>
                    alert("Este email já existe porfavor coloque outro.");
            </script>

Aparece isto na área de resposta

Tambem o email está sendo enviado via ajax no método que você havia me mostrado anteriormente.

Ah, se vc está usando AJAX, não vai funcionar assim. Vc está adicionando elementos no HTML, mas ele só roda se o HTML for carregado. Mas se usa AJAX, ele não vai carregar o HTML todo novamente (esse é o propósito do AJAX, aliás).

Em vez disso, coloque o alert no código JS que pega a resposta do AJAX.

Me desculpe, eu sou novo na área do ajax se puder me explicar um pouco melhor.

Coloque o código que faz a chamada AJAX

function enviarDadosForm(event) {

            event.preventDefault();

            var url = "a_crianca_e_o_mundo_da_literatura_form.php";

            fetch(url, {

                method: 'POST',

                // ATENÇÃO: vc pode passar o elemento "form" diretamente, que ele envia todos os campos

                body: new FormData(document.querySelector('#form_de_inscricao'))

            })

        }

Aqui

Bom, nesse caso, como eu já disse, o AJAX não vai recarregar o HTML, e portanto não vai rodar o que está na tag script.

Portanto, a abordagem tem que ser diferente. Minha sugestão:

Primeiro, vc tem que mudar o PHP para retornar somente a quantidade de registros encontrados. Algo como:

$result = // executa a query
// PHP retorna somente a quantidade de registros encontrados
echo mysqli_num_rows($result);

E no JavaScript vc verifica a quantidade retornada

fetch(url, {
    method: 'POST',
    body: new FormData(document.querySelector('#form_de_inscricao'))
})
.then(response => response.text())
.then(valor => {
    // verifica o valor que o PHP retornou
    if (valor > 0) {
        alert('já existe');
    } else {
        // não existe, faz o que precisar aqui...
    }
});

(! ) Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, object given in C:\wamp64\www\TesteFormJr\testeForm.php on line 43

Está aparecendo este erro

coloquei o código assim

$result = $conexao->prepare("SELECT * FROM usuarios WHERE Email = ?");
        if(!$result){
            echo 'erro na consulta: '. $conexao->errno .' - '. $conexao->error;
        }
        $result->bind_param('s', $email);
        $result->execute();
        $result->store_result(); // necessário para obter o num_rows abaixo
        if ($result->num_rows > 0) {
            // já existe
            echo mysqli_num_rows($result);
        }

       fetch(url, {
                method: 'POST',
                body: new FormData(document.querySelector('#form_de_inscricao'))
            })
            .then(response => response.text())
            .then(valor => {
                // verifica o valor que o PHP retornou
                if (valor > 0) {
                    alert('já existe');
                } else {
                    // não existe, faz o que precisar aqui...
                }
            });

Nesse caso tire o if e deixe apenas:

echo $result->num_rows;

Ok

Ele retornou o número 1 mas não deu o alert

Desculpa se estou tomando muito de seu tempo.

Olha, não sei o que pode estar errado, mas é algum detalhe que vc fez aí.

Aqui eu fiz assim, tem um HTML:

<form id="myForm" method="POST">
    ... alguns campos input type="text" etc e esse botão abaixo:
    <input type="button" id="ok" value="OK">
</form>

Nesse mesmo HTML também tem o JavaScript que chama o PHP:

// ao clicar no botão, chama o PHP via AJAX
document.querySelector('#ok').addEventListener('click', function() {
    fetch('teste.php', { // estou chamando o teste.php, TROQUE PELO SEU ARQUIVO PHP
        method: 'POST',
        body: new FormData(document.querySelector('#myForm'))
    })
    .then(response => response.text())
    .then(valor => {
        console.log(valor); // só pra ver o valor que voltou, mas pode tirar depois se quiser
        if (valor > 0) {
            alert('já existe');
        } else {
            alert('não existe');
        }
    });
});

Repare que o fetch está chamando o PHP (que por sua vez está em outro arquivo, no meu caso é o criativo nome de teste.php).

E no arquivo teste.php tem o código que consulta o banco e retorna a quantidade de linhas:

//mysql etc...
echo $result->num_rows;

E só. Aqui funcionou, eu clico no botão, ele executa o fetch, que por sua vez chama o PHP, que retorna o número, e volta para o JS, que verifica o número retornado e dá o alert.

Não sei o que está errado no seu, então vou dar outra dica: sempre que vc muda algo no seu código e diz que não funcionou, tem que dar mais detalhes, senão ninguém tem como adivinhar o que está acontecendo (por exemplo, se dissesse desde o início que está usando AJAX, eu não teria escrito este post - foi um grande chute, porque eu não sabia que estava usando AJAX).

Tem que falar exatamente o que vc mudou no código, como está testando, qual mensagem de erro que deu e/ou como o programa se comportou. Por exemplo, aqui vc colocou o código PHP e JS tudo junto. Eu presumo que eles não estejam juntos, certo? Se estiverem exatamente assim, não vai funcionar mesmo.

Tente separar da forma que eu fiz acima. E se não funcionar, dê mais detalhes do que vc fez, como testou, e qual foi o erro (mensagens no console, o que exatamente o programa fez, etc). Assim todo mundo que ler consegue testar e tentar descobrir o erro.

Ok, obrigado

Separei como você indicou funcionou direitinho, mas teria algum jeito para não presisar separar o php do html e javascript?

Nesse caso acho que não, porque o PHP precisa retornar uma informação bem específica (o número), e somente essa informação.

Mas eu não acho ruim separar, cada arquivo tem sua responsabilidade e fica mais organizado. Claro que cada caso é um caso, mas a princípio não vejo problemas.


Um jeito de não precisar separar seria não usar AJAX. Aí nesse caso o PHP teria que retornar o echo '<script>etc... mais todo o HTML.