Foros del Web » Programando para Internet » PHP »

cómo insertar en un campo de llave foránea

Estas en el tema de cómo insertar en un campo de llave foránea en el foro de PHP en Foros del Web. tengo dos tablas (usuarios y posts) relacionadas entre sí por llave primaria y foránea de la siguiente manera usuarios id|usuario|passwd posts id|titulo|id_usuarios|post|fecha la relación es ...
  #1 (permalink)  
Antiguo 08/05/2013, 01:03
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
cómo insertar en un campo de llave foránea

tengo dos tablas (usuarios y posts) relacionadas entre sí por llave primaria y foránea de la siguiente manera

usuarios

id|usuario|passwd

posts

id|titulo|id_usuarios|post|fecha

la relación es el id de usuarios (tipo int, primaria y auto-incrementable) con el id_usuarios(llave foránea y de tipo index) de posts.

para insertar un nuevo post hago lo siguiente con este código (comentado)

Código PHP:
Ver original
  1. if(isset($_SESSION['usuario'])) //si no existe sesión de usuario no muestra form para enviar nuevo post
  2.         {
  3.             if(isset($_POST["enviar_post"])) //si pulsa sobre enviar post
  4.             {
  5.                 //crea una instancia pasando los datos al método
  6.                 $nuevo_post=new Posts();
  7.                 $nuevo_post=$nuevo_post->crea_post($_POST["titulo_post"], $_SESSION["usuario"], $_POST["texto_post"], date('Y-m-d-G-i-s'));
  8.             }
  9.             //formulario para enviar un nuevo post
  10.         ?>
  11.         <div>
  12.         <form action="blog_index.php" method="post">
  13.             <table border="0">
  14.                 <tr>
  15.                 <th align="center" scope="colgroup">Introduzca un nuevo post</th>
  16.                 </tr>
  17.                 <tr>
  18.                     <td>
  19.                     Título
  20.                     <input type="text" name="titulo_post" /> <!-- campo para el título del post -->
  21.                     </td>
  22.                 </tr>
  23.                 <tr>
  24.                     <td>
  25.                     <textarea name="texto_post" cols="50" rows="10"></textarea> <!-- campo para el texto del post -->
  26.                     </td>
  27.                 </tr>
  28.                     <td>
  29.                     <input type="submit" name="enviar_post" value="Enviar nuevo post"/> <!-- botón para enviar el formulario por método post -->
  30.                     </td>
  31.             </table>
  32.         </form>
  33.         </div>

el método a la que apunta la instancia es el siguiente(comentado)

Código PHP:
Ver original
  1. public function crea_post($titulo,$usuario,$post,$fechahora) //recibe los valores necesarios para el post
  2.         {
  3.             $consulta="SELECT id, usuario from usuarios where usuario='".$usuario."'"; //selecciono el id y el usuario, donde el usuario coincida con el recibido por parámetro
  4.             $result_conexion=Conectar::connect($consulta); //conecto a la base de datos
  5.             while($resultado=mysql_fetch_array($result_conexion))//mientras $resultado reciba valores
  6.             {
  7.                 $id=$resultado['id']; //escojo la id del usuario
  8.             }
  9.             //finalmente con la id del usuario lo que hago en la siguiente conexion a base de datos es insertar en el campo id_usuarios el valor int obtenido anteriormente
  10.             $crea_post="INSERT INTO posts VALUES (null, titulo='".$titulo."', id_usuarios='".$id."', post='".$post."', fecha='".$fechahora."')";
  11.             $result_conexion=Conectar::connect($crea_post); //conecto a la base de datos e inserto
  12.             echo "Entrada publicada con éxito";
  13.         }

cuando realizo lo que aparece en el método me devuelve el siguiente error que no entiendo

Cita:
ERROR:
Cannot add or update a child row: a foreign key constraint fails (`hoteles`.`posts`, CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`id_usuarios`) REFERENCES `usuarios` (`id`))Entrada
¿alguien sabe qué significa este error, por qué me devuelve este error, me falla el método por algún error de sintaxis, sabría alguna forma mejor o correcta de hacerlo?

gracias :)
  #2 (permalink)  
Antiguo 08/05/2013, 01:09
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: cómo insertar en un campo de llave foránea

No se puede agregar o actualizar una tabla secundaria: restricción de clave externa fallaComprueba que el usuario exista y que el INSERT está correctamente escrito.
Tu select de usuario no comprueba si hay o no resultados, de manera que si el usuario no existe o no se encuentra, el script continúa.
Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 08/05/2013, 01:34
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: cómo insertar en un campo de llave foránea

Cita:
Iniciado por repara2 Ver Mensaje
No se puede agregar o actualizar una tabla secundaria: restricción de clave externa fallaComprueba que el usuario exista y que el INSERT está correctamente escrito.
Tu select de usuario no comprueba si hay o no resultados, de manera que si el usuario no existe o no se encuentra, el script continúa.
Salu2
efectivamente, estaba escribiendo mal el encapsulado de VALUES.

finalmente el método quedó así

Código PHP:
Ver original
  1. public function crea_post($titulo,$usuario,$post,$fechahora) //recibe los valores necesarios para el post
  2.         {
  3.             $consulta="SELECT id, usuario from usuarios where usuario='".$usuario."'"; //selecciono el id y el usuario, donde el usuario coincida con el recibido por parámetro
  4.             $result_conexion=Conectar::connect($consulta); //conecto a la base de datos
  5.             while($resultado=mysql_fetch_array($result_conexion))//mientras $resultado reciba valores
  6.             {
  7.                 $id=$resultado['id']; //escojo la id del usuario
  8.             }
  9.             //finalmente con la id del usuario lo que hago en la siguiente conexion a base de datos es insertar en el campo id_usuarios el valor int obtenido anteriormente
  10.             $crea_post="INSERT INTO posts VALUES (null, '".$titulo."', '".$id."', '".$post."', '".$fechahora."')";
  11.             $result_conexion=Conectar::connect($crea_post); //conecto a la base de datos e inserto
  12.             echo "Entrada publicada con éxito";
  13.         }

respecto a lo que comentas del SELECT ¿cómo se hace para que en caso de que no exista un valor o no se cumpla la condición el script no continúe?

gracias :)
  #4 (permalink)  
Antiguo 08/05/2013, 02:03
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: cómo insertar en un campo de llave foránea

Puedes hacer algo así:

Código PHP:
Ver original
  1. if(!mysql_num_rows($resource)) return false;
http://de1.php.net/manual/es/functio...l-num-rows.php

Salu2
__________________
Fere libenter homines, id quod volunt, credunt.

Etiquetas: campo, formulario, llave, select, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:33.