Duda PHP

Hola

Estoy haciendo una web sobre la serie Dexter (trabajo de clase jajaja)

En donde para acceder a la seccion Descargas necesitas estar registrado.

Mi duda es en la siguiente:

Como veis en esta imagen

Imagen

Si el usuario ha dejado el campo de Usuario del formulario vacio,se le muestra el mensaje que aparece en rojo.Igual pasari si dejase la contraseña vacia o los dos campos vacios.Se le muestraria un mensaje de error indicando el error.

La pagina donde te registras es registro.php,de esta web al darle al boton REGISTRARSE se mandan los datos a comprueba.php que los "analiza".

Y por ejemplo el codigo del error del nick vacio es el siguiente:

COMPRUEBA.PHP
/*REGISTRA AL USUARIO Y HACE COMPROBACIONES*/
if ($_REQUEST['registrar']==TRUE) {
   if ($nombre==""){
           $_SESSION['error']=nonick;
      header("Location: registro.php");
}


el header lo devuelve a la web de registro.php donde mediante:

REGISTRO.PHP
<?php
session_start();
if ($_SESSION['error']==nonick){
print' Aqui va el html de la web y tambien el <p> que imprime el error
';


El problema en cuestion es que claro...si refresco la web registro.php,navego por la web y vuelvo a pagina registro.php,me seguira mostrando el error,porque la sesion['error'] sigue "abierta".

La pregunta es si hay alguna forma de indicarle que si se recarga la web se destruya la sesion.
hackeao escribió:La pregunta es si hay alguna forma de indicarle que si se recarga la web se destruya la sesion.


http://es.php.net/function.session-destroy
Zekisoft escribió:
hackeao escribió:La pregunta es si hay alguna forma de indicarle que si se recarga la web se destruya la sesion.


http://es.php.net/function.session-destroy


Yaya eso lo se,el problema es que no se exactamente donde usarla U.u
Pues podrías hacer que al entrar en esa pagina compruebe si la sesión de logueado esta a true o algo asi xd Esk no se, kizas no acabo de entenderlo :S Si no existe pos la creas cuando se loguea y luego compruebas al volver

if ($_SESSION['logged']==TRUE){
   //destruyes
}else{
  // ...
}
A ver jejeje

La web consta de lo siguiente:

* INDEX.PHP --> web principal.Del que "cuelgan" las secciones.

Imagen

Como se ve en la imagen,en el menu arriba hay un pequeño formulario de login.En el que para registrarse se clicka en donde pone REGISTRARME y te lleva a REGISTRO.PHP

En REGISTRO.PHP se muestra el siguiente formulario:

Imagen

Que al darle al boton registrarse,manda los "campos" del formulario a comprueba.php que hace las comprobaciones pertinentes y "regresa" a registro.php en donde se le dice al usuario:

1) que se ha registrado correctamente,que sus datos son X

2) se le muestra un mensaje de error,como por ejemplo el de la imagen de arriba,que se le indica que dejo el campo usuario vacio.


En el caso 2,las comprobaciones las hago con $_SESSION['error'].

Por ejemplo...

if ($_REQUEST['registrar']==TRUE) {
if ($nombre==""){ ---> Si el usario esta vacio
$_SESSION['error']=nonick; --> la session error es igual a nonick
header("Location: registro.php"); --> vuelve a registro.php
}


Y en registro.php en el caso de que $_session[error] sea igual a nonick,muestra el formulario de registro de la segunda imagen,añadiendo con un <p> el mensaje de error.

El problema es que yo cojo en el navegador,le doy a F5,y me sigue mostrando el error en rojo. O voy a la seccion Personajes,le doy a registrarme (me lleva a registro.php) y sigue apareciendo el error en rojo.

Se que lo sigue mostrando porque la $_session no esta destruida o cerrada. La duda es donde la cierro. Donde la acoplo,para hacer lo que quiero jajaja

EDITADO: He "arreglado" el problema de por ejemplo si me iba a la seccion Temporadas y volvia a registro.php me mostraba el mensaje de error ultimo,porque la $_Session[error] seguia existiendo. Asi que añadiendo la linea unset($_SESSION['error']); a todos los PHP menos a registro.php consigo subsanar esto. Me queda el de si recargo (F5) :-?
if ($_REQUEST['registrar']==TRUE) {
if ($nombre==""){ ---> Si el usario esta vacio
$_SESSION['error']=nonick; --> la session error es igual a nonick
header("Location: registro.php"); --> vuelve a registro.php
}


Pues pon un else

if ($_REQUEST['registrar']==TRUE) {
if ($nombre==""){ ---> Si el usario esta vacio
$_SESSION['error']=nonick; --> la session error es igual a nonick
header("Location: registro.php"); --> vuelve a registro.php
}else{
$_SESSION['error']=$_POST['nick'];
}


Esk llevo todo el día estudiando y no veo claro el tema xDDDDDDDDD

Si no me doy por vencido y leere las respuestas de otros para kitarme yo tmb la duda [+risas], espero verlo mñn mas claro.. xD
Pero mi problema no es ese jajajaja

Mi problema es que si hay un error,a la hora de registrarse se guarda el error en la variable $_SESSION['error'] que puede tener los siguientes valores:

$_SESSION['error']=nonick --> si el campo usario esta vacio

$_SESSION['error']=nopass --> si el campo contraseña esta vacio

$_SESSION['error']=nada --> Si dejo los dos campos vacios.

Cual es el problema?

Imagina que un usuario...va a registrarse,se deja el campo usuario vacio y se le muestra este error:

Imagen

Y dice bueno voy a intentarlo de nuevo, ye le da a ACTUALIZAR en su navegador o a F5,es decir recarga registro.php.Pero claro com la variable $_SESSION['error'] sigue existiendo,y en este caso teniendo el valor nonick,seguira apareciendo el error de la imagen.Lo que puede "descolocar" al usuario,ademas de no ser muy "limpio" cara a la galeria jajaja

Mi duda es si hay alguna manera de que el php detecte que se recargo la web y borre la variable $_SESSION['error'] con el unset por ejemplo, haga un destroy.

O si hay alguna manera alternativa de hacer esto jajaja
Joder, comprueba los campos con una funcion javascript antes de enviar el formulario y te ahorras todo el jaleo. En el form, a onsubmit le asignas una función javascript que compruebe que los campos están rellenos, si están bien form.submit y si no, pues te dejas un div hidden o vacío para el error en cada campo y o bien lo haces visible o bien le insertas el texto del error y a funcionar.

Suerte con el asunto, saludos!!
Joder, mi nivel de Java es minimo y llevo varios años sin darlo y ya casi no lo recuerdo.
Hombre es poca cosa, si esta noche tengo un rato te paso un codiguillo.

Un saludo!
Joder tíos... tantas respuestas y ni una solución a lo que pide el chaval.

Para empezar, a comprueba.php vas a llegar siempre que le pulses registrar. No necesitas comprobar si fue pulsado:

COMPRUEBA.PHP
<?php
       //Si solo fuéramos a comprobar el nick, este sería el código (hay que comprobar también el pass, ¿eh?)

        session_start();

        $nombre = $_REQUEST["nombre"];

   if ($nombre=="")
        {
           //El nick está en blanco, volvemos:
           $_SESSION['error']=nonick;
           header("Location: registro.php");
        }
        else
        {     
           //Registro correcto, redireccionamos a una página que indique el exito
           header("Location: exito.php");
        }
?>


Luego, el registro, una vez que muestres el error, limpia la variable $_SESSION['error'] para que no vuelva a mostar el mensaje (a no ser que se haya vuelto a cometer el mismo error):

REGISTRO.PHP
<?php
         session_start();

         //Aqui el codigo HTML que genera el principio de la pagina etc... hasta el texto que indica que el user esta mal escrito:

         if ($_SESSION['error']==nonick)
         {
           //Aqui va el codigo PHP que genera el codigo HTML que muestra el error

           //Ahora que el error fue mostrado, ya no lo queremos volver a ver (a no ser que vuelva a ocurrir)
           unset($_SESSION['error']);
         }

         //Aqui continua el HTML
?>


A cerca de lo que te dice el de arriba de usar Javascript para esto: olvidate. Javascript puede usarse para agilizar el proceso de la validación pero las validaciones seguras se hacen en el servidor, el cliente puede desactivar el Javascript y entrarte un rabo en el servidor si no lo validas ahí.

Saludos. Si tienes alguna duda mas, pregunta :).
JAPosti gracias por la ayuda :)

Lo de comprobar que pulse REGISTRAR,lo hice,porque tengo en comprueba se comprueba todo,valga la rebundancia jajaja

Se certifica (o comprueba)

- Inicio Sesion --> Que los datos sean correctos (nick,pass),si se marco recordar la sesion o no,etc,etc

- Registro --> que el formato de nick y password son correctos,que el nick no existe,que se le ha metido todos los campos,etc

- Se cierra session --> Si dedicidio no recordar se borra el $_SESSION y si marco recordar se borra la $_COOKIE


Por eso,como los tres botones ( INICIAR SESION // REGISTRARSE // CERRAR SESION ) van dirigidos al comprueba.php

Por eso usando lo de:

if (nombre_del_boton==TRUE) {

/*Hace lo que tenga que hacer*/

}


compruebo que boton pulso y ya hago lo que corresponda.

El segundo problema que solucionas.Al final el otro dia logre solucionarlo casi como tu jejeje Solo que yo puse un sesion_destroy();

Porque me da igual cargarme las otras sesiones...en este caso uso dos:

- $_SESSION['error'] ---> Donde se memoriza el tipo de error a la hora de registrarse

- $_SESSION['norecor'] --> Donde se memoriza el nick de usuario si eligio iniciar sesion sin recordar su sesion.Entonces en vez de usar una cookie,uso $_SESSION,para asi si cierra y entra de nuevo,le pida iniciar sesion.

Y como si la de error existe,es porque no se inicio sesion,por lo tanto la norecor no existira.Y viceversa :)

Espero que se haya entendido mi explicacion jajajaja

Gracias :)
hackeao escribió:Solo que yo puse un sesion_destroy();

Bien, como quieras. Pero se puede dar el caso en que si te importe que se te vayan algunas variables de sesion. En la última web que hice almacenaba en user el usuario que tiene la sesión iniciada. Tenía una parecida llamada error, que hacía algo similar a la tuya. Si hiciera un session_destroy() se cerraría la sesión del usuario siempre que se cargue la página ;). No te mal acostumbres.

Saludos.
JAPosti escribió:
hackeao escribió:Solo que yo puse un sesion_destroy();

Bien, como quieras. Pero se puede dar el caso en que si te importe que se te vayan algunas variables de sesion. En la última web que hice almacenaba en user el usuario que tiene la sesión iniciada. Tenía una parecida llamada error, que hacía algo similar a la tuya. Si hiciera un session_destroy() se cerraría la sesión del usuario siempre que se cargue la página ;). No te mal acostumbres.

Saludos.


Ya,lo se. Seguramente lo cambie y haga un unset de la sesion del error solo.

Gracias por la ayuda :)
Bueno otra duda que ha ido surjiendo jeje

He creado un nivel de administracion,donde los usuarios que sea admins podran consultar BD y/o borrar nicks de la BD.

Esta parte de definir que usuario es admin o no,esta hecha :)

La duda es a la hora de consultar.Para hacer la consulta,he creado un pequeño formulario con un boton CONSULTAR,el cual si se pulsa,se va al COMPROBADOR.PHP y se ejecuta este codigo:

/*EL ADMIN CONSULTA LOS NICKS*/
if ($_REQUEST['consulta']==TRUE) {
   $_SESSION['valor']=1;
   header("Location: consulta.php");
}


Se regresa con el header al CONSULTA.PHP en donde se ejecuta este codigo:

if ($_SESSION['valor']==1) {
    while ($valor=mysqli_fetch_array($resultado, MYSQLI_ASSOC)) {
           print "<pclass=cen>Usuario: $valor[nick] - Administrador: $valor[admin]</p>"; 
    }
}


Lo que he intentado hacer y no he conseguido es.....

- El while que se encuentra en CONSULTA.PHP tenerlo en el COMPROBADOR.PHP y que en vez de hacer el print "<pclass=cen>Usuario: $valor[nick] - Administrador: $valor[admin]</p>"; guarde la variable $valor en una $_SESION que sera imprimida en el CONSULTA.PHP

Si hago esto,no me imprime todos los nicks,imprime la palabra ARRAY :-?
hackeao escribió:Si hago esto,no me imprime todos los nicks,imprime la palabra ARRAY :-?

Prueba a imprimir esa variable con print_r(var) ;).

Saludos.
Siguiente duda..... Modificar un registro de la base de datos

/*MODIFICA UN REGISTRO*/
if ($_REQUEST['modifica']==TRUE) {
   $consulta="SELECT * FROM datos WHERE nick='$nombre'";
   $resultado=mysqli_query($db,$consulta);
   if (mysqli_num_rows ($resultado)==0) {
      $_SESSION['error']=noencontrado;
      header("Location: modifica.php");
   } else {
      if ($_REQUEST['adminsi']==TRUE) {
         $consulta="UPDATE datos SET admin=si WHERE nick=$nombre";
         $_SESSION['error']=modificado;
         header("Location: modifica.php");
      }
      if ($_REQUEST['adminno']==TRUE) {
         $consulta="UPDATE datos SET admin=no WHERE nick=$nombre";
         $_SESSION['error']=modificado;
         header("Location: modifica.php");
      }
   }
}


Lo que hace es modificar el campo admin de la tabla y ponerle SI o NO,segun lo que se haya elegido.

La variable $nombre se recoje de la siguiente forma: $nombre=($_REQUEST['usuario']);

Aqui os dejo la tabla

Imagen

El problema es basicamente que no se modifica el registro,el campo admin,sigue teniendo los valores que tenia U.u

He probado con ' ' sin ellas......Ya no se que hacer U.u
Claro, porque se te ha olvidado ejecutar la otra consulta :P.

Saludos.
JAPosti escribió:Claro, porque se te ha olvidado ejecutar la otra consulta :P.

Saludos.


Que otra consulta?
hackeao escribió:Que otra consulta?

$consulta="UPDATE datos SET admin=si WHERE nick=$nombre";

Saludos.
JAPosti escribió:
hackeao escribió:Que otra consulta?

$consulta="UPDATE datos SET admin=si WHERE nick=$nombre";

Saludos.


Esta consulta se ejecuta,si se marco el boton de tipo radio con el name="adminsi",en el formulario del modificar.php

Y marcando este boton o el de no,en teoria se ejecutan las sentencias,pero no cambian nada.

Igual te entendi mal :-?

Si puedes y quieres,mandame un MP con tu msn mejor jejeje
Digo que tendrás que hacer:

$resultado=mysqli_exec($db,$consulta);

¿no?

Saludos.
JAPosti escribió:Digo que tendrás que hacer:

$resultado=mysqli_exec($db,$consulta);

¿no?

Saludos.


Juas...tenias razon :)

Añadiendo esta linea ya va

$resultado=mysqli_query($db,$consulta);

U are my god jajajaja

No me tire ayer toda la tarde y hoy en clase igual....y nada de nada :-?
hackeao escribió:Añadiendo esta linea ya va

$resultado=mysqli_query($db,$consulta);

U are my god jajajaja

Te dije exec porque con las librerías que yo utilizaba query era para las consultas y exec para las modificaciones, añadir, borrado...

Saludos.
JAPosti escribió:
hackeao escribió:Añadiendo esta linea ya va

$resultado=mysqli_query($db,$consulta);

U are my god jajajaja

Te dije exec porque con las librerías que yo utilizaba query era para las consultas y exec para las modificaciones, añadir, borrado...

Saludos.


Con query va... [Alaa!]

EDITADO:

Como puedo hacer que el header me redireccione a la pagina de la que viene?

   if ($nombre==""){
      $_SESSION['error']=nonick;
      header("Location: index.php");
   }   


Por ejemplo,si el formulario con el nombre="" es el formulario de descargas.php que el header en vez de redireccionar a index.php,redireccione a descargas.php. La cosa es si se puede poner algo el en HEADER o tendria que hacer para cada caso (para cada web desde la que pueda proceder el error) ?

Puede ser porque estamos usando Mysqli en vez de Mysql?

SOLUCIONADO LA DUDA PUESTA EN EL EDITADO

$url_base = $_SERVER['SERVER_NAME'];
$url_fin = $_SERVER['REQUEST_URI'];
$url = "http://".$url_base.$url_fin;
$_SESSION['web']=$url;


Pongo ese codigo al principio de cada web,y en el header pongo el $_SESSION['web']=$url;
Todavía mas fácil:

header("Location: " . $_SERVER['HTTP_REFERER']);


Esto redireccionará al usuario a la página que estaba antes, sin mas complicaciones. Yo por ejemplo, lo usaba para que, una vez que el usuario había hecho login, el procesador del login llevara al usuario a la página desde la que había hecho login (ya que, todas las páginas de mi sitio web tenían el cuadro de login a la izquierda).

Por cierto, aun no te lo he dicho: me pusieron un 10 en el trabajo, ahora me queda saber si me van a dar la Matrícula de Honor XD.

Saludos.
JAPosti escribió:Todavía mas fácil:

header("Location: " . $_SERVER['HTTP_REFERER']);


Esto redireccionará al usuario a la página que estaba antes, sin mas complicaciones. Yo por ejemplo, lo usaba para que, una vez que el usuario había hecho login, el procesador del login llevara al usuario a la página desde la que había hecho login (ya que, todas las páginas de mi sitio web tenían el cuadro de login a la izquierda).

Por cierto, aun no te lo he dicho: me pusieron un 10 en el trabajo, ahora me queda saber si me van a dar la Matrícula de Honor XD.

Saludos.


Para eso lo quiero yo jejeje

EDITADO:

Otra duda jejeje

Tengo el siguiente codigo como patron,para comparar el nick y contraseña que el usuario mete por formulario a la hora de registrarse
$patron="[[:alnum:]]{5,8}";


En teoria,el alnum solo permite numeros y letras,y no permite ñ,ç,vocales acentuadas,etc.

Pero por ejemplo si le meto como usuario y/o contraseña --> abcde%& lo coje como valido,debido a que los 5 primeros caracteres si cumplen el requisito.

Lo que quiero es que solo se puedan meter numeros,letras o _
¿Te sirve este?
$patron = "^([A-Za-z]|\d)+$";

Prueba a ver si va.

Saludos.
JAPosti escribió:¿Te sirve este?
$patron = "^([A-Za-z]|\d)+$";

Prueba a ver si va.

Saludos.


Mmmmm...... creo que servira.

Mirate ESTA WEB

poniendo el [[:alnum:]] o [[:word:]] no seria lo mismo??
hackeao escribió:
$patron="[[:alnum:]]{5,8}";

En teoria,el alnum solo permite numeros y letras,y no permite ñ,ç,vocales acentuadas,etc.

Cuidado. Según la descripción de la página SI las admites, y no quieres eso, ¿verdad?. Creo que mi solución es mejor.

Saludos.
JAPosti escribió:
hackeao escribió:
$patron="[[:alnum:]]{5,8}";

En teoria,el alnum solo permite numeros y letras,y no permite ñ,ç,vocales acentuadas,etc.

Cuidado. Según la descripción de la página SI las admites, y no quieres eso, ¿verdad?. Creo que mi solución es mejor.

Saludos.


Quiero que el nick y la contraseña tengan:

- Entre 5-8 caracteres (5 minimo - 8 maximo)

- Que estos caracteres solo puedan ser numeros (0-9) o letras (a-z) o _ (guion bajo) --> Ejemplos abc123, a1b2_4s, 41adgf1, etc

- Que NO permita caracteres raros (&,$,%,la coma,el punto,la ñ,la ç,, (),?,etc)
Hecho (incluso he simplificado un poco mi propuesta):
$patron = "^[_A-Za-z0-9]{5,8}$";

Saludos.
JAPosti escribió:Hecho (incluso he simplificado un poco mi propuesta):
$patron = "^[_A-Za-z0-9]{5,8}$";

Saludos.


Gracias,era eso :)

Oye te mando por MP mi msn,si quieres me agregas,para futuras consultas y sas cosas jajaja

Te debo varias men :)
hackeao escribió:Te debo varias men :)

Lo que le debes es un jamón de bellota por lo menos. [jaja]
Otra duda.... :( :(

Quiero imprimir una variable en una caja de texto de un formulario.

<?php
print '<p class=cen><input name="usuario" type="text" size="12" value="$variable"></p>;
?>


Seria algo asi.Lo que quiero hacer es que me imprima la $_COOKIE o $_SESSION con el nick del usuario y que este pueda cambiarlo en la caja de texto y al darle al boton modificar se modifique su nick.

Resumiendo...que se le muestre el perfil del usuario (nick y contraseña) en un formulario con dos cajas de texto,una para el nick otra para la pass y que este pueda modificarlo.
Prueba asi:

<p class=cen>
     <input name="usuario" type="text" size="12" value="<? print $_SESSION["$variable"]; ?>">
</p>

Saludos.
Poniendo esto

<p class=cen><input name="usuario" type="text" size="12" value="<? print $_COOKIE["galleta"]; ?>"></p>


En la caja de texto me imprime esto: <? print $_COOKIE[ y acto seguido a la derecha de la caja ">
Vaya, ¿y asi?

<p class=cen><input name="usuario" type="text" size="12" <? print "value=\"" . $_COOKIE["galleta"] . "\""; ?>></p>

Saludos
Lo consegui jajaja

         if (isset ($_COOKIE['galleta'])) {
            print "<p class=cen><input name=usuario type=text size=12 value=$_COOKIE[galleta]></p>";
         }
JAPosti escribió:Por cierto, aun no te lo he dicho: me pusieron un 10 en el trabajo, ahora me queda saber si me van a dar la Matrícula de Honor XD.


Pues a ver cuánto te ponen en éste, porque macho, se lo estás haciendo tú todo XD
katxan escribió:
JAPosti escribió:Por cierto, aun no te lo he dicho: me pusieron un 10 en el trabajo, ahora me queda saber si me van a dar la Matrícula de Honor XD.


Pues a ver cuánto te ponen en éste, porque macho, se lo estás haciendo tú todo XD


:-?
otra duda mas jajaja

Os comento...

Tengo que hacer una web (cosa casi evidente jajaja) y quisiera hacer una funcion que contenga el menu.

Por ejemplo:

function menu()
{
      <ul>
         <li><a href="#">Homepage</a></li>
         <li><a href="#">Blogs</a></li>
         <li><a href="#">Photos</a></li>
         <li><a href="#">About</a></li>
         <li><a href="#">Contact</a></li>
      </ul>
}


Y luego en cada pagina en donde vaya a ir el menu,llamar a la funcion.

Pero no me aclaro mucho con el tema de funciones y no se si se podria hacer y como llamarla luego exactamente.

Saludos!
Puedes por ejemplo meter la función menu() en un archivo partes_pagina.php con intención de compartirlo. Luego en cada una de las otras paginas (principal.php, contestar.php...) poner arriba require_once("partes_pagina.php"); y en donde quieras que salga el menu, llamar a menu() para que se te escriba el código HTML del menú.

Saludos.
(mensaje borrado)
Mas dudas jajaja

Mirar esto con IE y con Firefox CLICK AQUI

Si...yo tambien lo flipo hahaha

Aqui teneis la hoja de estilos y la web.

Yo creo que es cosa de los tamaños en pixeles.

Adjuntos

44 respuestas