Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Nuevo en SQL (..y en todo en general)

Estas en el tema de Nuevo en SQL (..y en todo en general) en el foro de Mysql en Foros del Web. Hola a todos: Estoy intentando insertar datos en una base de datos desde un formulario para varias tablas de la base de datos. Pero no ...
  #1 (permalink)  
Antiguo 30/10/2010, 12:31
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Nuevo en SQL (..y en todo en general)

Hola a todos:

Estoy intentando insertar datos en una base de datos desde un formulario para varias tablas de la base de datos.
Pero no encuentro el truco (..ignorancia) y me devuelve un error de SQL, la cosa es que no me aclaro con la referencia de MySQL para sentencias SQL y estoy atascado (..ignorancia de nuevo) el error que obtengo es:

Cita:
Error in query: INSERT INTO personas (nombre, apellido1,apellido2) VALUES ('Jacinto', 'Gomez','Rodriguez' ) INTO logins (usuario, password) VALUES ('jacinto', 'gomez ). You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTO logins (usuario, password) VALUES ('jacinto', 'gomez )' at line 1
Y el código que tengo es:
Código:
<?php 
} 
else { 
// form submitted 
// set server access variables 
$host = "localhost"; 
$user = "root"; 
$pass = "cecilia"; 
$db = "nmbs"; 

// get form input 
// check to make sure it's all there 
// escape input values for greater safety 
$nombre = empty($_POST['nombre']) ? die ("ERROR: Pon un nombre") : mysql_escape_string($_POST['nombre']);
$apellido1 = empty($_POST['apellido1']) ? die ("ERROR: Pon un apellido") : mysql_escape_string($_POST

['apellido1']);
$apellido2 = empty($_POST['apellido2']) ? die ("ERROR: Pon un apellido") : mysql_escape_string($_POST

['apellido2']);

$usuario = empty($_POST['usuario']) ? die ("ERROR: Pon un usuario") : mysql_escape_string($_POST['usuario']);

$password = empty($_POST['password']) ? die ("ERROR: Pon una contraseña") : mysql_escape_string($_POST

['password']);
 
// open connection 
$connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); 

// select database 
mysql_select_db($db) or die ("Unable to select database!"); 

// create query 
$query = "INSERT INTO personas (nombre, apellido1,apellido2) VALUES ('$nombre', '$apellido1','$apellido2' ) 

INTO logins (usuario, password) VALUES ('$usuario', '$password )";
 
 
// execute query 
$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error());

 
// print message with ID of inserted record 
echo "New record inserted with ID ".mysql_insert_id(); 

// close connection 
mysql_close($connection); 
} 
?>
Una ayudita de un sabio que lo sepa
  #2 (permalink)  
Antiguo 30/10/2010, 12:47
 
Fecha de Ingreso: agosto-2010
Ubicación: León Gto. México
Mensajes: 39
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Nuevo en SQL (..y en todo en general)

Y si intentas haciendo dos inserts distintos:

Código:
INSERT INTO personas (nombre, apellido1,apellido2) VALUES ('Jacinto', 'Gomez','Rodriguez');

INSERT INTO logins (usuario, password) VALUES ('jacinto', 'gomez )
  #3 (permalink)  
Antiguo 31/10/2010, 16:29
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: Nuevo en SQL (..y en todo en general)

Gracias por la ayuda pero tampoco va.
A lo mejor no lo he escrito bien ¿Solo habia que cambiar lo que indicas?

Muchas gracias por tu ayuda
  #4 (permalink)  
Antiguo 31/10/2010, 17:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Nuevo en SQL (..y en todo en general)

Hay dos problemas básicos:
1) No puedes ejecutar dos INSERTS a diferentes tablas en una sola sentencia SQL.
2) No se debe usar palabras reservadas como nombres de campos, tablas o bases. PASSWORD es una función y cláusula, por lo que no debes usarla como nombre de campo de tabla. Si lo deseas hacer debes encerrarla entre acentos inversos.

Código MySQL:
Ver original
  1. INSERT INTO `personas`(`nombre`, `apellido1`, `apellido2`)
  2. VALUES ('$nombre', '$apellido1', '$apellido2' );
  3. INSERT INTO `logins`(`usuario`, `password`) VALUES ('$usuario',  '$password);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 01/11/2010, 03:48
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: Nuevo en SQL (..y en todo en general)

Hola GNZSoloyo:

Muchas gracias por tus indicaciones, he corregido lo dicho por ti y ahora, aparentemente, acepta el código sin devolver ningún error. Sin embargo, solo graba el registro de la primera tabla, no se si se debe a que las tablas están relacionadas (he eliminado las relaciones para probar y tampoco registra el resto de tablas)
¿Tiene que ver el hecho de que esten relacionadas? ¿Hay que cambiar o añadir algo al query en el caso de que están relacionadas? Como ves estoy muy necesitado ya que mi ignorancia, como es evidente, es supina.
Como decian los Beatles Please, Please, Help Me
A continuación el código

Código:
if (!isset($_POST['submit'])) { 
// form not submitted 
?> 

<form action="<?=$_SERVER['PHP_SELF']?>" method="post"> 

<fieldset>
        <legend>Datos Personales</legend>
        <label for="nombre">Nombre:</label><input type="text" name="nombre" id="nombre"size="40"/><br/><br/>
        <label for="apellido1">Apellido 1º:</label><input type="text" name="apellido1" id="Apellido1"/>
        <label for="apellido2">Apellido 2º:</label><input type="text" name="apellido2" id="Apellido2"/>


      </fieldset>
      <fieldset>
        <legend>Contraseña</legend>
        <p>Indique aquí su usuario y su contraseña por favor. Guárdelos en un lugar que recuerde por si los olvida o los pierde</p>
       
        <label for="usuario">Usuario:</label><input type="text" name="usuario" id="usuario"/>
        <label for="clave">Contraseña:</label><input type="clave" name="clave" id="clave"/>

     </fieldset>
      <fieldset>
       <legend>Dirección y teléfono</legend>
        <label for="direccion">Dirección:</label><input type="text" name="direccion" id="direccion" size="88"/><br/><br/>     
        <label for="poblacion">Población:</label><input type="text" name="poblacion" id="poblacion"size="45"/>
        <label for="ZIPCode">Código postal:</label><input type="text" name="ZIPCode" id="ZIPCode"size="10"/><br/><br/>
        <label for="provincia">Provincia:</label><input type="text" name="provincia" id="provincia"/>
	<label for="pais">Pais:</label><input type="text" name="pais" id="pais"/><br/><br/>	

      </fieldset> 	
 
<input type="submit" name="submit"> 
</form> 

<?php 
} 
else { 
// form submitted 
// set server access variables 
$host = "localhost"; 
$user = "root"; 
$pass = "cecilia"; 
$db = "nmbs"; 

// get form input 
// check to make sure it's all there 
// escape input values for greater safety 
$nombre = empty($_POST['nombre']) ? die ("ERROR: Pon un nombre") : mysql_escape_string($_POST['nombre']);
$apellido1 = empty($_POST['apellido1']) ? die ("ERROR: Pon un apellido") : mysql_escape_string($_POST['apellido1']);
$apellido2 = empty($_POST['apellido2']) ? die ("ERROR: Pon un apellido") : mysql_escape_string($_POST['apellido2']);

$usuario = empty($_POST['usuario']) ? die ("ERROR: Pon un usuario") : mysql_escape_string($_POST['usuario']);
$clave = empty($_POST['clave']) ? die ("ERROR: Indica una contraseña") : mysql_escape_string($_POST['clave']);

$direccion = empty($_POST['direccion']) ? die ("ERROR: Debes poner una dirección") : mysql_escape_string($_POST['direccion']);
$poblacion = empty($_POST['poblacion']) ? die ("ERROR: Por favor, pon una población") : mysql_escape_string($_POST['poblacion']);
$provincia = empty($_POST['provincia']) ? die ("ERROR: Por favor, pon una provincia") : mysql_escape_string($_POST['provincia']);
$ZIPCode = empty($_POST['ZIPCode']) ? die ("ERROR: Por favor, pon un código postal") : mysql_escape_string($_POST['ZIPCode']);
$pais = empty($_POST['pais']) ? die ("ERROR: Por favor, indica un Paisl") : mysql_escape_string($_POST['pais']);


 
// open connection 
$connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); 

// select database 
mysql_select_db($db) or die ("Unable to select database!"); 

// create query 

 $query = "INSERT INTO personas (nombre, apellido1,apellido2) VALUES ('$nombre', '$apellido1','$apellido2' )";
          "INSERT INTO logins (usuario, clave) VALUES ('$usuario', '$clave' )";
          "INSERT INTO direcciones (direccion, poblacion, provincia, ZIPCode, pais ) VALUES ('$direccion','$poblacion','$provincia','$ZIPCode','$pais')";

 
// execute query 
$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error());

 
// print message with ID of inserted record 
echo "New record inserted with ID ".mysql_insert_id(); 

// close connection 
mysql_close($connection); 
} 
?> 

</BODY>
</html>
  #6 (permalink)  
Antiguo 01/11/2010, 04:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Nuevo en SQL (..y en todo en general)

Sin ver la estructura de la tala y las relaciones (necesitaríamos el "CREATE TABLE..." de cada una), sólo me queda suponer que trabajas con tablas InnoDB y que hay una FK definida entre las dos.
Bueno, el problema es que la tabla origen de la FK es la primera que debe llenarse, ya que necesitarás que el valor de esa tabla exista antes de insertar un registro en una tabla que depende de ella.
Es parte del modelo relacional y es lo que se denomina "integridad referencial".
Las verificaciones de este tipo son automáticas, es decir, ocurren aunque no las indiques, por lo cual siempre el orden de entrada de los datos debe respetar la cadena de dependencias.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 01/11/2010, 05:43
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: Nuevo en SQL (..y en todo en general)

Hola de nuevo:

Creo que esto es lo que preguntas
Las tablas estan creadas desde phpmyadmin que viene con XAMPP,
Todos los campos que no son índice, por el momento, son varchar.
Cada tabla tiene dos indices:
  • Uno primario autonumerico (PK)
  • uno sencillo (K)
las relaciones son de indice primario a indice sencillo de uno a varios de modo que:
  • las personas (tabla personas campo idPrimaryPER-PK) pueden tener varias direcciones (tabla direcciones campo idPER-K y tabla tipo campo isDIR-K)
  • Las personas (tabla personas campo idPrimaryPER-PK) solo pueden tener un login (tabla claveusu campo idPrimaryUSU-PK, cambié el nombre)
  • Las personas (tabla personas campo idPrimaryPER-PK) pueden tener varios telefonos (tabla contacto campo idPER-K
  • Los telefonos (tabla contacto campo idPrimaryCON-PK) pueden ser de varios tipos (tabla tipo campo idTIP-K)

El objettivo final es poder grabar los registros en el formulario de entrada que te he enviado para que luego, una vez registrado, el usuario pueda acceder con su login y modificar o añadir datos.
Pero eso es futuro, por el momento seré muy feliz si consigo registrar los datos con el formulario de entrada y que se conserve la relación entre los registros en las diferentes tablas.
Como ves el refrán es cierto "la ignorancia es atrevida" pero no tengo más remedio que merterme en el charco o sea que muchas gracias por tu ayuda, una vez más.

  #8 (permalink)  
Antiguo 01/11/2010, 05:54
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: Nuevo en SQL (..y en todo en general)

Hola de nuevo:

Releyendo tu mensaje, deduzco que aunque inserte simultáneamente los registros en las tablas, las relaciones no se crearán, si esto es así mi código recopilado no es correcto, por que la parte de inserción de los registros deberia ser en dos partes.
Es decir una primera parte grabaria los datos de "personas" y despues de una manera que ignoro deberia recoger el dato de personas para insertar el registro del login en la tabla "claveusu" con la correspondiente relación y lo mismo para el resto de tablas relacionadas con "personas"
Si esto es así ¿que le tengo que añadir al código?

Gracias mil por tu excelsa e ilimitada caridad
  #9 (permalink)  
Antiguo 01/11/2010, 06:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Nuevo en SQL (..y en todo en general)

El punto esencial es el hecho de estar creando registros con el ID como autonumérico. Lo que debes hacer en ese caso es recuperar el ID creado automáticamente por MySQL al insertar el registro en la tabla PERSONA, y eso lo puedes hacer de tres formas:
1) En MySQL, usando una función denominada LAST_INSERT_ID(), la cual devuelve el último ID autonumérico creado de la última inserción, pero debe ser ejecutado inmediatamente después de la inserción o su valor se pierde.
2) Si estás usando PHP, usas la función mysql_insert_id(), que precisamente lee ese dato, inmediatamente después de una inserción exitosa.
Código PHP:
Ver original 
3) Rústicamente, lo puedes hacer con una sentencia de consulta para recuperar el último creado en esa tabla, que invariablemente es el máximo:
Código MySQL:
Ver original
  1. SELECT MAX(persona_id) ID FROM persona;

Recién con ese dato recuperado puedes hacer el resto de las inserciones.

Hay algunas consideraciones sobre tu modelo, pero te las paso luego (ahora estoy en la empresa, trabajando, y con cámaras mirando).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 01/11/2010, 11:55
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: Nuevo en SQL (..y en todo en general)

Muchas gracias, estoy en ello.
Por el momento lo que he hecho es utilizar la sentencia php $id = mysql_insert_id(idPrimaryPER); para recuperar el PK de personas y luego con un while he hecho esto:

Código:
while ($id = mysql_insert_id(idPrimaryPER)) { $query = "INSERT INTO clavesusu (usuario, clave) VALUES ('$usuario', 

'$clave' )";}
 $id = mysql_insert_id(idPrimaryPER);
 while ($id = mysql_insert_id(idPrimaryPER)) {$query = "INSERT INTO direcciones (direccion, poblacion, provincia, ZIPCode, 

pais ) VALUES ('$direccion','$poblacion','$provincia','$ZIPCode','$pais')";}
 $id = mysql_insert_id(idPrimaryPER);
 while ($id = mysql_insert_id(idPrimaryPER)) {$query = "INSERT INTO contacto (telGeneral, telDirecto, FAX, eMail) VALUES 

('$telGeneral','$telDirecto','$FAX','$eMail')";}
Como no podia ser menos casca y da


Cita:
Warning: mysql_insert_id() expects parameter 1 to be resource, string given in C:\xampp\htdocs\TESTphp.php on line 92

Warning: mysql_insert_id() expects parameter 1 to be resource, string given in C:\xampp\htdocs\TESTphp.php on line 93

Warning: mysql_insert_id() expects parameter 1 to be resource, string given in C:\xampp\htdocs\TESTphp.php on line 94

Warning: mysql_insert_id() expects parameter 1 to be resource, string given in C:\xampp\htdocs\TESTphp.php on line 95

Warning: mysql_insert_id() expects parameter 1 to be resource, string given in C:\xampp\htdocs\TESTphp.php on line 96

Warning: mysql_insert_id() expects parameter 1 to be resource, string given in C:\xampp\htdocs\TESTphp.php on line 97
New record inserted with ID 20
Este bonito resultado, eso si inserta la persona, menos da una piedra. Mientras te acabas de tirar por el suelo de la risa y me dices lo que está mal sigo con mis palos de ciego.
Muchas gracias y cuidado con las cámaras
  #11 (permalink)  
Antiguo 16/11/2010, 12:41
Avatar de Rankxerox1984  
Fecha de Ingreso: septiembre-2010
Mensajes: 253
Antigüedad: 13 años, 7 meses
Puntos: 4
Respuesta: Nuevo en SQL (..y en todo en general)

Hola Gonzalo:

(...Ohh no, si, soy yo de nuevo, el torpe ) me quedé esperando tu análisis de mi modelo de datos. Mientras tanto he desarrollado otros aspectos de mi proyecto, tales como el cambio de idioma y la homologación con los navegadores más frecuentes.
El tema de los datos todavía está donde lo dejamos la última vez (cada vez queda menos para inevitablemente meterme con él ). De todas maneras, investigando por ahí he oido algo de utilizar Inner join para juntar las tablas creando así la relación para después hacer la inserción de los datos. Pero mis pruebas, como puedes imaginar, han fallado.
Ni que decir tiene que un docto y dopcumentado rayuo de luz cordobés que llegara hasta Barcelona sería muy bien venido.

Muchas gracias por adelantado y un saludo,

J.

Etiquetas: general, sql, todo
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 08:34.