Puedo registrar, pero como logueo?

Ola, porfin logre poner el codigo correcto para registrar usuarios en mi base de datos, pero lo que no sé y creo q tampoco esta en el tuto, es que, de los datos que ingrese el visitante, sean reconocidos por la tabla de la base, osea q lo reconozca, y que asi pueda ingresar a la pagina principal, no a la index, la cual diria registrate o logueate.. no sé si me expliqué.. Gracias
Hola,

No sé si he entendido bien, lo que quieres hacer es que muestre un index distinto si estás logueado o no, verdad?
Es decir, que aparezcan diferentes opciones (y desaparezcan algunas) si estás logueado.

Si se trata de eso, intentaré ayudarte, aunque a mí las db... no nos llevamos muy bien jejeje
Hola:

Es algo más complicado enseñarte eso, porque debes conecer otras cosas primero. ¿Sabes qué es una matriz o un arreglo? ¿qué es una superglobal en PHP (especialmente $_SESSION)?

Responde eso y te ayudo (para no tener que explicar algo que ya sabes)
la matriz es un array, un especie de listado que puede almacenar datos, si he trabajado y visto muchos videotutoriales sobre arrrays, y las superglobals son variables internas, disponibles siempre en todos los ámbitos, pero no se muy bien que es $_SESION... si no me lo explicas tu, creo q seria bueno q este en el tuto no?, al igual q todo el sistema de login.. bueno si me lo explicas bien, sino lo veré en internet...

y no.. no es eso, eso si sé como hacerlo, gracias..
Hola,

No sé si he entendido bien, lo que quieres hacer es que muestre un index distinto si estás logueado o no, verdad?
Es decir, que aparezcan diferentes opciones (y desaparezcan algunas) si estás logueado.

Si se trata de eso, intentaré ayudarte, aunque a mí las db... no nos llevamos muy bien jejeje
$_SESSION es un arreglo supergloblal que, como has dicho, esta disponible en todos lados siempre y cuando se haya iniciado la sesión con session_start().

El punto de tener este tipo de arreglos es porque si no existieran (también existen las cookies) habría que pedirle al usuario que ingresara su nombre de usuario y contraseña cada vez que presionara en un enlace que este bajo protección (que requiera un usuario logueado). En este caso, el arreglo $_SESSION permite guardar lo que se nos ocurra y estará disponible donde queramos y, en el caso del login, lo que nos interesa es validar una sesión por un tiempo definido o indefinido (este sería el típico ejemplo donde aparece la casilla que dice recordarme).

Antes de seguir explicándote necesito saber si solucionaste el problema con las bases de datos de este tema, porque de lo contrario no te servirá.

Saludos.
resolvi la parte en que no podia enviar datos a mi base, ahora si puedo, tengo el fomulario, y al ingresar datos aparece otra pagina, q se ve lo mismo, pero en el cuerop, o la parte del contenido dice, gracias te has registrado como $nombre, regresa a la pagina principal, q ésta seria la principal de los logueados, no de los no logueados..
y lo unico q se me ocurre es que en mis archivos, cree dos carpetas uno q diga logueado y otro nologueado, y q pz obviamente el no logueado navege x la carpeta respectiva, y el logueado x la otra, per no se si es la mejor idea, y no se como exactamente hacer una diferencia entre ambas :S
La verdad, no es necesario que hagas dos carpetas, sino que con código PHP puedes condicionar lo que quieres mostrar al usuario que ha iniciado sesión. Yo tenía que hacer un sitio con intranet y comencé sin saber nada de PHP al igual que todos los que han seguido el curso (aunque en ese entonces no se había publicado el curso de PHP MySQL), pero nunca lo terminé porque los dueños del sitio se dieron cuenta que la intranet no era necesaria XD. Lo puedes ver aquí. En ese sitio, condiciono con código PHP a la gente que esta logueada a ver lo que necesitan y los que no están logueados solo verán el contenido general. Por ejemplo, esto hace la página index.php (que muestra las noticias publicadas):

index.php
<?php
  include_once('Sesiones.php');
  session_start(); // Esta debe ser la primera línea del archivo, no <html> ni la declaración de DOCTYPE.
  $sesiones = new Sesiones(); // instancia la clase Sesiones. Esta línea debe aparecer, de lo contrario no se podrán utilizar las funciones no estáticas (static) de la clase.
?>
<html>
<head>
</head>
<body>
  <?php
    if($sesiones->isLoggedIn()):  // Muestra el contenido para usuarios registrados y que han iniciado sesión
  ?>
  <!-- CÓDIGO HTML PARA USUARIOS QUE HAN INICIADO SESIÓN -->
  <?php
    else:
   ?>
   <!-- CÓDIGO HTML QUE MUESTRA EL INICIO DE SESIÓN (Y EN CASO DE SER NECESARIO, EL ENLACE PARA REGISTRARSE) -->
   <!-- AQUÍ DEBEN PONER EL CÓDIGO DEL FORMULARIO PARA INICIAR SESIÓN. En mi caso, el formulario llama (en el action) al archivo [B]entrar.php[/B] (que esta más abajo) -->
   <?php
     endif;
   ?>

Clase php: Sesiones.php
<?php
  class Sesiones {
    
		/*
		 * Devuelve una instancia de la propia clase.
		 */
    public static function getSelf() {
      return new Sesiones();
    }

		/*
		 * Codifica la contraseña que se le pase junto con 3 dígitos verificadores.
		 *
		 * @param $pass cadena de texto que representa la contraseña que será codificada.
		 * @parama $salt cadena de texto de un largo determinado para verificar una contraseña.
		 */
    public function hashPassword($pass, $salt) {
      $pass = $this->makeHash($salt.$this->makeHash($pass));

      return $pass;
    }

		/*
		 * Crea un código verificador de 3 dígitos único en cada llamada a la función.
		 *
		 * @return devuelve una cadena de 3 dígitos.
		 */
    public function makeSalt() {
      $cad = md5(uniqid(rand(), true));
      return substr($cad, 0, 3);
    }

		/* public function makeHast();
		 * Codifica la contraseña junto con el dígito verificador para ser comparado con el de la base de datos.
		 *
		 * @param $pass cadena de texto que representa la contraseña que será codificada.
		 * @return cadena de texto codificada
		 */
    public function makeHash($pass) {
      return hash('sha256', $pass);
    }
		
		/* public function valUsr();
		 * Valida la sesión de usuario. Esta es la función que crea la sesión y asigna las variables a la supergloblal $_SESSION para que puedan ser utilizadas donde quiera que se haya utilizado la función session_start().
		 * @param $apodo nombre de usuario utilizado en la sesión.
		 * @param $tipo (opcional) utilizado para reconocer privilegios.
		 * @param $recordar define el tiempo que durará la sesión.
		 */
    public function valUsr($apodo, $tipo = '', $recordar) {
      if(!isset($_SESSION['valid']))
        $_SESSION['valid'] = 1;
      if(!isset($_SESSION['usrId']))
        $_SESSION['usrId'] = $apodo;
      if(!isset($_SESSION['tipo']))
        $_SESSION['tipo'] = $tipo;
      if($recordar == 'on') { // Si la casilla recordar esta marcada, entonces la sesión no caduca...
        session_set_cookie_params(0);
      }
      else { // de lo contrario se da un tiempo de 1 hora 
        session_set_cookie_params(time() + (60 * 60));
      }
      session_regenerate_id();
    }

    /* public function isLoggedIn()
		 * Verifica si el usuario a iniciado sesión.
		 *
     * @return true si ha iniciado sesión y false en caso contrario.
     */
    public function isLoggedIn() {
      if(isset($_SESSION['valid']))
        if($_SESSION['valid'] == 1)
          return true;

      return false;
    }

		/* public function getType()
		 * Devuelve el tipo de privilegios del usuario que ha iniciado sesión.
		 *
		 * @return 0 si el tipo es administrador, 1 si tiene privilegios generales y -1 en caso de ser desconocido.
		 */
    public function getType() {
      if($_SESSION['tipo'] == 'administrador')
        return 0;
      else if($_SESSION['tipo'] == 'usuario')
        return 1;

      return -1;
    }
		
		/* public function salir()
		 * Destruye la sesión actual. Se utiliza al cerrar la sesión.
     */
    public function salir() {
      $_SESSION = array();
      session_destroy();
    }
		
		/* public static function encode_str()
		 * Codifica una cadena en base 64.
		 *
		 * @param $str cadena de texto que será codificada.
		 * @return 0 si la cadena de texto pasada esta vacía, de lo contrario devuelve la cadena cofificada.
		 */
    public static function encode_str($str) {
      if(!isset($str)) {
        print 'No se ha especificado información válida.';
        return 0;
      }

      return base64_encode($str);
    }

		/* public static function decode_str()
		 * Decodifica una cadena codificada en base 64.
		 *
		 * @param $str cadena de texto que será decodificada.
		 * @return 0 si la cadena esta vacía, de lo contrario devuelve la cadena decodificada.
		 */
    public static function decode_str($str) {
      if(!isset($str)) {
        print 'No se ha especificado información válida.';
        return 0;
      }

      return base64_decode($str);
    }
  }
?>

Para iniciar la sesión, hay que crear un formulario para que llame a un archivo que comience la sesión. En mi caso, este archivo se llama entrar.php, pero se puede llamar como sea, mientras lo especifiquen en el action del formulario:

entrar.php
<?php
  session_start();
  include_once('Sesiones.php'); // incluye el archivo Sesiones.php
  //get_files('Sesiones.php,UrlHandling.php,Conexion.php'); // Ignorar esta línea.
  $usuario = $_POST['apodo']; // Recibe el nombre de usuario desde el formulario a través de POST.
  $clave = $_POST['pass'];      // Recibe la contraseña desde el formulario a través de POST.

  /* Pregunta si $_POST['remember'] tiene algo (esta es la casilla que recuerda la sesión). Si esta activa, esta valdrá On, de lo contrario estará vacía (por lo que el else es inútil jajajajjaja) */
  if(isset($_POST['remember'])) 
    $recordar = $_POST['remember']; 
  else
    $recordar = 'off';
  //$pag = UrlHandling::clear_url($_SESSION['last']); // Ignorar esta línea por ahora
  //$conexion = new Conexion(); // Instancia una clase creada por mí (utilizada para crear la conexión a la base de datos y generar consultas sql). Por ahora ignorenla.
  $con = mysql_connect('localhost', 'usuario_base_datos', 'contraseña_base_datos');
  mysql_select_db('base_datos', $con); // la conexion ($con en este caso) creo que es opcional.
  //$con = $conexion->getConnection(); // Ignorar
  //$usuario = $conexion->escape($usuario); // esto llama a mysql_escape(); lo mismo que la siguiente línea.
  $usuario = mysql_escape($usuario); // Prepara la cadena para ser insertada en la BD.
  //$clave = $conexion->escape($clave);
  $clave = mysql_escape($clave); 
  $usuario = strtolower($usuario);   // Convierte los caracteres a minúsculas para hacer las comparaciones.
  $campos = "password, salt, tipo"; // El campo salt y tipo probablemente no estará en su base de datos, por lo que debes borrarlo, quedando así $campos = "password";
  $tabla = "usuario";                      // Tabla en la base de datos desde donde se extraerán los datos (debes cambiarla por la tuya).
  $condicion = "WHERE apodo='" .$usuario. "'"; // $condicion es la condición de comparación en la base de datos.
  $result = mysql_query('SELECT '.$campos.' FROM '.$tabla.' '.$condicion, $con);

  /* Si no hay al menos 1 (en realidad debería haber solo una fila si es que la base de datos está bien diseñada) fila, entonces se equivocó de usuario o simplemente no existe y muestra un mensaje */
  if(mysql_num_rows($result) < 1) {
    mysql_free_result($result); // libera recursos
    mysql_close($con); // cierra la conexión
    $msg = Sesiones::encode_str('Usuario desconocido'); // Codifica el mensaje. Esto lo utilizo porque es enviado a través de GET y debería impedir la inyección de código (eso creo).
    header('Location: ' .$pag. '?msg=' .$msg);  // Se redirige a la página $pag con el mensaje que le pases.
  }
  else {
    /* mysql_fetch_array($result, MYSQL_ASSOC) devuelve un arreglo con parejas clave valor. Esto quiere decir que devolverá un arreglo que tendrá un índice para el nombre de la columna el cual contendrá el valor de dicha columna. */
    $userData = mysql_fetch_array($result, MYSQL_ASSOC);
    $sesiones = new Sesiones();  // Instancia la clase Sesiones para poder utilizar los métodos no estáticos (el método encode_str anteriormente utilizado es estático (static)).
    //$hash = $sesiones->makeHash($userData['salt'].$sesiones->makeHash($clave)); // Esto no creo que les sea útil, así que ignorenlo.

    // Comparamos la contraseña extraida desde la base de datos con la ingresada por el usuario:
    if($clave != $userData['password']) {  // si no coinciden se devuelve a la página $pag mostrando el mensaje que se especifique en la variable $msg.
      mysql_free_result($result);
      mysql_close($con);
      $msg = Sesiones::encode_str('Contraseña incorrecta.');
      header('Location: ' .$pag. '?msg=' .$msg);
    }
    else {  // Si llegamos hasta aquí es porque el usuario existe y la contraseña coincide.
      $sesiones->valUsr($usuario, '', $recordar);  // Inicia la sesión con el usuario ingresado, el tipo indicado (se puede ignorar) y el tiempo que durará la sesión ($recordar).
      mysql_free_result($result);
      mysql_close($con);
      header('Location: ' .$pag); // Redirige a la página que ustedes indiquen.
    }
  }
?>

Por si acaso, como este sitio tenía una intranet, los usuarios no se podían registrar a su antojo, sino que había un administrador inicial (que a todo esto, el nombre de usuario es admin y la contraseña es 123456) que podía crear usuarios con privilegios de administrador o sin privilegios.

Revisa el código y la página para que veas lo que hace. Probablemente tengas muchas dudas, así que pregunta no más.

Saludos.
WTF! :S ahh está bonito el código pero no entendí :S si lo creaste, aun sin existir el tuto de PHP & MySQL... dónde lo aprendiste?
El 80% son cosas, o palabras, o no sé cómo se llamen que no enteindo, está bien las explicaciones en los comentarios y gracias por tomarte el tiempo pero no entiendo...
Hmmmm, entonces es porque quizás no tienes experiencia en lenguajes de programación ¿has programado algo antes, ya sea en C/C++, Java, Perl, Python u otros?. La diferencia puede estar ahí: cuando yo comencé a estudiar PHP ya había estudiado programación en C++ y Java (aún sigo aprendiendo).

Te pido disculpas por haber asumido algo que no debía (otra vez creo XD). Si bien PHP es un lenguaje que muchos programadores pueden considerar simple, la verdad es que es muy extenso.

Lo siguiente es la forma más simple de iniciar sesión:

index.php:
<?php
	session_start();
?>

<!DOCTYPE ...>
<html>
 <body>
	<form id="login" action="login.php" method="post">
		<input type="text" name="usuario" />
		<input type="password" name="pass" />
		<!-- AL PRESIONAR EN "INGRESAR" SE ENVIAN LOS DATOS AL ARCHIVO LOGIN.PHP A TRAVÉS DE POST -->
		<input type="submit" value="Ingresar" />
	</form>
 </body>
</html>
<?php
	session_start(); // Nunca debe faltar si es que vamos a utilizar sesiones (arreglo $_SESSION).
  $usuario = $_POST['usuario'];
	$pass = $_POST['pass'];
	
	$conexion = mysql_connect('', '', ''); // Hay que escribir los datos de conexión.
	mysql_select_db('bd', $conexion);
	
	/* Con lo siguiente se extrae solamente la contraseña de la tabla especificada */
	$result = mysql_query('SELECT password FROM tabla WHERE usuario=\''.$usuario.'\'');
	
	// Pregunta si NO hay resultado (el signo de fin de exclamación (!) niega la expresión, o sea, si se pregunta por !verdad, esto significa falso:
	if(!$result) {
		// mostrar un mensaje indicando que el usuario no existe
		
		// Libera el resultado.
		mysql_free_result($result);
		// Cierra la conexión con la base de datos:
		mysql_close($conexion);
	}
	else {  // De lo contrario sabemos que al menos el usuario existe:
		$arreglo = mysql_fetch_array($result, MYSQL_ASSOC);
		// Si la contraseña extraída de la base de datos ($arreglo['password']) es distinta (!=) a la ingresada ($pass):
		if($arreglo['password'] != $pass) {
			// Muestra un mensaje indicando que la contraseña no coincide.
			// Libera el resultado.
			mysql_free_result($result);
			// Cierra la conexión con la base de datos:
			mysql_close($conexion);
		}
		else { // De lo contrario la contraseña coincide y se procede a validar la sesión:
		
			/* Esto se asegura de que la variable 'valid' (se puede llamar como sea: iniciada, 
			 * valida, etc.; la idea es que este relacionada con lo que hace, que en este caso 
			 * hace que la sesión sea válida) 
			 */
			if(!isset($_SESSION['valid']))
				/* Puede tomar el valor que sea, excepto un recurso. Véase http://php.net/manual/es/language.types.resource.php (recursos).
				 * También podría ser $_SESSION['nombre_sesion'] = [true|false]; (eligiendo true o false y sin los corchetes).
				 */
        $_SESSION['valid'] = 1;
				
				// Esto pregunta lo mismo que la anterior, pero para la variable usrId.
				// En este caso, usrId representa el nombre del usuario que ha iniciado sesión,
				// y en este caso creo que usrId no dice lo que realmente representa, así que,
				// debería cambiarlo por sesion_usuario (por ejemplo).
				if(!isset($_SESSION['usrId']))
					$_SESSION['usrId'] = $usuario;  // Obtendrá el valor del usuario que ha iniciado sesión.
				
				// Esto renueva el identificador de sesión. No recuerdo si era necesario o no XD.
				session_regenerate_id();
				
				/*
				 * header(); es una forma de redireccionar automáticamente.
				 * Generalmente se le pasa una URL.
				 */
				header('Location: index.php');
				
				// le podría pasar parámetros a través de get así: header('Location: index.php?variable=valor&variable1=valor'); los valores que uno quiera.
		}
	}
?>

Ahora, como tarea podría dejarte que mostrarás el mensaje "Bienvenido usuario" jejeje.

Espero que ahora si se entienda algo, porque hasta ahora me muero de hambre como profesor XD.

Saludos.
Hahaha, ahora sí, mi nivel no es muy alto que digamos, ahora si entiendo más. Y no es que no hayas explicado bien tu penúltima respuesta, es que yo entiendo mejor con vídeos y audio :P por eso se me hizo extenso el curso, debía repasar lo leído una y otra vez hehe"
Pero gracias.