Foros del Web » Programando para Internet » PHP »

Formulario y base de datos. Ingresar datos, validar.

Estas en el tema de Formulario y base de datos. Ingresar datos, validar. en el foro de PHP en Foros del Web. Hola comunidad, soy bastante nuevo en este lenguaje y ahora mismo estoy en un aprieto. Lo que estoy haciendo es un formulario donde se guarda ...
  #1 (permalink)  
Antiguo 11/07/2012, 12:29
 
Fecha de Ingreso: julio-2012
Mensajes: 10
Antigüedad: 7 años, 7 meses
Puntos: 0
Pregunta Formulario y base de datos. Ingresar datos, validar.

Hola comunidad, soy bastante nuevo en este lenguaje y ahora mismo estoy en un aprieto.
Lo que estoy haciendo es un formulario donde se guarda en una base de datos los datos personales y ademas el usuario puede ingresar números de "cupones", lo que me piden es que pueda ingresar hasta 25 cupones..

1. Lo que debe comprobar mi php es que el rango de los números del cupon esté entre 150 mil a 175mil, ej ingreso "164300". De lo contrario no debería permitir ingresar un cupón (salta error).

2. Una vez pasado eso debe verificar que el "cupón" no haya sido ingresado, de lo contrario tampoco debería dejar ingresarlo y avisar con mensaje.

Como puedo resolver esto, mis dudas: en la tabla de la base de datos, debo tener 25 campos de cupones? cupon1, cupon2, cupon3.. ?

Tengo entendido que puedo hacer una consulta con mysql_num_rows para ver si existe el registro o no, mi problema es como hago para todos los cupones, sin saber que el usuario puede ingresar 1 solo o 20.

Espero que se entienda, y que me puedan orientar en esto, asi aprendo un poco.

Gracias, saludos!
  #2 (permalink)  
Antiguo 11/07/2012, 13:30
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 6 meses
Puntos: 1532
Respuesta: Formulario y base de datos. Ingresar datos, validar.

consulta sobre normalización y cardinalidad en bases de datos, no es buena practica tener campos de ése modo (cupon1, cupon2) lo ideal es tener una tabla relacionada cupones donde tengas (cupon_id, usuario_id, cupon) y si la limitacion es de 15, puedes tener esa cantidad predefinida en el formulario con 15 inputs como array:

<input type="text" name="cupon[0]" />
<input type="text" name="cupon[1]" />
...
<input type="text" name="cupon[14]" />

luego en php validas la cantidad del array con count($_POST['cupon'])
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 11/07/2012, 14:20
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 7 años, 8 meses
Puntos: 20
Respuesta: Formulario y base de datos. Ingresar datos, validar.

No entiendo muy bien la logica del programa, pero voy a tratar de ayudarte de acuerdo a lo que creo que entendí

1º) Para evitar la frustración del cliente que envía un formulario y recibe un error, primero deberías validar del lado cliente con javascript. (Obviamente la validación real la haces con php, pero con eso te evitas perdidas de tiempo al cliente.)

2º) En el formulario de carga el cliente pone un numero de cupón a gusto y placer dentro del rango 150 mil a 175mil; y puede hacer esa acción 25 veces?

3º) Vos queres que el cliente pueda cargar uno, tres o los 25 de una sola ves?
  #4 (permalink)  
Antiguo 11/07/2012, 16:03
 
Fecha de Ingreso: julio-2012
Mensajes: 10
Antigüedad: 7 años, 7 meses
Puntos: 0
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Gracias por las respuestas.

maycolalvarez como soy bastante novato con php estoy leyendo y tratando con lo que me dijiste pero se me esta complicando el tema.

Cita:
Iniciado por topo_bionico Ver Mensaje
No entiendo muy bien la logica del programa, pero voy a tratar de ayudarte de acuerdo a lo que creo que entendí

1º) Para evitar la frustración del cliente que envía un formulario y recibe un error, primero deberías validar del lado cliente con javascript. (Obviamente la validación real la haces con php, pero con eso te evitas perdidas de tiempo al cliente.)

2º) En el formulario de carga el cliente pone un numero de cupón a gusto y placer dentro del rango 150 mil a 175mil; y puede hacer esa acción 25 veces?

3º) Vos queres que el cliente pueda cargar uno, tres o los 25 de una sola ves?

1. Si eso pensaba hacer, voy a ver que puedo validar para que ingrese la cantidad exacta de caracteres y que sean solo números.

2. Si, el usuario podría cargar hasta 25 números distintos. Esto todavía no lo resolví, como podría hacer, para no tener que poner 25 campos de texto, algún botón que diga "añadir otro" o algo por el estilo.

3. Y podría cargar hasta 25 por ves, si hay alguna forma que vaya cargando y verificando que no exista de a uno, también podría ser.

Si me das alguna idea o comienzo de como podría hacer me salvarías, esperan que entregue esto hoy..



EDIT. bueno me dieron hasta mañana para terminarlo, estoy pensando en usar un registro de usuario y loguin y recien logueados poder cargar cupones, que sería otra tabla.

Última edición por juanmartincba; 11/07/2012 a las 17:54 Razón: mas info
  #5 (permalink)  
Antiguo 11/07/2012, 18:08
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 7 años, 8 meses
Puntos: 20
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Cita:
Iniciado por juanmartincba Ver Mensaje
Si me das alguna idea o comienzo de como podría hacer me salvarías, esperan que entregue esto hoy..
Para hoy???

Con esto vas a poder ir agregando los campos, son 2 funciones javascript. La primera duplica el campo hasta 25 veces, va incrementando el nombre y lo coloca en un nuevo div llamado "nuevo_campo" y la segunda quita el ultimo campo.
Genera una url así (si el método fuera GET)

valida.php?codigo_0=150000&codigo_1=160000&codigo_ 2=170000

Para llamar las funciones puse dos botones

Fijate que es código a medias como para que te orientes

Código HTML:
<script type="text/javascript">
var d=0;
function duplicarCampo(){
   if (d<24){
	   d=d+1;
	   var IdName = 'codigo_'+d;
	   var IdElem= 'campo_'+d;
	   var obj = document.getElementById("campo_0").cloneNode(true);
	   obj.setAttribute('name',IdName);
	   obj.setAttribute('id',IdElem);
	   document.getElementById("nuevo_campo").appendChild(obj);
	}
}


function quitarCampo() {
    if (d>=1){    
        var elemento='campo_'+d;
        var parent = document.getElementById('nuevo_campo');
        var ult = document.getElementById(elemento);
        parent.removeChild(ult);
        d=d-1;}
}
</script>


<div class="formulario">
	<form action="valida.php" method="post">
	Ingrese los Códigos - <input type="button" value="Agregar Campo" onclick="duplicarCampo()"> <input type="button" value="Quitar Campo" onclick="quitarCampo()"><br/>
	<input type="text" id="campo_0" name="codigo_0"></input>
	<div id="nuevo_campo"></div>
        <input type="submit" value="Cargar">
	</form>
</div> 
Y esto seria el archivo valida.php
Código PHP:
<?php
//Funcion para comprobar que se unico codigo en la DB
function unicoCodigo($valor){
    
$sql='SELECT count(*) FROM `tabla_codigos` WHERE `codigo`='.$valor;
    
$result=  mysql_query($sql$conexion) or die(mysql_error()); //$conexion es la conexion a la base de datos
    
$r=mysql_fetch_array($result);
    if (
$r[0]==0){
        return 
true;
    }
    else return 
false;
}

//funcion para insertar el codigo
function insertCodigo($valor){
    
$sql='INSERT INTO `tabla_codigos` (`codigo`) VALUES (\''.$valor.'\')';
    
mysql_query($sql$conexion) or die(mysql_error());
}


if (
count($_POST)>=25){ //Solamente ingresa si se envían 25 códigos o menos    
        //Obtener códigos
        
$c=0;
        
$codigo='codigo_'.$c
        
$cod=array();
        while (isset(
$_POST[$codigo])){
            if (
$_POST[$codigo_]>=150000 && $_POST[$codigo]<=175000){
                
$v=mysql_real_escape_string($_POST[$codigo]);
                
array_push($cod$v);
            }
            
$c=$c+1;
            
$codigo='codigo_'.$c//Vamos aumentando codigo_0, codigo_1, codigo_2 etc
        
}
        
//Quitamos valores duplicados del array (Ej: 1,1,5,5,6 devuelve 1,5,6)
        
$cod=array_unique($cod);
        
        
//Carga en base de datos, recorremos el array y comprobamos, si es valido lo inserta
        
        
foreach($cod as $valor){
            
//1º Verificamos que no este cargado
            
if (unicoCodigo($valor)){
                
insertCodigo($valor);
            }
        }
    }
?>
  #6 (permalink)  
Antiguo 12/07/2012, 10:24
 
Fecha de Ingreso: julio-2012
Mensajes: 10
Antigüedad: 7 años, 7 meses
Puntos: 0
Respuesta: Formulario y base de datos. Ingresar datos, validar.

topo_bionico gracias por la ayuda, estoy probando lo que me pasaste, tengo unas dudas, disculpa mi ignorancia.

Sin modificar tu código, en la base de datos tengo una tabla "tabla_codigos" y un campo "codigo", es asi el nombre que debe llevar en la tabla? o debo crear varios campos codigo_0, _1, _2 ?

En el formulario usaste name="codigo_0"

Probé solo con esto para que inserte.

Código:
<?


$conexion = mysql_connect("localhost","xxxxx","xxxxx");
mysql_select_db("xxxxx",$conexion);
mysql_query ("SET NAMES 'utf8'");


//Funcion para comprobar que se unico codigo en la DB
function unicoCodigo($valor){
    $sql='SELECT count(*) FROM `tabla_codigos` WHERE `codigo`='.$valor;
    $result=  mysql_query($sql, $conexion) or die(mysql_error()); //$conexion es la conexion a la base de datos
    $r=mysql_fetch_array($result);
    if ($r[0]==0){
        return true;
    }
    else return false;
}

//funcion para insertar el codigo
function insertCodigo($valor){
    $sql='INSERT INTO `tabla_codigos` (`codigo`) VALUES (\''.$valor.'\')';
    mysql_query($sql, $conexion) or die(mysql_error());
}


if (count($_POST)>=25){ //Solamente ingresa si se envían 25 códigos o menos    
        //Obtener códigos
        $c=0;
        $codigo='codigo_'.$c; 
        $cod=array();
        while (isset($_POST[$codigo])){
            if ($_POST[$codigo_]>=150000 && $_POST[$codigo]<=175000){
                $v=mysql_real_escape_string($_POST[$codigo]);
                array_push($cod, $v);
            }
            $c=$c+1;
            $codigo='codigo_'.$c; //Vamos aumentando codigo_0, codigo_1, codigo_2 etc
        }
        //Quitamos valores duplicados del array (Ej: 1,1,5,5,6 devuelve 1,5,6)
        $cod=array_unique($cod);
        
        //Carga en base de datos, recorremos el array y comprobamos, si es valido lo inserta
        
        foreach($cod as $valor){
            //1º Verificamos que no este cargado
            if (unicoCodigo($valor)){
                insertCodigo($valor);
            }
        }
    }



?>
  #7 (permalink)  
Antiguo 12/07/2012, 17:23
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 7 años, 8 meses
Puntos: 20
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Si, es así. los nombres son puramente orientativos y los tenes que cambiar por los que usas vos.

Y cada codigo_0, codigo_1, codigo_2 es el nombre de la variable que trae el valor y representan un registro.

Ej:

codigo_0=156789
codigo_1=167543
codigo_2=173000
codigo_3=167980
etc, etc...

En tabla_codigo va a quedar:

id codigo
1 156789
2 167543
3 173000
4 167980
  #8 (permalink)  
Antiguo 13/07/2012, 09:36
 
Fecha de Ingreso: julio-2012
Mensajes: 10
Antigüedad: 7 años, 7 meses
Puntos: 0
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Hola de nuevo! topo al final tuve que cambiar todo sino no llegaba para mostrarlo aunque sea. Te cuento como lo tengo ahora:

tengo 2 tablas:
"cupones_distribuidor" (cupones_id, cupon) tengo que agregar usuario_id

"usuarios_distribuidor"(id, usuario, password, etc...)

El usuario se registra, se loguea una vez logueado le da la opción de "CARGAR CUPON". Aca es donde me quedé, porque lo que no me funciona es como hacer para relacionar las tablas, calculo que sería entre "usuario_id" de la tabla cupones y "id" de usuarios. O como sería para que 1 usuario pueda tener muchos cupones?

Estoy usando el codigo que me pasaste para ver si el cupon existe y verificando que esté en el rango de 150mil a 175mil. Pero ingresando de a 1 cupon por vez.

Eso ya no me aflije, lo que necesito saber ahora es como relaciono las tablas para eso que dije que un usuario tenga muchos cupones.

Gracias, saludos
  #9 (permalink)  
Antiguo 13/07/2012, 10:31
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 7 años, 8 meses
Puntos: 20
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Cita:
Iniciado por juanmartincba Ver Mensaje
Hola de nuevo! topo al final tuve que cambiar todo sino no llegaba para mostrarlo aunque sea. Te cuento como lo tengo ahora:

tengo 2 tablas:
"cupones_distribuidor" (cupones_id, cupon) tengo que agregar usuario_id

"usuarios_distribuidor"(id, usuario, password, etc...)

El usuario se registra, se loguea una vez logueado le da la opción de "CARGAR CUPON". Aca es donde me quedé, porque lo que no me funciona es como hacer para relacionar las tablas, calculo que sería entre "usuario_id" de la tabla cupones y "id" de usuarios. O como sería para que 1 usuario pueda tener muchos cupones?

Estoy usando el codigo que me pasaste para ver si el cupon existe y verificando que esté en el rango de 150mil a 175mil. Pero ingresando de a 1 cupon por vez.

Eso ya no me aflije, lo que necesito saber ahora es como relaciono las tablas para eso que dije que un usuario tenga muchos cupones.

Gracias, saludos
Eso es un error en el diseño de la base de dato, tenes que tener una relación de 1 a muchos. (1 usuario puede tener muchos cupones, pero un cupón puede tener solamente un usuario)
En el diseño de la DB también podes poner que el campo "cupon" sea UNIQUE y así evitas los valores duplicados
  #10 (permalink)  
Antiguo 13/07/2012, 10:40
 
Fecha de Ingreso: julio-2012
Mensajes: 10
Antigüedad: 7 años, 7 meses
Puntos: 0
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Cita:
Iniciado por topo_bionico Ver Mensaje
Eso es un error en el diseño de la base de dato, tenes que tener una relación de 1 a muchos. (1 usuario puede tener muchos cupones, pero un cupón puede tener solamente un usuario)
En el diseño de la DB también podes poner que el campo "cupon" sea UNIQUE y así evitas los valores duplicados
Ok.lo hago, pero lo que preguntaba es como hago las relaciones?. Esta bien de esa manera que dije?
  #11 (permalink)  
Antiguo 13/07/2012, 11:37
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 7 años, 8 meses
Puntos: 20
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Cita:
Iniciado por juanmartincba Ver Mensaje
Ok.lo hago, pero lo que preguntaba es como hago las relaciones?. Esta bien de esa manera que dije?
Como hiciste las tablas? a mano?

Podes usar MySQL Workbench que genera de manera visual el modelo de tablas y relaciones, y después exportas el DDL para generar la Base.


Si ya tenes datos, hace un backup y proba le siguiente codigo:

Código SQL:
Ver original
  1. ALTER TABLE `cupones_distribuidor` ADD FOREIGN KEY(id_usuario) REFERENCES `usuarios_distribuidor` (`id`)

Y te explico el código para que lo modifiques si corresponde.

ALTER TABLE `cupones_distribuidor`
Especifica que en que tabla se va a realizar la modificación

ADD FOREIGN KEY(id_usuario)
El nombre del campo que se va a crear en la tabla `cupones_distribuidor`y en este caso, va a guardar el id del usuario.


REFERENCES `usuarios_distribuidor` (`id`)
Especifica a que tabla y a que campo hace referencia el nuevo campo, en este caso, al campo `id` de la tabla `usuarios_distribuidor`

Lo que tenes que tener en cuenta ahora, es que cada vez que cargues un código, tenes que insertar también el ID del usuario.

Código PHP:
$sql='INSERT INTO `cupones_distribuidor` (`cupon`,`id_usuario`) VALUES (\''.$valor.'\',\''.$id_usuario.'\')'
Donde $id_usuario es la variable que almacena el id del usuario logueado
  #12 (permalink)  
Antiguo 13/07/2012, 11:48
 
Fecha de Ingreso: julio-2012
Mensajes: 10
Antigüedad: 7 años, 7 meses
Puntos: 0
Respuesta: Formulario y base de datos. Ingresar datos, validar.

Cita:
Iniciado por topo_bionico Ver Mensaje
Como hiciste las tablas? a mano?

Podes usar MySQL Workbench que genera de manera visual el modelo de tablas y relaciones, y después exportas el DDL para generar la Base.


Si ya tenes datos, hace un backup y proba le siguiente codigo:

Código SQL:
Ver original
  1. ALTER TABLE `cupones_distribuidor` ADD FOREIGN KEY(id_usuario) REFERENCES `usuarios_distribuidor` (`id`)

Y te explico el código para que lo modifiques si corresponde.

ALTER TABLE `cupones_distribuidor`
Especifica que en que tabla se va a realizar la modificación

ADD FOREIGN KEY(id_usuario)
El nombre del campo que se va a crear en la tabla `cupones_distribuidor`y en este caso, va a guardar el id del usuario.


REFERENCES `usuarios_distribuidor` (`id`)
Especifica a que tabla y a que campo hace referencia el nuevo campo, en este caso, al campo `id` de la tabla `usuarios_distribuidor`

Lo que tenes que tener en cuenta ahora, es que cada vez que cargues un código, tenes que insertar también el ID del usuario.

Código PHP:
$sql='INSERT INTO `cupones_distribuidor` (`cupon`,`id_usuario`) VALUES (\''.$valor.'\',\''.$id_usuario.'\')'
Donde $id_usuario es la variable que almacena el id del usuario logueado
Gracias por responder, ahora intenté con el codigo sql y me dio el siguiente error:
Código:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`republicalibre_sorteo`.<result 2 when explaining filename '#sql-6a4_89b003'>, CONSTRAINT `#sql-6a4_89b003_ibfk_1` FOREIGN KEY (`id_usuario`) REFERENCES `usuarios_distribuidor` (`id`))

Este son las estructuras de las tablas:

Código:
--
-- Estructura de tabla para la tabla `cupones_distribuidor`
--

CREATE TABLE IF NOT EXISTS `cupones_distribuidor` (
  `cupones_id` int(11) NOT NULL AUTO_INCREMENT,
  `cupon` varchar(30) NOT NULL,
  `id_usuario` int(11) NOT NULL,
  PRIMARY KEY (`cupones_id`),
  KEY `id_usuario` (`id_usuario`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `usuarios_distribuidor`
--

CREATE TABLE IF NOT EXISTS `usuarios_distribuidor` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `usuario` varchar(30) NOT NULL,
  `password` varchar(255) NOT NULL,
  `nombre` varchar(30) NOT NULL,
  `apellido` varchar(30) NOT NULL,
  `dni` varchar(30) NOT NULL,
  `email` varchar(30) NOT NULL,
  `telefono` varchar(30) NOT NULL,
  `localidad` varchar(30) NOT NULL,
  `provincia` varchar(30) NOT NULL,
  `empresa` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ;
  #13 (permalink)  
Antiguo 13/07/2012, 15:47
Avatar de topo_bionico  
Fecha de Ingreso: junio-2012
Mensajes: 89
Antigüedad: 7 años, 8 meses
Puntos: 20
Respuesta: Formulario y base de datos. Ingresar datos, validar.

El codigo correcto para crear las tablas con la relacion es la siguiente
Código SQL:
Ver original
  1. -- -----------------------------------------------------
  2.  
  3. -- Tabla `usuarios_distribuidor`
  4.  
  5. -- -----------------------------------------------------
  6.  
  7. CREATE  TABLE IF NOT EXISTS `usuarios_distribuidor` (
  8.  
  9.   `id` INT(11) NOT NULL AUTO_INCREMENT ,
  10.  
  11.   `usuario` VARCHAR(30) NOT NULL ,
  12.  
  13.   `password` VARCHAR(255) NOT NULL ,
  14.  
  15.   `nombre` VARCHAR(30) NOT NULL ,
  16.  
  17.   `apellido` VARCHAR(30) NOT NULL ,
  18.  
  19.   `dni` VARCHAR(30) NOT NULL ,
  20.  
  21.   `email` VARCHAR(30) NOT NULL ,
  22.  
  23.   `telefono` VARCHAR(30) NOT NULL ,
  24.  
  25.   `localidad` VARCHAR(30) NOT NULL ,
  26.  
  27.   `provincia` VARCHAR(30) NOT NULL ,
  28.  
  29.   `empresa` VARCHAR(30) NOT NULL ,
  30.  
  31.   PRIMARY KEY (`id`) )
  32.  
  33. ENGINE = InnoDB
  34.  
  35. DEFAULT CHARACTER SET = latin1;
  36.  
  37.  
  38.  
  39. -- -----------------------------------------------------
  40.  
  41. -- Tabla `cupones_distribuidor`
  42.  
  43. -- -----------------------------------------------------
  44.  
  45. CREATE  TABLE IF NOT EXISTS `cupones_distribuidor` (
  46.  
  47.   `cupones_id` INT(11) NOT NULL AUTO_INCREMENT ,
  48.  
  49.   `cupon` VARCHAR(30) NOT NULL ,
  50.  
  51.   `id_usuario` INT(11) NOT NULL ,
  52.  
  53.   PRIMARY KEY (`cupones_id`) ,
  54.  
  55.   INDEX `fk_cupones_distribuidor_usuarios_distribuidor` (`id_usuario` ASC) ,
  56.  
  57.   CONSTRAINT `fk_cupones_distribuidor_usuarios_distribuidor`
  58.  
  59.     FOREIGN KEY (`id_usuario` )
  60.  
  61.     REFERENCES `usuarios_distribuidor` (`id` )
  62.  
  63.     ON DELETE NO ACTION
  64.  
  65.     ON UPDATE NO ACTION)
  66.  
  67. ENGINE = InnoDB
  68.  
  69. DEFAULT CHARACTER SET = latin1;

Etiquetas: formulario, mysql, registro, 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 15:22.