Consulta validación rut

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
794
Hola a todos!!

tengo este codigo que valida si el rut existe en la BD o no, si existe me muestra un msg, pero si no existe deberia bloquear el boton "guardar", pero no lo esta haciendo.... alguien cacha porque?

BOTON:
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<a href="index.php" class="btn btn-default">Regresar</a>
<button type="submit" class="btn btn-primary" id="guardar">Guardar</button>
</div>
</div>


VALIDACIÓN:

<
!-- Validacion "existe rut en a BS" -->
<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#rut').on('blur', function() {
$('#result-rut').html('<img src="images/loader.gif" />').fadeOut(1000);

var rut = $(this).val();
var dataString = 'rut='+rut;

$.ajax({
type: "POST",
url: "check_rut_paciente.php", // Archivo para consultar BD
data: dataString,
success: function(data) {
$('#result-rut').fadeIn(1000).html(data);
//si el usuario existe
// if(data > 0) {
// document.getElementById("guardar").disabled = true;
// }
}
});
});
});
</script>
<!-- Fin Validacion -->

La Validación y el botón están en la misma pagina.

check_rut_paciente.php
<?php
require 'conexion.php';
sleep(1);
if (isset($_POST)) {
$rut = (string)$_POST['rut'];

$result = $mysqli->query(
'SELECT * FROM pacientes WHERE rut = "'.strtolower($rut).'"'
);

if ($result->num_rows > 0) {
echo '<div class="alert alert-danger"><strong>Oh no!</strong> El paciente ya existe.</div>';
} else {
echo '<div class="alert alert-success"><strong>Exelente!</strong> El paciente no existe, ingreselo.</div>';
}
}


Si alguien me tira una mano para saber porque no funciona o si esta mal esa parte del cod ;)
 

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
303
Hola, no debes hacer un select de esa forma, te van a hacer una inyección SQL.
Has la consulta asi si usas mysqli.

PHP:
$sql = "SELECT * FROM pacientes WHERE rut = ?";
$statement = $mysqli->prepare( $sql );
$statement->bind_param( 's', $rut );
$statement->execute();
$result = $statement->get_result();

El método query se ocupa solo cuando tu query no requiere datos que vengan desde $_POST, $_GET, $_REQUESTS, de una variable de entorno, o de parámetros de consola.

Para el resto de consultas que requieren parámetros, se usan las prepared statements o sentencias preparadas. De ésta forma se evita que te metan datos que corrompen tu consulta sql.

Por ejemplo te podrían meter un drop database...

PD: me parece que te lo hemos mencionado en otras oportunidades.
 
Última modificación:
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.536
Estas cargando o insertando jquery en el orden adecuado? El orden de ejecución del código es relevante en estos casos.
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.536
El alert esta funcionando?
Prueba con .attr('disabled', true);
 
Última modificación:
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
303
Podrías implementar el parámetro statusCode del objecto que $.ajax recibe como parámetro, y enviar un 404 o un 200 desde PHP.

Algo así

Front
JavaScript:
$.ajax({
  ...
  statusCode: {
    200: function() {
        // Código para habilitar el botón
    },
    404: function() {
        // Código para deshabilitar el botón
    }
  }
});

Back
PHP:
// ...
$sql = "SELECT * FROM pacientes WHERE rut = ?";
$statement = $mysqli->prepare( $sql );
$statement->bind_param( 's', $rut );
$statement->execute();
$result = $statement->get_result();

// Envía el código HTTP al front
http_response_code( $result->num_rows == 0 ? 404 : 200 );
exit;

De ésta forma no necesitarías complicarte con el parámetro success, y le dejas la pega de mostrar los anuncios de error o success a Javascript. Lo único que tendrías que hacer es agregarles un style="display: none;" y mostrarlos dependiendo del código HTTP con jquery usando $("SELECTOR-CSS").show();

Y en el front los mensajes te quedarían así

Success
HTML:
<div class="alert alert-success" id="msg-success" style="display: none;">
    <strong>Exelente!</strong> El paciente no existe, ingreselo.
</div>

Error
HTML:
<div class="alert alert-danger" id="msg-error" style="display: none;">
    <strong>Oh no!</strong> El paciente ya existe.
</div>

Es otro enfoque, pero es mucho mas claro, y te permitiría reutilizar el archivo check_rut_paciente.php. También le agregaría validaciones a dicho archivo para evitar el flooding, es común que se usen bots para obtener listados de clientes en instituciones aprovechando que los devs no realizan ningún tipo de validación, entonces gracias al check_rut_paciente.php, se podría obtener un listado completo de pacientes con un bot sencillo que detectara el mensaje de éxito o error.
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
794
El alert esta funcionando?
Prueba con .attr('disabled', true);

Si, si ingreso un rut que ya eciste sale esto:
1676984317505.png


y si no existe:
1676984343893.png


Pero la idea es que si sale el mensaje en rojo el botón de guardar se bloquee,
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
303
Para que no sangren los ojos :circulos
JavaScript:
$(document).ready(function () {
    $('#rut').on('blur', function () {
        $('#result-rut').html('<img src="images/loader.gif" />').fadeOut(1000);

        var rut = $(this).val();
        var dataString = 'rut=' + rut;

        $.ajax({
            type: "POST",
            url: "check_rut_paciente.php", // Archivo para consultar BD
            data: dataString,
            success: function (data) {
                $('#result-rut').fadeIn(1000).html(data);
                //si el usuario existe
                // if(data > 0) {
                // document.getElementById("guardar").disabled = true;
                // }
            }
        });
    });
});

El mensaje se muestra porque lo que respondes desde PHP es HTML.
JavaScript:
$('#result-rut').fadeIn(1000).html(data);
Lo que hace ésta línea es tomar el HTML y ponerlo en el elemento #result-rut.

Pero tu deshabilitar botón nunca te va a funcionar si ejecutas una validación como la siguiente donde la variable data es un string:
JavaScript:
var data = '<div class="alert alert-success"><strong>Exelente!</strong> El paciente no existe, ingreselo.</div>';
if(data > 0) {
    console.log(data);
    // string > 0; // false
    // string < 0; // false
    // string <= 0; // false
    // string >= 0; // false
    // string == 0; // false
}

Data vendría siendo el response que te entrega el success de ajax en jquery, que es un string.
Un string nunca va a ser igual a un entero, ¿Entiendes a lo que me refiero?. No estamos hablando de un caracter x que de transfondo tiene una equivalencia ascii a un integer que por ser una letra tiene asignado un número mayor a 0.

Para que tu comparación funcione así como la muestras, tienes que buscar por una coincidencia de texto, algo como lo siguiente:

JavaScript:
var data1 = '<div class="alert alert-success"><strong>Exelente!</strong> El paciente no existe, ingreselo.</div>';
var data2 = '<div class="alert alert-danger"><strong>Oh no!</strong> El paciente ya existe.</div>';
var textoCoincidencia = 'El paciente no existe';
console.log(data1.indexOf(textoCoincidencia) > -1); // true
console.log(data2.indexOf(textoCoincidencia) > -1); // false

Ésto no es un buen enfoque, lo puedes hacer y te va a funcionar, pero no debieras hacerlo así.
Te recomiendo con mucho énfasis que tomes en cuenta las recomendaciones que te hice en los mensajes de mas arriba.

Edit: Ésta es una simulación de lo que estás haciendo según nos muestras en tu mensaje.

PHP
PHP:
<?php

echo '<div>Hola mundo</div>';

?>


Javascript con jquery
JavaScript:
$.ajax({
    type: "POST",
    url: "/",
    success: function (data) {
        console.log(data, typeof data);
        console.log(data > 0);
    }
});

Resultado

1676990881485.png


Y no importa lo que contenga el string que responsa el servidor, ya que la comparación siempre te va a dar false, independiente del contenido de la variable data.
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
794
Hola @freishner
si, si te entendí porque no funcionaba el bloqueo del boton por del entero y el string que estoy recibiendo del rut.... vale, veré como lo corrijo en base a lo que explicaste en el post anterior. :beersconf
 
Upvote 0
Subir