entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

sentencia INSERT no se ejecuta bien

Hola tengo un formulario que envia un titulo, un contenido y una imagen.
En el php hago este simple INSERT a la tabla noticias de la bd y la primera vez funciona perfectamente, pero cuando intento añadir mas noticias no las guarda.

case 5: 
    $imagen=cargarImagen();
    $data = array('titulo' => "'".$_POST['titulo']."'" , 'autor'=> "'".$_SESSION['user']."'", 'contenido'=> "'".$_POST['contenido']."'", 'fecha' => "'".date('Y-m-d')."'", 'imagen' => "'".$imagen."'" );
    $res=$gdb->prepare("INSERT INTO noticias (titulo, autor, contenido, fecha, img) VALUES (:titulo, :autor, :contenido, :fecha, :imagen)");
    if(!$res->execute($data)){
        echo "Execute failed";
    }

break;

Si alguien me pudiera decir por que la setencia solo se ejecuta la primera vez ? gracias. Los datos del formulario si llegan bien, lo he comprobado.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Obtenés algún mensaje de error de la DB? Cuál?

Estás probando con los mismos datos o hacés alguna variación? Qué datos son lo que usás para las pruebas? Podría ser un problema de comillas en el contenido que rompa la query? Copiá y pegá el contenido de un var_dump($data) para ver qué se recibe.

Envíanos también la estructura de la tabla, no sea cosa de que, por ejemplo, tengas el título como clave primaria y la query esté fallando por la clave duplicada, o el autor sea una referencia inconsistente a una clave foránea por ejemplo.

También sería de utilidad saber que biblioteca estás usando para las conexiones y querys, para saber qué consulta genera realmente el método execute() cuando recibe el array.

Seguimos!

0voto

midnightnymph comentado

Hola estoy utilizando PDO. He comprobado la estructura de la tabla y la clave primaria es un ID, no puedo subir la imagen pero la unica clave primaria es el id, que es Auto Increment y por tanto cuando hago el INSERT no lo especifico.
Este es el formulario que envio:

<form action="service.php" method="post" enctype="multipart/form-data">
        <div class="error"></div>
        <div class="form-group"><label class="control-label" for="titulo">Titulo</label><input id="titulo" type="text" name="titulo" class="input-lg form-control" placeholder="Titulo de la noticia"></div>
        <div class="form-group"><label class="control-label" for="contenido">Contenido</label><textarea id="contenido" name="contenido" class="form-control" rows="6"></textarea></div>
        <div class="form-group"><label for="imagen" class="control-label">Subir Imagen</label><input id="imagen" name="imagen" type="file" class="input-lg form-control"></div>
        <div class="btn-group btn-group-lg" role="group">
            <button type="submit" class="signin btn btn-default">Enviar</button>
            <button id="volver" type="button" class="signin btn btn-default">Volver</button>
        </div>
    <input type="hidden" value=5 name="option">
    </form>

Y este es TODO el PHP, pero la parte de codigo que hace esto es el case 5, lo demas son para otras respuestas con ajax.

<?php 
sessionstart();
requireonce "functions.php";
try {
$gdb = new PDO("mysql:host=127.0.0.1;dbname=blog", "root", "");

} catch (PDOException $e) {
echo "

";
}
switch ($REQUEST['option']) {
case 1: //pasa los datos de la tabla noticias a formato json
$sentencia="SELECT * FROM noticias";
$res=$gdb->query($sentencia);
$salida = "[";
while ($row=$res->fetch()) { //array de objetos JSON
if ($salida != "[") {$salida .= ",";}
$salida .= '{"titulo":"' . $row["titulo"] . '",';
$salida .= '"autor":"' . $row["autor"] . '",';
$salida .= '"fecha":"' . $row["fecha"] . '",';
$salida .= '"img":"' . $row["img"] . '",';
$salida .= '"contenido":"'. $row["contenido"] . '"}'; 
}
$salida.="]";
echo $salida;
break;
case 2: 
$sentencia="SELECT * FROM usuarios WHERE user='".$GET['user']."' AND password='".$GET['passwd']."'";
if($res=$gdb->query($sentencia)){
if($res->fetchColumn()>0){
$SESSION['user']=$_GET['user'];
echo "1";
}else{
echo "0";
}
    }

break;
case 3:
    echo $_SESSION['user'];

break;
case 4:
    session_destroy();
break;
case 5: 
    $imagen=cargarImagen();
    $data = array('titulo' => "'".$_POST['titulo']."'" , 'autor'=> "'".$_SESSION['user']."'", 'contenido'=> "'".$_POST['contenido']."'", 'fecha' => "'".date('Y-m-d')."'", 'imagen' => "'".$imagen."'" );
    $res=$gdb->prepare("INSERT INTO noticias (titulo, autor, contenido, fecha, img) VALUES (:titulo, :autor, :contenido, :fecha, :imagen)");
    if(!$res->execute($data)){
        echo "Execute failed";
    }

break;
}

$gdb=null;

?>

Lo que pasa es que agrego una nueva noticia la primera vez y todo lo recoge perfecto, pero intento agregar despues mas noticias y no se guardan en la base de datos. El execute() me falla y no se como capturar el error para ver cual es, lo he intentado con ->error y no lo reconoce. en fin. Este es el var_dump de data :

array(5) { ["titulo"]=> string(6) "'hola'" ["autor"]=> string(8) "'prueba'" ["contenido"]=> string(14) "'hola que tal'" ["fecha"]=> string(12) "'2015-03-06'" ["imagen"]=> string(35) "'Hello-Kitty-Desktop-Wallpaper.jpg'" }

Como puedes ver los datos se envian correctamente, algo falla en el execute o al preparar la sentencia...

Muchas gracias por la respuesta

0voto

Leonardo-Tadei comentado

Usando PDO podés obtener los errores con los métodos errorCode() y errorInfo()

http://php.net/manual/en/pdo.errorinfo.php
http://php.net/manual/en/pdostatement.errorcode.php

hay varios ejemplos en el manual tanto para PDO como para PDOStatement

Luego de obtenido el error, si lo copiás y pegás acá podemos seguir viendo qué pasa.

Saludos!

0voto

rach Puntos6010

en la tabla donde guardas tus datos tienes un id? si es así, fíjate que este auto incremente

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta