Foros del Web » Programando para Internet » PHP »

Partes del sitio en archivos independientes / Restituir pass olvidada / Catalogo prod

Estas en el tema de Partes del sitio en archivos independientes / Restituir pass olvidada / Catalogo prod en el foro de PHP en Foros del Web. Estoy realizando un sitio web para una empresa de venta de hardware. Ya tengo todo el trabajo bastante terminado pero quiero pulir algunos detalles y ...
  #1 (permalink)  
Antiguo 10/05/2011, 00:08
 
Fecha de Ingreso: mayo-2011
Mensajes: 17
Antigüedad: 13 años, 6 meses
Puntos: 0
Pregunta Partes del sitio en archivos independientes / Restituir pass olvidada / Catalogo prod

Estoy realizando un sitio web para una empresa de venta de hardware. Ya tengo todo el trabajo bastante terminado pero quiero pulir algunos detalles y se me presentaron algunas dificultades:

1. No logro hacer un sistema de para restituir la contraseña de un usuario en caso que la olvide, ya escribí el código php pero no se porque razón no funciona (más detalles abajo).

2. La estructura del encabezado y el pie de cada página se mantiene en cada una de las páginas del sitio, es decir, es igual. Al principio tenía una copia del código de dichas partes en cada una de las páginas, pero cada vez que deseaba cambiar algo, tenía que copiarlo en todas y cada una de las páginas y resultaba muy engorroso, por lo que "centralicé" estas partes en nuevos archivos .php y luego los llamo mediante un php include.

El problema es que algunas de estas partes incluyen formularios o mensajes mostrados mediante jquery UI dialog, y no logro hacer que funcione bien el procesamiento de los datos del formulario (tiene algo que ver con el action del form creo yo) ni que se muestren los mensajes del UI Dialog (más detalles abajo)

3. Me gustaría hacer un catálogo de productos online, quería saber que piensan que es mejor, que programe todo yo, o que use alguna solución como joomla + virtuemart o magento, etc.

MAS DETALLES AHORA SI:

1. Lo que tengo escrito hasta el momento es lo siguiente:

Código:
<?php
			
if(isset($_POST['email']) && !empty($_POST['email'])) {
					
	$email_ = mysql_real_escape_string($_POST['email']);
					
	if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/", $email_)){
		// Error - Email invalido
?>
						
	<script>
                                    
                    $(document).ready(function(){
                    var mensaje = $('<div title="Error"><p>La dirección de e-mail que ingresó no es válida</p></div>');
                    mensaje.dialog( {modal: true, beforeClose: function(event, ui) { window.location.replace("forgotten.php"); } } );
                                
                    });
                                
                </script>
                
<?php
			
	}
	else {
						
		$query = "SELECT Username, Password FROM users WHERE EmailAddress='".$email_."'";
		$result = @mysql_query ($query); 
		$num = mysql_num_rows ($result);
						 
		if ($num == 1) { 
						
			$row = mysql_fetch_array($result, MYSQL_NUM);
			$password_ = rand(100000, 999999);
			$password_crypted = md5($password_);
						
			$query = "UPDATE users SET Password='".$password_crypted."' WHERE EmailAddress='".$row[0]."'"; 
			$result = mysql_query ($query);
							
			$to = $email_;
			$subject = 'Reestablecimiento de contraseña';
			$message = '

			Su contraseña ha sido reestablecida. Se recomienda cambiarla apenas ingrese por primera vez.
		
			------------------------
			Nueva contraseña: '.$password_.'
			------------------------
				
			';
							
			$headers= 'From:[email protected]' . "\r\n";
			mail($to, $subject, $message, $headers);
							
	//Como en el localhost (wampserver) no configure el SMTP no puedo usar la funcion mail() del php, da error, por lo que para probar la funcionalidad creo un alert box con la contraseña que se enviaría al mail
			echo '<script type="application/javascript">alert("'.$password_.'")</script>';
							
?>

	<script>
                                                    
                                    $(document).ready(function(){
                                    var mensaje = $('<div title="Hecho"><p>La nueva contraseña ha sido enviada por e-mail.</p></div>');
                                    mensaje.dialog( {modal: true, beforeClose: function(event, ui) { window.location.replace("index.php"); } } );
                                                
                                    });
                                                
                                </script>
                                
                            <?php
															
						}
					}
				}
			?>
				
            <form action="forgotten.php" method="post" id="forgottenForm" name="forgottenForm" class="formulario">
            
            	<fieldset>
                
                	<p> 
                        
                        <label for="email">E-Mail:</label> 
                        <input type="text" name="email" id="email"/> 
                            
                    </p>
                    
                </fieldset>
            
            </form>
            
            <div class="blankSeparator"><!-- --></div> 
                
			<a class="blueButton fl" onclick="javascript:document.forgottenForm.submit()">Enviar</a>
Las contraseñas de los usuarios las guardo encriptadas en la BD, por lo que no puedo enviarle su contraseña, sino que tengo que generarle una nueva (6 digitos numéricos) y sustituirla en la BD (en forma encriptada), y que el usuario la cambie luego. El código de arriba no funciona, el usuario sigue con su contraseña vieja.

2. Por poner un ejemplo, en el footer, tengo un formulario que recibe un email y lo pone en la lista de distribución mensual de las ofertas. Como el footer esta en todas las paginas y es el mismo, cree un archivo "footer.php" y en cada página lo llamé con:

Código:
<?php include($_SERVER['DOCUMENT_ROOT'] . "footer.php"); ?>
Hasta ahi todo correcto, en todas las paginas aparece sin problemas. Pero cuando quiero hacer uso del formulario que está dentro del footer, me lleva a footer.php en vez de quedarse en la pagina desde la cual se envió y desplegar los mensajes correspondientes en dicha página. El código de footer.php es el siguiente:

Código:
<h3>suscríbase a nuestras ofertas</h3> 
				
<p>Ingrese su dirección de correo debajo para suscribirse. Recibirá nuestro mailing de ofertas una vez al mes.</p>
                
<?php
    if(!empty($_POST['subscribe_email'])) {

        $email = mysql_real_escape_string($_POST['subscribe_email']);
                        
        $checkemail = mysql_query("SELECT * FROM distribution WHERE EmailAddress = '".$email."'");
						
        if(mysql_num_rows($checkemail) == 1) {
?>
                                
	<script>
								
								$(document).ready(function(){
								   var mensaje = $('<div title="Error"><p>La dirección de correo ingresada ya se encuentra en nuestra lista de distribución.</p></div>');
								   mensaje.dialog( {modal: true, beforeClose: function(event, ui) { window.location.replace(document.history.back); } } );
;
								});
								</script>
                                                                                        
<?php
        }
        else {

            $registerquery = mysql_query("INSERT INTO distribution (EmailAddress) VALUES('".$email."')");
            if($registerquery) {
							
?>
								
								<script>
								
								$(document).ready(function(){
								   var mensaje = $('<div title="Hecho"><p>A partir de ahora, recibirás las ofertas a tu dirección de correo una vez al mes.</p></div>');
								   mensaje.dialog( {modal: true, beforeClose: function(event, ui) { window.location.replace(document.history.back); } } );
;
								});
								</script>
                                                         
<?php
					
            }
            else {

?>
								
								<script>
								
								$(document).ready(function(){
								   var mensaje = $('<div title="Error"><p>Lo sentimos, pero ha habido un problema. Inténtalo de nuevo.</p></div>');
								   mensaje.dialog( {modal: true, beforeClose: function(event, ui) { window.location.replace(document.history.back); } } );
;
								});
								</script>
                                                         
<?php
                             
            }
        }
    }
    else {
?>
                    
                    <form action="footer.php" method="post" name="subscribeForm" id="subscribeForm" class="formulario"> 
                        <fieldset> 
                            <div> 
                                <input type="text" name="subscribe_email" id="subscribe_email" class="fl" />
                                
                                <a id="newsletterSignup" class="blueButton"><img src="images/bluebutton_img.png" alt="Suscríbase" /></a>
                            </div> 
                        </fieldset> 
                    </form>
                    <p> 
                        <a href="#" title="Términos de uso">Términos de uso</a> 
                        &nbsp;&nbsp;|&nbsp;&nbsp;
                        <a href="#" title="Política de privacidad">Política de privacidad</a> 
                    </p> 
                    
<?php
    }
?>

3. Lo que hice hasta ahora fue crear 2 bases de datos, una de categorías de productos y otra de los productos en si. El tema es que quiero que en la pagina de catálogo (que se compone de un sidebar a la izq. y el contenido ppal. a la derecha) aparezcan las categorías de la base de datos como links en el sidebar, pero automáticamente, es decir, que yo no tenga que crear manualmente las páginas de las categorías (es más, preferiria que fuera una única página y que cambiara el contenido al ir cambiando de categoría, si es que es posible) y que si al día de mañana se agrega una categoría a la BD que se cree automaticamente en el catálogo. No se como implementar lo antes dicho.

Agradezco toda la ayuda que puedan brindarme sobre cualquiera de los 3 problemas que tengo.

Saludos!
  #2 (permalink)  
Antiguo 10/05/2011, 00:44
Avatar de AndresTorres  
Fecha de Ingreso: abril-2011
Ubicación: Capital Federal, ARG
Mensajes: 49
Antigüedad: 13 años, 6 meses
Puntos: 13
Respuesta: Partes del sitio en archivos independientes / Restituir pass olvidada / Ca

Respecto a lo primero me tope con otro usuario con una inquietud parecida ( su consulta es diferente, pero en los comentarios entenderás a que me refiero ).

http://www.forosdelweb.com/f18/crear-copia-contrasena-sin-encriptar-911118/

Sobre el footer, veo que usas Jquery por lo que podrías hacerlo con ajax, sería muchisimo más simple y dinamico, y no necesitarías siquiera un formulario ni recargar el sitio.
  #3 (permalink)  
Antiguo 10/05/2011, 00:53
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Partes del sitio en archivos independientes / Restituir pass olvidada / Ca

Hola,

punto 1: Puedes encontrar recursos hechos para esto si busca un poco. Si no, lo puedes hacer tu mismo, tendrías que hacer lo siguiente:

Decidir como se recupera el password, por ejemplo, mediante la dirección de correo electrónico. Deberías de hacer un form que ejecute un php que ejecute una sentencia SQL del tipo:

'SELECT COUNT(email) FROM users WHERE email = $email', donde $email es el valor de tu form. ( recuerda filtrarlo por seguridad )

Si la consulta devuelve 1, ( la cuenta existe ), entonces envías un correo con una password nueva que puedes generar aleatoriamente, o si lo quieres hacer mejor, le envías a una página para resetear su password.

Un saludo!
  #4 (permalink)  
Antiguo 10/05/2011, 10:49
 
Fecha de Ingreso: mayo-2011
Mensajes: 17
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Partes del sitio en archivos independientes / Restituir pass olvidada / Ca

Gracias a ambos.

Andrés, como podría implementar la misma función de suscripción pero con AJAX? ya que no tengo conocimientos del mismo. No entiendo como dices que no necesitaria siquiera un formulario. Te agradezco si pudieras darme una mano.

miktrv voy a enviar al correo del usuario un link con el cual lo redirija a otra pagina para elegir un nuevo password, me pareció la mejor solución.
  #5 (permalink)  
Antiguo 10/05/2011, 11:13
Avatar de AndresTorres  
Fecha de Ingreso: abril-2011
Ubicación: Capital Federal, ARG
Mensajes: 49
Antigüedad: 13 años, 6 meses
Puntos: 13
Respuesta: Partes del sitio en archivos independientes / Restituir pass olvidada / Ca

Jquery te permite hacer cosas como esas de manera simple, pero ya para eso deberías ir al subforo correspondiente, este es PHP, lo único que concierne en este subforo es el modulo al cual vas a llamar por ajax...

Este PHP deberá hacer la comprobación que necesites e imprimir un resultado, solamente eso, nada de HTML, solamente algo para que Javascript lo tome y muestre el resultado correspondiente.

Código PHP:
<?php

// modulo ajax de ejemplo
// verificar si un numero es mayor que 10 (jaja simple no?)

$numero = (int) $_POST['numero'];

if( 
$numero 10 ) {
    die(
'1');
} else {
    die(
'0');
}
Ajax hara una peticion con el valor que envies a este PHP, el PHP se ejecuta y le devuelve a Javascript el resultado... Javascript solamente recibe si es mayor o no, y de ahí manejas un mensaje de exito o de error, pero bueno, cuando preguntes en el subforo de Javascript/Ajax te orientarán de una manera menos bruta que yo
  #6 (permalink)  
Antiguo 10/05/2011, 12:31
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 4 meses
Puntos: 165
Respuesta: Partes del sitio en archivos independientes / Restituir pass olvidada / Ca

Hola buenas,

Sí, lo único que tienes que tener cuidado respecto a la página que resetea passwords.

Lo idea sería que no se ( o mejor dicho, que no haga falta en el script ) vea ni por código ni por URL la dirección email a la cual le estas cambiando el password. Tendrías que usar alguna tabla nueva con una id de solicitud o algo así... para mejorar la seguridad, esa solicitud caduca.. espero que me entiendas

Un saludo!

Etiquetas: catalogo, contraseña, include, joomla, olvido, productos
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 14:48.