Erro ao utilizar Ajax com Jquery

Para praticar requisições assíncronas eu estou criando um formulário simples para cadastrar os dados no banco, o porém é que o script abaixo está entrando no “error” exibindo a mensagem na tela de “Erro” ao invés de “Usuário Cadastrado”. Mas o objeto é cadastrado normalmente no banco de dados.

$(document).ready(() =>{
				$('#enviado').on('click', e =>{
					e.preventDefault()

					let dados = $('form').serialize()
					
					$.ajax({
						type: 'POST',
						url : 'app.php',
						data : dados,
						dataType : 'json',
						success : dados => {
							$('#resultado').html('Usuário Cadastrado')
						},
						error : erro => {
							$('#resultado').html('Erro')
						}
					})
				})
			})

Reusltado na tela
Captura de tela de 2022-01-29 11-40-56

Script completo

app.php

<?php

class Usuario{

	public $id;
	public $nome;
	public $idade;
	public $sexo;


	public function __get($atributo){
		return $this->$atributo;
	}

	public function __set($atributo, $valor){
		$this->$atributo = $valor;
	}
}

class Conexao{

	private $url = 'mysql:host=localhost;dbname=cadastro';
	private $usuario = 'root';
	private $senha = 'root';

	public function conectar(){

    try{

		$conexao = new PDO($this->url, $this->usuario, $this->senha);

		$conexao->exec('set charset utf8');

		return $conexao;

	}catch (PDOException $e){

		echo $e.getMessage();

	}

	}
}

class Servico{

	private $conexao;

	public function __construct(Conexao $conexao){
		$this->conexao = $conexao->conectar();

	}

	public function cadastrarUsuario(Usuario $usuario){

		$query ='insert into usuario(nome, idade, sexo)values(:nome,:idade,:sexo)';
		$stmt = $this->conexao->prepare($query);
		$stmt->bindValue(':nome', $usuario->__get('nome'));
		$stmt->bindValue(':idade', $usuario->__get('idade'));
		$stmt->bindValue(':sexo', $usuario->__get('sexo'));
		$stmt->execute();
		echo 'Usuário cadastrado com sucesso!';

	}

	public function removerUsuario($usuario){

		$query = 'delete from usuario where id = :id';
		$stmt = $this->conexao->prepare($query);
		$stmt->bindValue(':id', $usuario->__get('id'));
		$stmt->execute();
		echo 'Usuário excluído com sucesso!';
	}

        
}
	
	$usuario = new Usuario();
	$usuario->__set('nome', $_POST['nome']);
	$usuario->__set('idade', $_POST['idade']);
	$usuario->__set('sexo', $_POST['sexo']);

	$conexao = new Conexao();
	$servico = new Servico($conexao);

	$servico->cadastrarUsuario($usuario);

	//$servico->removerUsuario($usuario);

	echo json_encode($usuario);

?>

formulario.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Formulário</title>
</head>

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>	
<script>
$(document).ready(() =>{
				$('#enviado').on('click', e =>{
					e.preventDefault()

					let dados = $('form').serialize()
					
					$.ajax({
						type: 'POST',
						url : 'app.php',
						data : dados,
						dataType : 'json',
						success : dados => {
							$('#resultado').html('Usuário Cadastrado')
						},
						error : erro => {
							$('#resultado').html('Erro')
						}
					})
				})
			})
</script>
<body style="margin-bottom: 200px;padding: 16px;">
	<form>
		<fieldset class="border p-2">
			<legend class="w-auto">Cadastro</legend>
		<div class="form-group">
			<label for="nome">Nome:</label>
			<input class="form-control w-25" type="text" id="nome" name="nome" placeholder="Nome">
		</div>
		<div class="form-group">
			<label for="nome">Idade:</label>
			<input class="form-control w-25" type="text" id="idade" name="idade" placeholder="Idade">
		</div>
		<div class="form-group">
			<label for="nome">Sexo:</label>
			<input class="form-control w-25" type="text" id="sexo" name="sexo" placeholder="sexo">
		</div>

		<input class="btn btn-outline-success" type="submit" id="enviado" name="enviar" value="Enviar">
		</fieldset>
	</form>
	<br>
	<div id="resultado">
		Resultado
	</div>
</body>
</html>

Vc consegue ver qual é o erro que está chegando?

error : erro => {
  // coloque para imprimir a variável "erro" aqui
  $('#resultado').html('Erro')
}

Quando tento imprimir o erro na div que contém o resultado não é retornado nada. No console.log é retornado isso:

Esse console.log é do callback de erro?

Isso mesmo!

Nâo sei muito de PHP, mas acho que o problema é que sua requisição está esperando um JSON como retorno, e vc está fazendo echo num texto plano (que é a mensagem Usuário cadastrado com sucesso!) e em um JSON (que é os dados do usuário cadastrado).

Vc deve ajustar seu app.php para devolver apenas json, senão o parse da resposta esperada pela requisição (JSON) não vai funcionar.

1 curtida

Seu comentário me fez encontrar o erro. Como você mesmo falou, o app.php deveria devolver apenas JSON. Excluindo o echo do método de cadastrar foi a solução. Obrigado pela ajuda! :wink:

Captura de tela de 2022-01-29 14-39-21

1 curtida