Failed PHP query using Jquery

0

I have a script in which a query is made using jquery, when executing it, it always gives me the error message. Js code:

var request = $.ajax({
    data: {nombre : document.getElementById("nombre").value, puntos : puntos},
    url: "conexion.php",
    method: "post",
    dataType: "json",
    success: function(data) {
        console.log(data[0]);
    /*rank = document.getElementById("ranking");
    rank.innerHTML = data;*/
    },
    error: function(data) {
        alert("Error en la consulta");
    }
});

PHP Code

@$conexion = mysqli_connect(HOST_DB, USER_DB, PASS_DB, NAME_DB);

if(!$conexion)
    die("Imposible conectar. Error número ".mysqli_connect_errno().":".mysqli_connect_error());

mysqli_set_charset($conexion, 'utf8');

if(isset($_POST["nombre"])){ 

    $consulta = "SELECT * FROM remus_bd_sudoku WHERE nombre = ".$_POST["nombre"];

    $resultado = mysqli_query($conexion, $consulta);

    if(!$resultado)
        die("No se ha realizado bien la consulta ".mysqli_errno($conexion).":".mysqli_error($conexion));

    $nums = mysqli_num_rows($resultado);
    mysqli_free_result($resultado);
    if($nums > 0){
        $arrRespuesta = array();
        //echo "El nombre indicado ya existe, prueba con otro.";
        mysqli_close($conexion); 
    }else{

        $consulta = "INSERT INTO remus_bd_sudoku (nombre, puntos) VALUES (".$_POST["nombre"].", ".$_POST["puntos"].")";

        $resultado = mysqli_query($conexion, $consulta);

        if(!$resultado)
            die("No se ha realizado bien la consulta ".mysqli_errno($conexion).":".mysqli_error($conexion));

        mysqli_free_result($resultado);

        $consulta = "SELECT * FROM remus_bd_sudoku ORDER BY puntos";

        $resultado = mysqli_query($conexion, $consulta);

        if(!$resultado)
            die("No se ha realizado bien la consulta ".mysqli_errno($conexion).":".mysqli_error($conexion));

            while ($fila = $resultado->fetch_assoc()) {
                $arrRespuesta[]=$fila;
            }
        /*$pos = 0;
        $vuelta = 0;    
        while ($fila = mysqli_fetch_array($result)){
            $vuelta++;
            if($fila[1] == $_POST["nombre"]){
                $pos = $vuelta;
                break;
            }
        }

        echo "Tu posición es la ".$pos;*/

        mysqli_free_result($resultado);
        mysqli_close($conexion); 


    }

}

$json = json_encode($arrRespuesta);
header('Content-Type: application/json; charset=utf8');
echo $json;

? >

    
asked by Darckan 08.11.2018 в 20:13
source

2 answers

0

Your code is written in a very confusing way. It would seem that it closes the connection when you could still need it. It is not consistent with the Ajax request, which expects a JSON, printing simple messages with die . It also does not evaluate if values were posted in puntos , being able to try the insertion of empty values in that case.

This response creates a coherent code that follows the program's flows, adding in each case content to a single output array that will be the only thing that will be printed as a JSON , which is what Ajax expects. This is a very frequent error when we work with Ajax: incoherence. Then the code does not work and it takes hours / days / weeks to figure out why.

PHP

<?php
    $conexion = mysqli_connect(HOST_DB, USER_DB, PASS_DB, NAME_DB);
    if(!$conexion) {
        $arrRespuesta["error"]="Imposible conectar. Error n&uacute;mero ".mysqli_connect_errno().":".mysqli_connect_error();
    }else{
        mysqli_set_charset($conexion, 'utf8');
        $nombre=(empty($_POST["nombre"])) ? NULL : $_POST["nombre"];
        $puntos=(empty($_POST["puntos"])) ? NULL : $_POST["puntos"];
        if($nombre && $puntos){ 
            $consulta = "SELECT * FROM remus_bd_sudoku WHERE nombre = '$nombre'";
            $resSelect = mysqli_query($conexion, $consulta);
            if(!$resSelect){
                $arrRespuesta["error"]="No se ha realizado bien la consulta ".mysqli_errno($conexion).":".mysqli_error($conexion);
            }else{          
                $nums = mysqli_num_rows($resSelect);
                mysqli_free_result($resSelect);
                if($nums > 0){
                    $arrRespuesta ["error"]= "El nombre indicado ya existe, prueba con otro.";
                }else{
                    $consulta = "INSERT INTO remus_bd_sudoku (nombre, puntos) VALUES ('$nombre',$puntos)";
                    $resInsert = mysqli_query($conexion, $consulta);
                    if(!$resInsert){
                        $arrRespuesta["error"]="No se ha realizado bien la consulta ".mysqli_errno($conexion).":".mysqli_error($conexion);
                    }else{
                        mysqli_free_result($resInsert);
                        $consulta = "SELECT * FROM remus_bd_sudoku ORDER BY puntos";
                        $resAll = mysqli_query($conexion, $consulta);
                        if(!$resAll){
                            $arrRespuesta["error"]="No se ha realizado bien la consulta ".mysqli_errno($conexion).":".mysqli_error($conexion);
                        }else{
                            while ($fila = $resAll->fetch_assoc()) {
                                $arrRespuesta[]=$fila;
                            }
                            mysqli_free_result($resAll);
                        }
                    }                               
                }
            }
        }else{ 
            $arrRespuesta ["error"]="Se postearon datos vacíos";
        }
        mysqli_close($conexion); 
    }
    $json = json_encode($arrRespuesta);
    header('Content-Type: application/json; charset=utf8');
    echo $json;
?>

Javascript

var request = $.ajax({
    data: {nombre : document.getElementById("nombre").value, puntos : puntos},
    url: "conexion.php",
    method: "post",
    dataType: "json",
    success: function(data) {
        if(data.error){
            //Elegir si mostrar en pantalla el mensaje de error o no
             console.log(data.error);
        }else{
            //Mostrar contenido normal venido del servidor 
            //Aquí conviene hacer también una lectura adecuada de data
            //y no un simple innerHTML=data ¡ ... !
            console.log(data);
            /*rank = document.getElementById("ranking");
              rank.innerHTML = data;*/
        }
    },
    error: function(jqXHR, textStatus, error) {
        alert("Error en la consulta: "+jqXHR.responseText);
    }
});
    
answered by 08.11.2018 в 21:33
0

I've already managed to solve the problem, there were many parts of the php that made erroneous queries JS code

data: {nombre : document.getElementById("nombre").value, puntos : puntos},
    url: "conexion.php",
    method: "post",
    dataType: "json",
    success: function(data) {
        if(data.length == 0){
            alert("El usuario introducido ya existe, prueba con otro");
        }else{
            rank = document.getElementById("ranking");
            for(var i = 0; i < data.length; i++){
               if (data[i]["nombre"] == document.getElementById("nombre").value) {
                   rank.innerHTML = "! Tu posición en el ranking es la " + i + " ¡";
               } 
            }
        }
    },
    error: function(data) {
        console.log(data);
    }
});

PHP Code

@$conexion = mysqli_connect(HOST_DB, USER_DB, PASS_DB, NAME_DB);
$arrRespuesta = array();

mysqli_set_charset($conexion, 'utf8');

if(isset($_POST["nombre"])){ 
    $nombre = $_POST['nombre'];
    $puntos = $_POST['puntos'];

    $consulta = "SELECT * FROM remus_bd_sudoku WHERE nombre = '".$_POST['nombre']."'";

    $resultado = mysqli_query($conexion, $consulta);

    $nums = mysqli_num_rows($resultado);

    if($nums == 0){
        mysqli_free_result($resultado);
        $consulta = "INSERT INTO remus_bd_sudoku (nombre, puntos) VALUES ('$nombre', '$puntos')";

        $resultado = mysqli_query($conexion, $consulta);

        $consulta = "SELECT * FROM remus_bd_sudoku ORDER BY 'puntos'";

        $resultado = mysqli_query($conexion, $consulta);

        $vuelta = 0;
        while ($fila = $resultado->fetch_assoc()) {
            $arrRespuesta[$vuelta] = $fila;
            $vuelta++;
        }

        mysqli_free_result($resultado);

    }

}

$json = json_encode($arrRespuesta);
header('Content-Type: application/json; charset=utf8');
echo $json;
    
answered by 08.11.2018 в 21:37