Foros del Web » Programando para Internet » PHP »

Script desde 0

Estas en el tema de Script desde 0 en el foro de PHP en Foros del Web. Hola tengo que escribir un script de php partiendo de cero y antes de ponerme con él agradecería algo de información sobre que método es ...
  #1 (permalink)  
Antiguo 16/06/2003, 18:46
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Mensaje Script desde 0

Hola tengo que escribir un script de php partiendo de cero y antes de ponerme con él agradecería algo de información sobre que método es mejor seguir, etc.

Lo que quiero crear es un formulario que permita darse de alta a los usuarios escribiendo los datos en una base de datos de manera segura, exactamente constará de:

- Un formulario con 3 campos:
--- Nombre de usuario
--- Contraseña
--- Contraseña

Los datos de dicho formulario se han de enviar en modo seguro al servidor y escribirse en la base de datos, antes debería comprobar que ese usuario no existe en la base de datos y si existe mostraría un mensaje diciendo que ese usuario ya existe. Además es necesario que que cada vez que se de un usuario de alta se envie un mail a una determinada dirección de correos y que se haga una validación de los datos así como que el script compruebe que las dos casillas donde el usuario escribirá la contraseña son iguales (por si el usuario se ha equivocado al escribir la contraseña ne la primera casilla).

Cuento con:
- Servidor apache SSL bajo Debian

Después de que me sugirais el mejor "camino" a seguir iré desarrollando el script y lo iré pegando por si a alguien le puede servir, espero no tener que preguntar mucho durante el desarrollo

Última edición por Henker; 16/06/2003 a las 19:28
  #2 (permalink)  
Antiguo 16/06/2003, 20:09
Avatar de camargo  
Fecha de Ingreso: abril-2002
Ubicación: Kerétaro, Méjiko
Mensajes: 1.045
Antigüedad: 22 años
Puntos: 2
adelante
__________________
http://www.chorcha.com
  #3 (permalink)  
Antiguo 16/06/2003, 20:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Suerte .. si quieres ver como lo hice yo xD:

<spam>
http://phpcluster.host.sk/scripts/autentificator/
</spam>

Exactamente no es cómo lo que quieres hacer .. pero un 90% es lo mismo ..

Una vez validado tu usuario se usa sesiones (en mi caso) para "seguir" al usuario en las páginas que requieran autentificación ..

Por lo demas, mi scripcito no lo he probado bajo SSL .. así que si lo llegas a probar (por curiosidad) y te funciona correctamente me avisas.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 16/06/2003, 22:11
Avatar de ProgramacionWeb  
Fecha de Ingreso: junio-2003
Ubicación: Barcelona
Mensajes: 176
Antigüedad: 20 años, 10 meses
Puntos: 2
Tengo un colega que ha hecho un articulo sobre eso y lo ha colgado en mi web, si te interesa para tomar ideas: http://www.programacionweb.net/?mostrar=Articulo&id=35
__________________
Foros en los que participo:
  #5 (permalink)  
Antiguo 17/06/2003, 11:45
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Gracias a todos por la ayuda, me van a servir mucho vuestros ejemplos (sobre todo para disminuir el número de dudas) por favor conforme avance si veis algún error o quereis mejorar el código os agradecería comentarios al respecto.

Parte 1: El formulario html:

Como quiero enviar los datos a través de SSL la ruta donde el "POST" action apunta es "https" y no el estandar "http"

-------------------------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Página de registro de nuevos usuarios</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form method = "POST" action = "https://www.dominio.com/ruta/alta_usr.php">
<strong>Alias/Nombre de usuario </strong><strong>:</strong>
<input type="text" name="usuario" size="15"><br>
<em>(escriba una palabra que usará; como alias/login para entrar en las
diferentes aplicaciones de nuestro sistema</em><strong></strong>)<br>
<br>
<strong>Contraseña </strong><strong>:</strong>
<input type="text" name="pwd01" size="12"><br>
<em>(debe tener 8 caracteres como mínimo)</em><br>
<br>
<strong>Reescriba la contraseña</strong><strong>:</strong>
<input type="text" name="pwd02" size="12"><br>
<em>(para comprobar que no ha cometido un error al escribirla en la casilla
anterior)</em><br>
<br>
<input type="submit" value="Enviar datos">
</form>
</body>
</html>
______________________________________________
  #6 (permalink)  
Antiguo 17/06/2003, 11:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues es sólo el formulario . supongo que estará bien ..

El caso que te asegures que en ese "Action" que usas https:// tengas tu SSL funcionando ahí para ese directorio (ya te darás cuenta al usarlo que se activará tu "candado" de tu navegador ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 18/06/2003, 10:55
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Hola, ya estoy liado con el script y me da un par de errores que no entiendo.
Además quiero insertar los datos en dos tablas diferentes a la vez
supongo que he de hacer lo que comento en un comentario en la línea 22-23.

Los errores que me da son estos dos:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in alta_usr.php on line 11

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in alta_usr.php on line 15

EL código es:
Código PHP:
<?
$server
="localhost"/* Nuestro server mysql */
$database="clientes"/* Nuestra base de datos */
$dbpass="mike"/*Nuestro password mysql */
$dbuser="aamnsczx"/* Nuestro user mysql */
/* Primero comprobamos que no existe un usuario con el mismo usuario ya registrado */

$query="SELECT * FROM usuarios_pendientes WHERE usuario='$usuario'";
$link=mysql_connect($server,$dbuser,$dbpass);
$result=mysql_db_query($database,$query,$link);
if(
mysql_num_rows($result)){
echo 
"El usuario ya existe en la BD";
} else {
mysql_free_result($result);
/* Ahora comprobamos que los dos pass coinciden */
if($pass1!=$pass2) {
echo 
"Los passwords deben coincidir<br>";
echo 
'Clica <a href="altausr.php">aquí</a> para volver al formulario';
} else {

$query="INSERT INTO usuarios_pendientes (fecha, alias, pwd) VALUES ('$usuario','$pwd01','$pwd02')";
/* Para insertar los datos en otra tabla a la vez imagino que solamente he de añadir otro
$query="INSERT INTO nombre_detabla etc. ¿no? */
$result=mysql_db_query($database,$query,$link);
if(
mysql_affected_rows($link)){
echo 
"Lo datos del usuario han sido introducidos correctamente";
} else {
echo 
"Error introduciendo el usuario";
/* Cierre del else */
/* Cierre del else que corresponde a if(mysql_affected_rows.....) */
/* Cierre del else que corresponde a if(mysql_num_rows...) */

 
include("alta_usr.htm"); ?>

Última edición por Henker; 18/06/2003 a las 11:03
  #8 (permalink)  
Antiguo 18/06/2003, 11:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
** mysql_num_rows() te devuelve el número de registros que te arroje tu consulta realizada y FALSE si no ha podido ejecutarse .. así que mejor usar así:

Código PHP:
if(mysql_num_rows($result) >0){ // o ==1 .. como quieras
echo "El usuario ya existe en la BD"
Lo mismo para el mysql_affected_rows() ...

** El mysql_db_query() .. mejor que uses mysql_select_db() y mysql_query() ..

** Para localizar errores de sintax SQL o conexión usa la estructura:

mysql_xxxx() or die (mysql_error());

donde xxxx será una de tantas funciones de mysql ..

Si quieres hacer un "script" desde cero y que use BD .. .lo primero es conocer y "modelar" bien tu BD .. tus tablas y tus campos que necesites .. De ahí sabras que cosultas hacer a tu BD .. Eso es "SQL" si no lo coneces puedes ver el manual de mysql.com donde se explica el SQL particular de Mysql ..

$query="INSERT INTO usuarios_pendientes (fecha, alias, pwd) VALUES ('$usuario','$pwd01','$pwd02')";

No sé si usaras algún campo ID autonumeríco y unico (eso te servirá para otras operaciones con tu tabla y registrso) .. El caso que deberías usarlo. Luego se vé .. fecha,alias,pwd y le asignas valores $usuario,$pwd01,$pwo2 ? Eso que significa? .. que pretendes hacer ahí? ...

(si quiere ir haciendo el "script" aquí en el foro .. primero define bien la tabla(s) que se van a usar en esa BD y los típos de campos .. luego ya vendrá escribir código ..)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 18/06/2003, 12:35
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Llevas toda la razón Cluster estoy empezando la casa por el tejado.
Además estaba usando una parte de código del ejemplo que comento "programaciónweb" o sea que tampoco
es empezar de cero por lo que tal y como comentas mejor será empezar explicando la estructura de la BD
y luego scriptear

Os pego aqui la estructura de la base de datos y explico de que va: La base de datos consta de tres tablas:

-clientesfull (se almacenan todos los datos grales de los clientes) se hará con otro script no con este

-usuarios
-usuariospendientes
Estas dos tablas son iguales y quiero que se almacenen los
datos del formulario en las dos tablas a la vez así como la fecha de alta del usuario.

La estructura de la BD clientes es:

# Table structure for table 'clientesfull'
CREATE TABLE `clientesfull` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
`dni_cif` char(15) NOT NULL default '',
`nombre` char(15) NOT NULL default '',
`apellidos` char(30) NOT NULL default '',
`empresa-particular` char(12) NOT NULL default '',
`ciudad` char(20) NOT NULL default '',
`CP` char(10) NOT NULL default '',
`provincia_estado` char(25) NOT NULL default '0',
`pais` char(20) NOT NULL default '',
`tel_fax_movil` char(15) NOT NULL default '',
`fecha_nacimiento` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) TYPE=MyISAM;


# Table structure for table 'usuarios'

CREATE TABLE `usuarios` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
`alias` varchar(20) NOT NULL default '',
`pwd` varchar(8) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM;

# Table structure for table 'usuariospendientes'

CREATE TABLE `usuariospendientes` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
`alias` char(20) NOT NULL default '',
`pwd` char(8) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM;
  #10 (permalink)  
Antiguo 18/06/2003, 17:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Esa tabla "usuariospendientes" .. no la usaría .. simplemente un campo "flag" en tu tabla usuarios sobra. Que tenga valor "P" o "A" (pendiente o Activo), para que te hagas tus consultas bajo esa condición para saber que usuario no ha validado su cuenta todavía .. (sigues guardando la fecha de registro, la cual puedes usarla para "limpiar" tu tabla usuarios de usuarios (registros) que no han sído validado en cierto tiempo ..)

Por lo demas .. la tabla "usuarios" y la "full" .. debes de realcionarla "1 es a 1" con un campo extra en tu tabla "full" que séa el ID de la tabla usuarios .. Eso es parte de la teoría de "Normalización" ..

Te dejo un tutorial sobre normalización en Mysql:
http://www.mysql-hispano.org/page.php?id=16

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #11 (permalink)  
Antiguo 19/06/2003, 09:56
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Gracias Cluster, voy siguiendo tus consejos y al final la base de datos la dejado así:


CREATE TABLE `clientesfull` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`estado_cuenta` char(1) NOT NULL default 'P',
`dni_cif` varchar(15) NOT NULL default '',
`nombre` varchar(15) NOT NULL default '',
`apellidos` varchar(30) NOT NULL default '',
`empresa_particular` varchar(12) NOT NULL default '',
`ciudad` varchar(20) NOT NULL default '',
`CP` varchar(10) NOT NULL default '',
`provincia_estado` varchar(25) NOT NULL default '',
`pais` varchar(20) NOT NULL default '',
`tel_fax_movil` varchar(15) NOT NULL default '',
`fecha_nacimiento` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) TYPE=MyISAM;


CREATE TABLE `usuarios` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
`alias` varchar(20) NOT NULL default '',
`pwd` varchar(8) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM;

Así para relacionar ambas tablas haría una consulta como esta:
SELECT * FROM clientesfull A, usuarios B WHERE A.id = B.id

La duda que me surge es que quizás sería mejor introducir mediante sólo un formulario (html-php) todos los datos en lugar de los dos que iba a crear, a ver que te parece.

Saludos
  #12 (permalink)  
Antiguo 19/06/2003, 11:30
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. uno/dos/N formularios es lo de menos .. eso ya va en temas de "usabilidad" .. el caso que recojas tus variables y las distribullas en los INSERT a tu(s) tabla(s) que correspondan ..

Con un formulario sobra para dar el alta .. Pero igual tendrás que tener esos formularios por ejemplo si quieres ofrecer el que cambien sólo la contraseña .. o que accedan a su perfil .. Pero vamos . .esto es lo de menos .. Precupate ahora de "modelar" bien tu BD ..

Como observación .. usas ambos "ID" de tus tablas como "llave" .. ambos son autoincrementales .. Asegurate de que van a la "par" cuando se generan ambos registros ..

Yo lo que hago (y lo que más veo que se hace en Msyql .. pues no soporta integridad referencial ni claves foraneas (PK) en ese tipo de tablas que estas usando y que son las más comunes ..) Es usar como ya te dije un campo ID_tabla_relacion

El proceso de dar de alta un registro es:

1) se crea el registro de la tabla Usuarios (con el ID autoincremental) ...
2) se obtiene el ID últmo generado (con msyql_insert_id() lo puedes obtener ..)
3) ese ID lo uso en el INSERT a la tabla "full" en el campo (extra) id_usuario ..

4) los "SELECT" serían: ... SELECT usuario.*,clientesfull.* FROM usuario, usuariosfull WHERE usuario.id=clientesfull.id_usuario

De esta forma.. las relaciones podrían ser 1 -> N (1 registro usuario -> N clientesfull o 1 -> 1 .. eso ya lo decidiras en tu programción pues Msyql no lo va hacer ..)

Quedaría tu tabla clientesfull:

CREATE TABLE `clientesfull` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`id_usuario` tinyint(4) unsigned NOT NULL,
`estado_cuenta` char(1) NOT NULL default 'P',
etc...

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 19/06/2003, 12:45
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Hola
Ahora entiendo lo que me comentabas de ID_tabla_relacion.
Ya creado ese campo dentro de la tabla clientesfull y para comprobar si he modelado bien la base de datos he testado la consulta SQL:
SELECT usuarios.*, clientesfull.* FROM usuarios, clientesfull
WHERE usuarios.id = clientesfull.id_usuario
y me muestra correctamente los resultados

La relación que quiero programar clientesfull-usuarios será en teoría 1-1 pero creo que para ser realista debería de ser 1-n ya que de
hecho algún cliente (no todos) podrá tener varios aliases (y contraseñas).

Antes de pasar a programar en php comento lo que quiero hacer para conforme lo vaya desarrollando la gente pueda ir comentando la jugada si quiere

- Crear un formulario
- Crear un script .php (que tendrá un include nombreformulario.html)

Proceso:
El usuario apuntará con el navegador a script.php, (se mostrará el formulario)
se le pasará una variable que vendrá de otro script .php (que se llamará $num_cuentas (y que será un número) y en base a esa variable se repetirán
los campos que comento más abajo. Lo que usuario deberá ver (para rellenar los campos) es:

El formulario con los campos nombre, apellidos, bla, bla, bla...
y aquí viene lo más difícil para mi en base al valor de $num_cuentas se mostrarán un número determinados de campos "alias" y "password"
Así si $num_cuentas= 2
veríamos los campos generales y repetidos dos veces los campos
"alias" ""password" y "repita password"

Si os parece bien el planteamiento me pondré a empezar a escribir el script esta misma noche, por supuesto si alguien tienen una sugerencia mejor
que lo diga antes de empezar

Saludos y gracias
  #14 (permalink)  
Antiguo 19/06/2003, 13:07
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. para eso de los aliases y password .. usa un bucle para generar tu formulario ...

formulario.php?num_cuentas=3


formulario.php será:

Código PHP:
<?
echo <<<HTML
<form action="procesa.php" method="post">

<!- aquí tus campos fijos .. input etc que necesites ... -->
HTML;

for (
$contador=0$contador <= $num_cuentas$contador++){

echo 
"Alias cuenta: ".$contador." <input type=\"text\" name=\"alias[]\"><br>";

echo 
"Pass cuenta: ".$contador." <input type=\"text\" name=\"pass[]\"><br><br>";

}

echo <<<HTML
<!-- resto de campos .. botones submit .. cierrer de tag de formulario .. etc que haga falta -->
HTML;
?>
Fijate que es un simple bucle .. ahí se genera "dinámicamente los campos que se necesiten .. A su vez .. fijate también que se usa como nombre de pass y de alias el [] .. eso es para que obtengas un array con esos alias y pass para que las proceses en un bucle o en un "IN(lista)" de SQL en tu INSERT que vas hacer a tu tabla ..

Y otra observación:
el campo de la tabla usuariosfull :
`estado_cuenta` char(1) NOT NULL default 'P',

se lo pasaría a la tabla usuarios que es lo más lógico .. Tus usuarios se conectaran y autentificaran usando esa tabla .. luego una vez en el sistema ya haran sus consultas a su perfil si lo necesitan .. pero antes debe validar ese campo "P" .. "estado_cuenta" ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 19/06/2003 a las 13:15
  #15 (permalink)  
Antiguo 19/06/2003, 21:01
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Cita:
Y otra observación:
el campo de la tabla usuariosfull :
`estado_cuenta` char(1) NOT NULL default 'P',

se lo pasaría a la tabla usuarios que es lo más lógico .. Tus usuarios se conectaran y autentificaran usando esa tabla ..
luego una vez en el sistema ya haran sus consultas a su perfil si lo necesitan .. pero antes debe validar ese
campo "P" .. "estado_cuenta" ..
No Cluster, la finalidad del script es crear un un formulario que permita dar de alta a los usuarios dentro de una base de datos,
pero posteriormente ellos no han de acceder para nada a esta base de datos, sólo los administradores del sistema.

Por lo tanto `estado cuenta` desaparece y en su lugar creo también otra
`fecha` datetime NOT NULL default '0000-00-00 00:00:00',
en la tabla clientesfull.

El porqué es bien sencillo, la fecha de la tabla clientesfull es para saber la antiguedad de los miembros, y la fecha de la tabla
usuarios nos permitirá saber cuál ha sido la última fecha (y hora exacta) de renovación de la cuenta. El script que estoy
desarrollando se ocupará solamente de lo que es el proceso de recoger la información que introduce el usuario e introducirla
en la base de datos.
Cuando termine con este primer script termine crearé 2 scripts más uno para que los usuarios puedan cambiar la contraseña
que tienen cuando quieran y otro que les permita refrescar la fecha de la tabla usuarios cuando hagan una renovación de
la cuenta.

En resumen:
En la tabla clientesfull se escribirá sólo una vez los datos del usuario, mientras que en la tabla usuarios se actualizará en función
de la(s) renovacion(es) de los usuarios
  #16 (permalink)  
Antiguo 20/06/2003, 10:26
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Gracias Cluster lo del blucle de aliases y pwd funciona de coña :)

Ahora ya estoy trabajando con el script, lo que hará será que después de que hayan sido recogidas las variables del formulario las insertará en la base de datos.

Como voy desarrollándolo paso a paso quería saber si a la validación le dais el ok. La duda que me surge es que cómo decirle a la validación el número de campos
de aliases y pwd que ha de validar teniendo en cuenta que es un valor que cambia en función del número de cuentas que haya elegido el usuario previamente a
crear (que s la variable $num_cuentas).

Código PHP:
$hay_errores TRUE;

if (empty(
$_POST["alias"]) || empty($_POST["pass01"]) || empty($_POST["pass2"])){
    if(empty(
$_POST["usuario"]))
        
$mensaje "No ha rellenado todas de las casillas, por favor inténtelo de nuevo";
    if(empty(
$_POST["pwd01"]))
        
$mensaje "No ha rellenado todas de las casillas, por favor inténtelo de nuevo:";
    if(empty(
$_POST["pwd02"]))
        
$mensaje "No ha rellenado todas de las casillas, por favor inténtelo de nuevo:"
           
} else {
    
$hay_errores FALSE;
}
if(!
$hay_errores
{
/* etc... */ 
Lo mismo me pasa a la hora de aplicar la comparación entre los dos campos del password no se donde lo he de poner y como decirle que hay "x" parejas
a comparar de passwords (de dos en dos claro).
He llegado hasta aquí:

Código PHP:
 if($pwd01!=$pwd02) {
echo 
"Los passwords deben coincidir<br>";
echo 
'Clica <a href="altausr.php">aquí</a> para volver al formulario';
} else {
/* etc... */ 
  #17 (permalink)  
Antiguo 20/06/2003, 10:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Debes usar otra vez bucles .. pero en este caso lees los arrays que has enviado desde el formulario .. Recuerda que el nombre de los <input> son arrasy ahora alias[] pass1[] pass2[]

Recorre esos arrays y validar cada elemento en cada iteracción del bucle .. A su vez .. es recomendable crearte un array de errores la cual vas "cargando" según se produca un error. De esta forma es muy cómodo tanto presentar los mensajes de error .. como si es necesario "pasar" (a otra pagina los errores) .. como de simplemente detectar si hay algún error para no continuar el script ...

El hecho de que el bucle sólo cuente (count() ) el total de elementos del array "alias" es simplemente porqué son arrays que coinciden su nº de elementos ..

Código PHP:
// creo un array .. la cual usaré para guardarme los errores que tenga tras cada validación ..
$errores=array();

for (
$contador=0$contador <= count($_POST['alias']); $contador++){

   
// validas que tenga valor el "alias" ..
   
if (empty($alias[$contador])){
      
$errores[]="Error, cuenta: $contador .. Debe especificar Alias";
   }

   
// validas que tenga valor el "pass1" ..
   
if (empty($pass1[$contador])){
      
$errores[]="Error, cuenta: $contador .. Debe especificar Pass1";
   }

   
// validas que tenga valor el "alias" ..
   
if (empty($pass2[$contador])){
      
$errores[]="Error, cuenta: $contador .. Debe especificar Pass2";
   }

   
// Validas si los pass1 y pass2 coinciden ..
   
if ($pass1[$contador] != $pass2[$contador]){
      
$errores[]="Error, cuenta: $contador .. no coinciden passwords";
   }

}

// Verico si el array errores contiene 1 elemento al menos .. Si es así hay errores que mostrar sino, continuo con el proceso de esas variables

if (count($errores) > 0){
   echo 
"Existen los siguientes errores:<br>";
   foreach (
$errores as $error){
     echo 
"<li>$error</li>";
   }
} else {

// Haces el proceso de tus variables (los datos a este punto serán validos ...


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #18 (permalink)  
Antiguo 21/06/2003, 12:20
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Hola Cluster
No me funciona correctamente la validación. El bucle que me pasaste lo he insertado en procesa.php cuando envio los datos del formulario a procesa.php me da
el siguiente error:

Cita:
Existen los siguientes errores:

Error, cuenta: 1 .. Debe especificar Alias
Error, cuenta: 1 .. Debe especificar Pass1
Error, cuenta: 1 .. Debe especificar Pass2
Muestro el código de los dos archivos:

formulario.php

Código PHP:
<?
echo <<<HTML
<form action="procesa.php" method="post">

<!- campos fijos ...  -->
HTML;

for (
$contador=0$contador <= $num_cuentas$contador++){

echo 
"Alias cuenta: ".$contador." <input type=\"text\" name=\"alias[]\"><br>";

echo 
"Pass cuenta: ".$contador." <input type=\"password\" name=\"pass1[]\"><br>";

echo 
"Pass cuenta: ".$contador." <input type=\"password\" name=\"pass2[]\"><br><br>";

}

echo <<<HTML
<!-- resto de campos .. botones submit .. cierre de tag de formulario .. etc -->
  <input type="submit" value="Enviar datos">
</form>
HTML;
?>
procesa.php
Código PHP:
<?
tenga tras cada validación 
..
$errores=array();

for (
$contador=0$contador <= count($_POST['alias']); $contador++){

   if (empty(
$alias[$contador])){
      
$errores[]="Error, cuenta: $contador .. Debe especificar Alias";
   }

   if (empty(
$pass1[$contador])){
      
$errores[]="Error, cuenta: $contador .. Debe especificar Pass1";
   }


   if (empty(
$pass2[$contador])){
      
$errores[]="Error, cuenta: $contador .. Debe especificar Pass2";
   }

   if (
$pass1[$contador] != $pass2[$contador]){
      
$errores[]="Error, cuenta: $contador .. no coinciden passwords";
   }

}

if (
count($errores) > 0){
   echo 
"Existen los siguientes errores:<br>";
   foreach (
$errores as $error){
     echo 
"<li>$error</li>";
   }
} else {

// etc. 
}
etc...
?>
  #19 (permalink)  
Antiguo 21/06/2003, 17:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si usamos los arrays superglobales .. debería ser:

Código PHP:
if (empty($_POST['alias'][$contador])){ // (para los alias, pass1 y pass2 .. que son arrays ..) 

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #20 (permalink)  
Antiguo 23/06/2003, 12:51
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Para insertar la fecha se hace mediante now() pero dentro de la base de datos tengo en su correspondiente tabla el campo:

`fecha_full` datetime default NULL,

La duda que tengo ya que no me chuta es que yo escribo

Código PHP:
$query="INSERT INTO usuarios (fecha, alias, pwd, etc...) VALUES (now(), '$alias', etc...)"
Pero como le digo la hora exacta (aparte de la fecdha) teniendo en cuenta que el campo es un DATETIME

Gracias y Saludos
  #21 (permalink)  
Antiguo 23/06/2003, 16:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. que me acuerde now() te devuelve la FECHA y HORA actual ..CURDATE() por ejemplo sólo te dá la fecha ...

Por lo demas .. yo siempre uso NOW() .. (en mayusculas..). Siempre que tu campo sea de típo DATETIME deberías ver la fecha correcta.

Cualquier cosa .. usa el manual de mysql: www.mysql.com

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #22 (permalink)  
Antiguo 25/06/2003, 17:59
Avatar de Henker  
Fecha de Ingreso: febrero-2003
Mensajes: 37
Antigüedad: 21 años, 2 meses
Puntos: 0
Hola a tod@s
Ya creo empezar a ver el final del camino... ya casi casi lo tengo, me queda que pulir y testar lo que tengo escrito pero antes de
ponerme con ello hay una duda de la cual no he encontrado respuesta en los respectivos manuales de php y Mysql es de
cómo insertar a la vez (o de manera consecutiva) datos en dos tablas distintas, me refiero a por ejemplo:

Código PHP:
$query="INSERT INTO nombretabla_Z (a, b, c) VALUES ('$a','$b','$c')";

/* y que a la vez (o después de haber ejecutado el insert anterior) me ejecute también... */

$query="INSERT INTO nombretabla_X (d, e, f) VALUES ('$d','$e','$f')"
La razón es bien sencilla unos datos del formulario que creé previamente se han de insertar en una tabla y otros datos en la otra.

Saludos
  #23 (permalink)  
Antiguo 25/06/2003, 22:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. así como lo tienes .. pero haciendo un mysql_query($qurey) de cada instrucción SQL que tienes en tu $query ...

Código PHP:
$query="INSERT INTO nombretabla_Z (a, b, c) VALUES ('$a','$b','$c');";
mysql_query($query);

$query .="INSERT INTO nombretabla_X (d, e, f) VALUES 
('$d','$e','$f')"
;
mysql_query($query); 
El caso que mysql_query() no puede ejecutar mas que sólo una intrucción a la vez .. así que no podrías hacer por ejemplo:

$query="INSERT INTO nombretabla_Z (a, b, c) VALUES ('$a','$b','$c');";
$query .="INSERT INTO nombretabla_X (d, e, f) VALUES
('$d','$e','$f')";

mysql_query($query);

Pues sólo se ejecutará la primera (antes del ; que es el separador de instrucciones SQL para Mysql)

(a todo esto .. suponemos que la tabla z y la x están en la misma BD .. si fuera en diferente BD .. tendrías que realizar dos llinks de conexión difertente para poder seleccionar la BD que corresponda en cada caso . .Pero, este no es tu caso concreto).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 11:42.