Jump to content

Problema con llaves foráneas en phpmyadmin


RomiChan

Recommended Posts

Creé un modelo en mysql workwench he hice el script para importar la base de datos en phpmyadmin, pero al insertar un dato a una tabla con claves foráneas no me sale el campo tipo scroll con las claves a elegir, solo me sale un campo de texto donde yo misma debo escribir la llave foránea.

Cual podría ser el problema?

 

Ademas...como no supe resolver esto, tuve que hacer el formulario con campos de texto donde uno mismo tenga que escribir la llave, pero trato de insertar un dato a través del formulario y no funciona, me sale "datos insertados", pero no se agrega nada en la base de datos....que hago? -o-

<?php
include("conexion.php");

if(isset($_POST['idproveedor']) && !empty($_POST['idproveedor']) && 
isset($_POST['idproducto']) && !empty($_POST['idproducto']) &&
isset($_POST['nombre']) && !empty($_POST['nombre']) &&
isset($_POST['precio']) && !empty($_POST['precio']) &&
isset($_POST['cantidad']) && !empty($_POST['cantidad']) &&
isset($_POST['peso']) && !empty($_POST['peso']))
{

$con=mysql_connect($host,$user,$pw) or die("Problemas al conectar al servidor.");
mysql_select_db($db,$con) or die("Problemas al conectar la bd");

mysql_query("INSERT INTO sigartel (idproveedor, idproducto, nombre, precio, cantidad, peso) VALUES ('$_POST[idproveedor]','$_POST[idempleado]','$_POST[nombre]','$_POST[precio]','$_POST[cantidad]','$_POST[peso]')",$con);
echo "Datos insertados.<br><br>";
echo "<a href='menu.php'>Regresar a al menu.</a>";
}else{
	echo "Problemas al insertar datos";
}

?>

Ayuda u.u

Link to comment
Share on other sites

No sacas nada con intentar insertar datos a la base de datos si el modelo que hiciste está mal. Así que primero tienes que volver a crear la base de datos, pero ahora tienes que hacerlo bien.

 

Primero, tienes que tener claro que una clave foránea es una referencia a una clave única definida en otra tabla. Las claves primarias son implícitamente únicas, así que generalmente, una clave foránea hace referencia a una clave primaria de otra tabla. Segundo, una clave foránea debe ser del mismo tipo que la clave a la que hace referencia.

:mmm: Así que sospecho que cuando creaste las tablas en el Workbench, dejaste el tipo de dato por defecto, que es VARCHAR, y por eso no pudiste crear una referencia a la clave primaria de la otra tabla, ya que por defecto, las claves primarias son INT.

 

Aquí hay un ejemplo simple de cómo crear una clave foránea en el Workbench usando 2 tablas sencillas (OJO: esta es una versión antigua del Workbench, así que quizás se vea distinto a la versión que tú usas):

  • Crear una tabla persona:

    db1.png

  • Crear una tabla cliente. Como los clientes son personas, los datos personales del cliente se almacenan fuera de la tabla cliente, en este caso, en la tabla persona. El campo ref_persona será la clave foránea; lo llamé así ya que las claves foráneas son referencias a otras tablas. Obviamente, tú puedes usar alguna otra nomenclatura para las claves foráneas.

    db2.png

  • En la tabla cliente, vas a la pestaña Foreign Keys y creas una nueva. El nombre que se le asigna (Foreign Key Name) generalmente no lo vas a ocupar, pero se le suele asignar algún nombre que describa la relación entre el campo y la tabla a la que hace referencia. Yo le puse el nombre FKpersona para dar a entender que es una clave que hace referencia a la tabla persona, pero otras personas prefieren ponerle nombres como FK_cliente_persona o similares. Insisto, ese nombre quizás nunca lo uses, pero de todas formas se le suele dar algún nombre descriptivo (de hecho, es el nombre que aparece en la CONSTRAINT cuando creas el archivo SQL).

    db3.png

    En Referenced Table seleccionas la tabla persona
  • Seleccionas el campo que vas a usar como clave foránea, en este caso, ref_persona y seleccionas el campo idpersona (que es la clave primaria de la tabla persona). Como ref_persona e idpersona son de tipo INT, entonces son compatibles y puedes asociar el campo cliente.ref_persona con persona.idpersona.

    db4.png

  • Una vez que creas el modelo, deberías ver algo como esto:

    db6.png

NOTA: Generalmente a las tablas del ejemplo se las llamaría personas y clientes (plural). Eso es una cuestión de gustos, costumbre o estándar de codificación. Tú veras qué nomenclatura usas para los nombres de las tablas y sus campos.

 


Ahora, en relación al código PHP, la razón por la que te aparece el mensaje "Datos insertados." es porque después de la llamada a la función mysql_query viene una línea que imprime dicho mensaje :huasonto: . Así que no esperes que ocurra otra cosa, si tú misma haces que se imprima el mensaje sin verificar ninguna condición.

 

Por último, estás usando la extensión MySQL (pero no se recomienda seguir usando esa extensión), deberías usar MySQLi, que es la más reciente (y recomendada).

 

 

:huasonto:

Link to comment
Share on other sites

Muchas gracias por responder =)

Tal vez lo que dices al final es lo que esta afectando, ademas no me di cuenta que no puse or die(....) después de la función mysql_query xD Ahora que lo puse me dice error xd.

Lo demás lo tenia en cuenta, pero dejare imágenes por si hice algo mal. Tendré que ver lo de mysqli para ver si me funciona xd

 

Captura.PNG

 

2ccf.PNG

4772.PNG

 

pd: no se por que las imagenes se ven tan chicas xD

Edited by RomiChan
Link to comment
Share on other sites

:mmm: Ahora que subiste el modelo de tu base de datos, veo que sigartel es el nombre la la base de datos, así que el INSERT está malo, tienes que poner el nombre de la tabla en donde vas a insertar los datos.

 

Además estás insertando todos los datos como si fuesen cadenas, pero precio, cantidad y peso son números, no cadenas.

 

 

P.D.: Sobre las imágenes, en esa página tienes que cambiar la opción Redimension a Don't resize para evitar que te cambie el tamaño de las imágenes.

 

:huasonto:

Link to comment
Share on other sites

Me di cuenta de eso ya xD y me esta insertando, pero todavía no logro que la llave foránea se vea como un campo tipo scroll y no de texto.

 

Si podrías ayudarme en esto te lo agradecería mucho tb u.u

Quería mostrar en pantalla el repuesto con mas cantidad..pero no me sale nada xD

 

5602.PNG

 

Gracias por ayudar T^T

Edited by RomiChan
Link to comment
Share on other sites

Para saber por qué no te funciona esa consulta (no muestra nada), deberías probarla en el Workbench o en la línea de comandos de MySQL. Ese tipo de consulta da resultados de este tipo:

 

dbe.png

Si te fijas, devuelve una tabla con una fila y una columna, y el nombre de esa columna es MAX(nombre_campo). O sea, el resultado devuelto por la llamada a mysql_fetch_array no va a contener ningún campo de la tabla. Para que el resultado de la consulta contenga los campos de la tabla, tienes que ordenar la tabla por cantidad de mayor a menor y hacer que sólo muestre la primera fila. La consulta quedaría así:

SELECT *
FROM repuesto
ORDER BY cantidad DESC
LIMIT 1
Ojo, esta consulta no es exactamente la que necesitas, ya que tú quieres mostrar la cantidad (que está en la tabla repuesto) y también el nombre y precio (que están en la tabla producto); así que tienes que modificar la consulta de arriba. Básicamente tienes que especificar los nombres de los campos que a ti te interesan (y las tablas correspondientes) y agregar un WHERE. Además, ten en cuenta que esta consulta te devuelve como máximo una fila, así que no es necesario usar un while en el código PHP.

 

:huasonto:

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...