1

Tengo el siguiente código: HTML formulario:

<form name="data" id="insert">
    <input type="text" name="nombre[]" value="">
    <input type="text" name="telefono[]" value="">
    <input type="text" name="apellido[]" value="">
    <input type="text" name="direccion[]" value="">
    <input type="hidden" name="id[]" value="">
    <input type="submit" id="btn_insert" value="Guardar">
</form>

Script

$(document).ready(function(){
    $("#insert").submit( function () {    
        $.post(
               'insertar.php',
               $(this).serialize(),
               function(data){
                   $("#resultado").html(data)
               }
        );
        return false;   
    });   
});

Archivo Insertar.php

$id=$_POST['id'];

for($i=0;$i<count($id);$i++){
    $q="INSERT INTO tabla (nombre, telefono, apellido, direccion) VALUES ('".$_POST['nombre'][$i]."','".$_POST['telefono'][$i]."','".$_POST['apellido'][$i]."','".$_POST['direccion'][$i]."') "; 
    $result = $conexion->query($q);
}
if ($conexion->query($sql) === TRUE) {
   echo "Insertado exitosamente";
} else {
    echo "Hubo un error ". $conn->error;
}

$conn->close();

El problema es que me genera que hubo una inserción exitosa pero no me inserta nada, ¿qué puedo estar haciendo mal?

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
Alexander Quiroz
  • 602
  • 1
  • 7
  • 18
  • los datos llegan a insertar.php? – userStack Feb 15 '17 at 02:27
  • 1
    entiendo que llegan ya que me generaría un error lo que no entiendo por que no los inserta es como si me enviase datos vacios, voy a revisar para estar seguro... – Alexander Quiroz Feb 15 '17 at 02:56
  • Si tienes un solo formulario, con un identificador, y tienes x campos, cada uno con sus nombres, por que en el archivo insertar.php recorres `count($id)` por que no simplemente envias el formulario, y en al ingresar, solo ingresas el valor del POST (del formulario) en la tabla? – jolsalazar Feb 15 '17 at 03:51
  • ¿La tabla en la que se insertan los datos se llama `tabla` o es sólo un ejemplo que has puesto? – Alvaro Montoro Feb 15 '17 at 04:26
  • 2
    De donde sale $sql?. Haces insert con $q y luego usas $sql – Jose Javier Segura Mar 04 '18 at 08:52

3 Answers3

1

El código que compartes presenta varios problemas:

  1. Es vulnerable a ataques de inyección SQL: esto realmente no afecta a la funcionalidad de tu PHP, pero es un grave problema de seguridad que deberías solucionar cuanto antes. No deberías usar consultas dinámicas sino sentencias preparadas.

  2. En algunos sitios haces referencia a la conexión como $conexion en otros como $conn: aunque esto no debería ser el problema porque $conn sólo se usa cuando ocurre un fallo y según indicas en la pregunta, el problema es que te dice que hubo una inserción exitosa pero realmente no inserta nada.

  3. Estás ejecutando código SQL indefinido: por un lado estás ejecutando la inserción y guardando el resultado en $result con:

    $result = $conexion->query($q)
    

    pero a la hora de mostrar el mensaje de error, no usas el $result sino que ejecutas una nueva consulta:

    if ($conexion->query($sql) === TRUE) 
    

    y esa consulta es $sql, que no está definida en ningún sitio en el código de la pregunta y que podría ser cualquier cosa. Lo que sea esa consulta, el resultado es válido y por eso muestra el mensaje de insertado correctamente, pero realmente ese mensaje no se corresponde con el código de inserción.

Arregla esos problemas y comprueba si sigue ocurriendo el error.

Alvaro Montoro
  • 48,157
  • 26
  • 100
  • 179
0

Yo lo que hago es algo más o menos así

 $supp = $_POST["suppliers"];
 $query  = "INSERT INTO tabla (campo1,campo2,campo3) VALUES ";
        $i = 0;
        $x = count($supp)-1;
        foreach ($supp as $value) {
            $query .= "('$user','$value','$id')";
            if($i<$x){
                $query .= ", ";
            }
            $i++;
        }
        $query = mysqli_query($connect,$query);

suponiendo que $_POST["suppliers"] proviene de una lista multiple.

La ventaja de usarlo así es que haces la insercción en una sola consulta a diferencia de como lo tienes que genera una consulta en cada iteración del ciclo, lo cual es más lento.

por cierto, ".$_POST['direccion'][$i].", esto lo puedes simplificar así: {$_POST['direccion'][$i]} De esta manera en vez de abrir y cerrar comillas y concatenar con punto solo lo encierras entre llaves {}

0

Doy por supuesto que los errores en los nombres de las variables se deben al hecho de que no posteas tu código real.

Dicho esto, prueba usando

$conn->exec ($sql);

Puesto que query es sólo un método de comodidad para sentencias de lectura.

Ojo con las inyecciones sql en ese código.

ffflabs
  • 21,223
  • 25
  • 48