Comunidad de diseño web y desarrollo en internet online

Insertar y Modificar datos de usuario existente en una bd

Citar            
MensajeEscrito el 13 Nov 2010 08:05 am
Saludos compañeros!

Tengo una bd donde el usuario, el password, y demás datos están ya ingresados, a excepción del correo electrónico. Tengo un php que al ingresar el user y el pass verifica si existe o no el correo. Si existe el correo imprime "Ingreso Exitoso". Por el contrario, si no existe el correo, manda a otra página donde: a) pide que ingrese un correo y que cambie el pass que viene por defecto. Hasta acá el tema funciona, incluidas las páginas de error en caso de no existir el usuario o poner mal el pass.

Mi problema surge al momento de: Ingresar el correo y Cambiar el Password. En lugar de ingresar el correo al usuario antes logueado, inserta una fila vacía en la bd y no doy con el problema.

Resumiendo: Después del "login", una vez verificados user y pass (y comprobado que no existe el correo) envía a "registro" para el ingreso del correo y cambio de password del mismo usuario antes logueado.

login.php

Código PHP :

<?php
session_start();
$_SESSION['rut'];
header("Cache-control: private");
include("conexion.php");
$sql = "select * from usuarios where rut = '". mysql_real_escape_string ($_POST['rut'])."' and password = '".mysql_real_escape_string ($_POST['pass'])."' limit 1";
$resultado=mysql_query($sql,$conexion) or die (mysql_error());  
$data = mysql_fetch_array($resultado);  
if($data==0) { header('Location: login_error.html');; }  
else if (! $data['correo']) { header('Location: registro.php');; }
else {echo "Ingreso exitoso";}  
?>

login.php hace lo que tiene que hacer. Si no existe el correo entonces manda a "registro.html" donde está el formulario "registro" que tiene los siguientes imput: "correo", "pass" y "cpass" y en action va a "reg.php", el cual tiene el siguiente script:

Código PHP :

<?php
session_start();
header("Cache-control: private");
if(isset($_SESSION["rut"])){$rut=$_SESSION["rut"];} 
include("conexion.php");
$mail = "insert into usuarios (correo) values ('". mysql_real_escape_string ($_POST['correo'])."')";
$result = mysql_query($mail);
echo "Correo ingresado exitosamente";
?>

Así como está, lo estuve probando sólo con un form para ingresar el correo pero: a) muestra el mensaje "Correo ingresado exitosamente" pero en la bd me inserta una fila vacía. Si además le inserto la instrucción "UPDATE" para cambiar el password ahí sí que no hace nada. Me arroja errores varios que siempre terminan indicándome la última línea del script donde va el " ?> " Por eso en el script anterior no aparece el update porque tenía la esperanza de al menos hacer funcionar el insert.

¿Alguna idea de dónde está el fallo? A todo esto, el usuario "nobody" que accede a la bd tiene sólo privilegios de "SELECT", "INSERT" y "UPDATE".

¡Ayuda por favor! De antemano muchísimas gracias de antemano por la buena voluntad.

:zzz:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 13 Nov 2010 02:10 pm
Lo que intentas hacer, según entiendo yo, es modificar un registro ya existente por lo tanto lo que debes hacer es UPDATE, no INSERT.
Ahora bien, en el primer script, que es donde compruebas que el usuario está registrado y si tiene o no correo en ninguna parte te guardas el dato del usuario que acaba de loguearse. De hecho declaras una variable de sesión $_SESSION['rut'] la cual no toma ningún valor.
Creo que lo que has querido hacer es esto (en el primer script):

Código PHP :

<?php 
session_start(); 
header("Cache-control: private"); 
include("conexion.php"); 
$sql = "select * from usuarios where rut = '". mysql_real_escape_string ($_POST['rut'])."' and password = '".mysql_real_escape_string ($_POST['pass'])."' limit 1"; 
$resultado=mysql_query($sql,$conexion) or die (mysql_error());   
$data = mysql_fetch_array($resultado);   
if($data==0) { header('Location: login_error.html'); }
else {
   $_SESSION['rut'] = $data['rut']; // aquí guardamos el 'rut'.
   if (!$data['correo']) { header('Location: registro.php'); }
   else { echo "Ingreso exitoso";} 
}
?>

Entonces luego en el script reg.php:

Código PHP :

<?php 
session_start(); 
header("Cache-control: private"); 
if(isset($_SESSION["rut"])) { $rut=$_SESSION["rut"]; }  
include("conexion.php");
$mail = "UPDATE `usuarios` SET `correo` = ".mysql_real_escape_string ($_POST['correo'])." WHERE `rut` = ".$_SESSION['rut']; 
$result = mysql_query($mail); 
echo "Correo ingresado exitosamente"; 
?>


La parte clave es el WHERE del UPDATE, ahí es donde indicas cuál registro es el que quieres actualizar.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 15 Nov 2010 03:14 am
No anda. Sigue sin insertar el correo. He corregido el código con tus sugerencias tal como las expones y no. Sigue sin insertar el correo.

Se me ha ocurrido una cosa. En la pag. "index.html" tengo el formulario con el campo "rut" y el campo "password". Index envía la solicitud a "login.php". Si todo sale bien, envía a su vez a "registro.html" cuyo formulario envía la solicitud a "reg.php". Lo que se me acaba de ocurrir es: La instrucción "session_start" debe estar en "todas las páginas" o sólo en mis archivos php que son los que procesan la información? Es que se me ocurrió que quizás la variable podría perderse al llegar a una página sin la instrucción a pesar de que esa segunda página esté ligada a un php que sí la tiene. No sé si he sido claro.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 15 Nov 2010 04:11 am
session_start debe estar en todos los script donde asignes valores a $_SESSION y donde intentas leer valores de $_SESSION.
La verdad, no entiendo la mecánica de tu sistema.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 15 Nov 2010 05:37 am
Tengo el comando "session_start" en ambos scripts, por lo que debería funcionar. Resumo la idea del sistema:

1. Index. Formulario. Campos: Rut y Password.
- El formulario apunta a "login.php"
- Aquí el Rut y el Pass ya están ingresados a la BD. Sólo falta el correo que el usuario debe ingresar.
- Si existe el correo mostrará el resultado de una consulta en un html o pdf (Esto aún no lo hago)
- Si no existe el correo, llevará a "Registro" donde deberá ingresar el correo y cambiar el Pass.

2. Registro. Formulario. Campos: Correo, Password y Confirmación de Password.
- El formulario apunta a "reg.php"
- El usuario ingresa un correo y cambia el Pass.
- Al actualizar "reg.php" redirige a "Index" para que ingrese con el nuevo Pass y muestre la consulta.

Esa es la idea fundamental.

Lo que sí me funciona: Index, através de login.php verifica el rut y el pass, si no son correctos redirige al Index. Si son correctos, verifica si existe el correo. Si existe, permite el ingreso. Si no existe el correo, envía a la página de registro.

Lo que no me funciona: Una vez en la página de registro, al ingresar el correo y pinchar en el botón, me lanza el mensaje de que se actualizó, tal como sale en el script, sin embargo, no se produce ningún cambio en la BD. Por eso había pensado en el uso de sesiones, para que al llegar al registro, php "recordara" que estamos hablando del mismo usuario identificado por el "rut" y a ese usuario le ingresara el correo y le cambiara el Pass. ¡Y es eso lo que no logro conseguir!

Espero haber sido claro. Una vez más mil gracias por la buena voluntad.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 15 Nov 2010 12:27 pm
Pues no va a quedar otra que pasarnos los scripts y volcados de la base de datos para que podamos reproducir el problema y encontrar una solución, ¿será posible?.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 15 Nov 2010 04:16 pm
este codigo modifica un dato Nombre obtenido password de usuario existente.
obiamente falta aqui el include de coneccion para conectar con la bd y login para que carge los datos del usuario especifico.

Código :

<?php
function modificacion ($password, $name)
   {
      $conexion = Conectarse();

         if (!$conexion)
         {
            echo "<h1> Error al conectar.</h1>";
            exit();
         }

// NO poner comillas simples en nombre de tabla, ni de campos, sólo en valores alfanuméricos.


      $consulta = "UPDATE productos SET productos.name = '$name'";
                $consulta = $consulta . "WHERE password = $password";

      echo $consulta;

      $resultado=mysql_query($consulta,$conexion);

         //cerramos la conexión con el motor de BD
         mysql_close($conexion);
   }
?>

Por atkdesign

31 de clabLevel



 

diseño web

chrome
Citar            
MensajeEscrito el 16 Nov 2010 08:23 am
Muchas gracias por sus respuestas. Probé el script propuesto por atkdesign pero me arroja sólo una página en blanco con la siguiente url: http://localhost/sitio/phplib/registro.php?correo=dsadsa&pass=sa Pasa los datos por la url pero no los inserta en la base de datos.
:shock:

Por otro lado, antes preguntaba si debía poner "session_start" en todo, tanto en mis html como en mis scripts php o sólo en los php. Pregunto esto porque no mezclo php con html. Dicho de otra manera, "index.html" no tienen nada de php y el formulario que contiene apunta a "login.php" de la misma manera que "registro.html" apunta a "reg.php". ¿Debo también poner "session_start" en las páginas html para no perder el hilo de la sesión?

Sigo pensando que el problema está en que la sesión no se inicia correctamente y por eso no "reg.html" no sabe qué hacer con la información del formulario.
:?

Dejo los archivos para que los revisen tal como sugiere DriverOp. Lo subí a Megaupload. Espero no romper ninguna regla del foro.

http://www.megaupload.com/?d=Y7ASOVN1

Gracias por otra vez por la paciencia. Si estoy todo complicado con esto que al parecer es algo simple creo que me volveré loco cuando pase al tema de la consulta después del login. Creo que ahí moriré.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 16 Nov 2010 12:57 pm
Gracias por pasar todos los archivos necesarios.

El problema no es ni la sesión ni la lógica del programa, todo eso está perfecto. Lo que sucede es que la base de datos está en UTF8 y MySQL no acepta los nombres de los campos en las sentencias SQL con comillas simples cuando la conexión a la base de datos es UTF8, en todos los casos devuelve error en la sentencia SQL.

Esto es lo que he descubierto.

Si la sentencia UPDATE está así:

Código MySQL :

UPDATE usuarios SET correo = '[email protected]' WHERE rut = '00999000-k'

No encuentra el registro, no hay error pero nada se cambia.
Si está de esta manera:

Código MySQL :

UPDATE 'usuarios' SET 'correo' = '[email protected]' WHERE 'rut' = '00999000-k'

Devuelve un error de sintaxis en la sentencia. Por alguna razón MySQL cree que 'usuarios' es una cadena de texto y no el nombre de la tabla. Entonces si hago:

Código MySQL :

UPDATE usuarios SET 'correo' = '[email protected]' WHERE 'rut' = '00999000-k'

Me devuelve error de sintaxis en 'correo', de nuevo, MySQL parece pensar que 'correo' es una cadena de texto y no el nombre de un campo de la tabla usuarios.
Ante esto corté por lo sano y armé la sentencia como suelo hacerlo yo, usando apóstrofes para indicar qué es nombre de tabla/campo y qué es cadena de texto, así:

Código MySQL :

UPDATE `usuarios` SET `correo` = '[email protected]' WHERE `rut` = '00999000-k'

Ahora sí que funcionó!
Entonces el consejo que me habían dado cuando metí mano por primera vez en MySQL resultó ser cierto: siempre usar apóstrofes para indicar nombres de tablas y campos (sabía que había una buena razón :P).
Resumiendo, lo que debes hacer es cambiar la línea en reg.php que arma la sentencia UPDATE por esta:

Código PHP :

$mail = "UPDATE `usuarios` SET `correo` = '".mysql_real_escape_string ($_POST['correo'])."' WHERE `rut` = '".$_SESSION['rut']."'";

Enjoy...

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Nov 2010 07:31 pm
Gracias DriverOp por la respuesta. Probé con escribir con apóstrofes primero la línea que escribiste en "reg.php":

Código PHP :

UPDATE `usuarios` SET `correo` = '[email protected]' WHERE `rut` = '00999000-k' 

Sí actualiza la BD. Pero al escribir la línea para que haga lo que deseo:

Código PHP :

$mail = "UPDATE `usuarios` SET `correo` = '".mysql_real_escape_string ($_POST['correo'])."' WHERE `rut` = '".$_SESSION['rut']."'"; 

no hace nada. Sólo manda el mensaje de "Correo ingresado exitosamente" pero no inserta el correo escrito. Estoy enloqueciendo.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 16 Nov 2010 07:59 pm
Acabo de hacer dos pruebas a partir de la respuesta de DriverOp con las líneas de código que están en el mensaje anterior. Como la primera sí funcionaba y la segunda no, entonces las combiné y obtuve lo siguiente:

Código PHP :

$mail = "UPDATE `usuarios` SET `correo` = '".mysql_real_escape_string($_POST['correo'])."' WHERE `rut` = '13288951-1'";

Sigo recibiendo el mensaje de "Correo ingresado exitosamente" pero sin afectar a la bd. Entonces probé con la otra combinación posible:

Código PHP :

$mail = "UPDATE `usuarios` SET `correo` = '[email protected]' WHERE `rut` ='".$_SESSION['rut']."'";

¡Y funciona! A partir de esto ya tengo algo claro: a)La sesión sí funciona pues reconoce que estamos hablando del usuario que ha ingresado su rut en login. Probé creando más usuarios e ingresando desde el index y a todos les ingresó el correo [email protected] b) El problema está entonces en la declaración

Código PHP :

'".mysql_real_escape_string($_POST['correo'])."

que no pasa la varialble 'correo' a la bd. ¿Alguna idea de qué está mal? Por lo menos el error está focalizado.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 16 Nov 2010 11:35 pm
De pronto se me ocurrió la idea de que quizás mysql_real_escape_string fuese el problema, de modo que modifiqué la línea así:

Código PHP :

"UPDATE `usuarios` SET `correo` = '".$_POST['correo']."', `password` = '".$_POST['pass']."' WHERE `rut` = '".$_SESSION['rut']."'";

Y he aquí que sí funcionó, ingresó los datos en la BD y me envió al index para ingresar con el nuevo Password.

Ahora, por motivos de seguridad estoy claro que debo incluir la instrucción mysql_real_escape_string para evitar la inyección sql. ¿Qué alternativa tengo entonces?

Nuevamente gracias por la ayuda. Ya me sale humo de la cabeza de tanto pensar.
:roll:

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 17 Nov 2010 11:02 am
Pues a mi me funcionó tal como dije, con mysql_real_escape_string en su lugar, pero si te molesta, entonces...

Código PHP :

$correo = mysql_real_escape_string($_POST['correo']);
$pass = mysql_real_escape_string($_POST['pass']);
"UPDATE `usuarios` SET `correo` = '".$'correo."', `password` = '".$pass."' WHERE `rut` = '".$_SESSION['rut']."'";

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Nov 2010 05:09 pm
Gracias DriverOp por tu ayuda. Al final pude hacer que funcionara tal como habías indicado. Es extraño pero ayer lo escribí así y no funcionó y hoy sí. Quizás mi pc después de tantos intentos quedó mareado. Jajajajaja... Publico los scripts por si a alguien le sirven:

conexion.php

Código PHP :

<?php  
$conexion = mysql_connect("localhost","usuario de la base de datos", "pass de la base de datos");  
mysql_select_db("nombre de la base de datos", $conexion);  
?>


login.php

Código PHP :

<?php
session_start(); 
header("Cache-control: private");
require_once("conexion.php");
$sql = "select * from usuarios where rut = '". mysql_real_escape_string ($_POST['rut'])."' and password = '".mysql_real_escape_string ($_POST['pass'])."' limit 1";
$resultado=mysql_query($sql,$conexion) or die (mysql_error());
$data = mysql_fetch_array($resultado);
if($data==0) { header('Location: login_error.html'); }
else {$_SESSION['rut'] = $data['rut'];
if (!$data['correo']) { header('Location: registro.html'); }    
else { echo "Ingreso exitoso";}  } //Aquí iría la instrucción a realizar después de un login exitoso pero aún no hago eso.
?>


reg.php

Código PHP :

<?php
session_start();
header("Cache-control: private");
if(isset($_SESSION["rut"])) { $rut=$_SESSION["rut"]; }
require_once("conexion.php");
$sql = "UPDATE `usuarios` SET `correo` = '".mysql_real_escape_string($_POST['correo'])."', `password` = '".mysql_real_escape_string($_POST['pass'])."' WHERE `rut` = '".$_SESSION['rut']."'";
$result = mysql_query($sql);
if ($sql == 0) { header('Location: index.html'); }
else { header('Location: registro.html'); }
?>

Ahora me queda el tema de la validación para que el else { header('Location: registro.html'); } funcione y reenvíe a "registro.html" en caso de que el correo o el pass no pasen la validación. Llevo dos días probando validar el correo con expresiones regulares pero no logro implementarlo ni en javascript (en el lado del cliente) ni en php (lado servidor) ya que por alguna razón (supongo que es un error R50: entre el teclado y la silla) ninguno de los script que he probado logro hacerlo funcionar. Jajajajajaja...


Gracias una vez más DriverOp por la paciencia y buena voluntad. Si tengo más dramas con lo de la validación en php ¿podré seguir abusando de tu disposición?

Saludos a toda la comunidad.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 17 Nov 2010 07:07 pm
Esto va como premio al esfuerzo :P

Código PHP :

function is_email($Addr) {
   $p = '/^[a-z0-9!#$%&*+-=?^_`{|}~]+(\.[a-z0-9!#$%&*+-=?^_`{|}~]+)*';
   $p.= '@([-a-z0-9]+\.)+([a-z]{2,3}';
   $p.= '|info|arpa|aero|coop|name|museum)$/ix';
   return preg_match($p, $Addr);
} // is_email

if (!is_email($correo)) {
   echo "No es una dirección de correo válida.";
}

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.