Anuncios Google

Grupo para crear pagina web (Programacion/Diseño)(Actualizado: 17/04/2010)

Buenos dias a todos.

Abro este hilo para informaros que voy a intentar iniciar un nuevo proyecto de desarrollo en equipo. En esta ocasión el equipo (elegido) intentará desarrollar desde cero una página web. Antes de nada me gustaria pedir por favor que no preguntasen por la temática de la web ya que mi objetivo no es mantener una web sino unicamente desarrollarla. Seguramente os parezca una contradiccion lo que estoy diciendo y os preguntais: "¿Para que quiere desarrollar una web si no se va a poner en funcionamiento?". La respuesta es muy simple, este reto quiero que sirva principalmente para aprender. Esto no implica que si en un futuro se ve utilidad a lo que estemos desarrollando no lo pongamos en funcionamiento para que lo aproveche la gente.

Con esta breve introduccion paso a explicar ciertas caracteristicas que busco para formar un equipo cualificado para desarrollar la web:

  • Gente con experiencia en al menos dos lenguajes de programación de ambito general (Python, C, C++, Ruby, Java, Javascript, PHP, Lua...)
  • Gente que conozca HTML y/o XHTML.
  • Gente que haya trabajado con CSS.

Si cumple alguno/s de estos requisitos y quiere participar es muy importante tener en cuenta los siguientes puntos basicos:

  • Controlar lo más basico de la programacion (Bucles, condicionales, variables, constantes, ...)
  • Tener nociones sobre la utilizacion de arrays.
  • Tener experiencia con bases de datos.
  • Haber trabajado alguna vez con ficheros (Lectura, escritura, ...)
  • Conocer las diferentes tecnologias aplicadas a la web.

Os preguntareis por qué estoy buscando a un grupo tan definido. La respuesta es facil, seguramente poca gente, que este interesada, conocerá a fondo PHP, AJAX, Javascript. Por eso si controlas otro lenguaje de programacion a un nivel aceptable no te resultará tan dificil desarrollar en PHP, Javascript o lo que se te ponga por delante.

Los interesados que escriban por favor un comentario abajo. Se aceptan también sugerencias, ideas,...

NOTA: No se tomen todos los requisitos al pie de la letra ya que son muy moldeables. En caso de no controlar todos, no se preocupen ya que al formar un equipo aprenderán al lado de otros las ramas que le faltansen. Lo que si voy a seleccionar es un equipo equilibrado y con el mismo nivel a ser posible.

NOTA PARA GENTE SIN EXPERIENCIA: Todas las personas que deseen participar en el proyecto pero no presenten las caracteristicas pedidas, pueden perdir a un miembro del equipo que sea su tutor. Informacion general:

  • Los miembros del equipo no estan en la obligacion de ser tutores. Es un acto totalmente voluntario.
  • Espero que esta medida no provoque un acoso hacia los miembros del equipo para hacer de tutor ya que traerá consecuencias (Dicho usuario no pasará a formar parte del equipo en caso de quejas del equipo).
  • Se creará una lista con la gente que desea ser tutorada por un miembro (servirá unicamente para saber quien desea formar parte del equipo).
  • La lista no implica que el tutor tenga que cojer al primero presente en ella, es decir, el tutor podrá elegir al usuario desee tutorar. (Aunque os pido por favor que a ser posible sigais la lista).
  • Cada miembro del equipo no tendrá más de dos alumnos. (Como en todos los casos se podrán hacer excepciones)
  • Un miembro tutorado no puede tutorar a otros usuarios.

Equipo temporal para el desarrollo web:

  • Carlosls (Confirmado)
  • moikop (Confirmado)
  • xXZeroXx (Confirmado)
  • AlmamuPP
  • Robione22 (Confirmado)
  • ĸтιх007 (Confirmado)
  • mario_987564897 (Tutorado)
  • krl1995 (Tutorado)
  • the dragon lives (Tutorado)

Actualizacion 07/02/2010:

A continuación os pongo a direccion de los tutoriales para los nuevos: http://librosweb.es/

Recomiendo leer Introducción a XHTML e Introducción a CSS tanto si ya los conoces como si no.

En cuanto AlmamuPP confirme nos ponemos en contacto para ver como vamos a llevar a cabo el proyecto. En caso de que pase unos dias y no confirme empezaremos sin él dandole la oportunidad de unirse más tarde.

Si alguien quiere hacerse cargo de mario que escriba un comentario y sino lo hacemos entre todos.


Actualizacion 09/04/2010:

El proyecto va a ir empezando a funcionar de la siguiente manera:

  1. Elegimos un objetivo para que todos los miembros desarrollen su concepto.
  2. Una vez desarrollado el resto de los integrantes evaluarán el codigo.
  3. Con lo mejor de todos los codigos se rescribirá el codigo definitivo de cada parte quitando todos los errores que vaya presentando.

Cabe destacar que podeis hacer grupitos para desarrollar el codigo y luego ponerlo en comun con el resto de integrantes. Eso ya es a vuestra elección.

Las partes que hay que ir desarrollando se irán colocando en los comentarios a este post.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de moikop

Retomar?

Me gustaría retomar este proyecto, a ver que dicen :P

Un saludo.

Me gustaria

Me gustaria unirme como tuturado

 

Imagen de the dragon lives

Yo de momento estoy retirado

Mi falta de tiempo me obliga a dejar algunos de mis proyectos.

Imagen de alexlazk

Concuerdo

Concuerdo  contigo  me ofrezco para diseño

Imagen de the dragon lives

Una pausa

En este verano no creo que avance mucho en esto (vacaciones, scenery y otros asuntillos me van a tener algo atareado) cuando pueda intentare retomar el proyecto.

Saludos.

Imagen de moikop

Más que añadir métodos

Para manejar esas excepciones, he agregado if's. Y he coregido los errores anteriores =P. A ver si así esta bien:

UserBasic.php:

<?php
 
	include("/class/Database.php");
	$DB = new Database($nameDB, $hostDB, $userNameDB, $passwordDB); //Completar...
 
	class UserBasic {
		private $email;
		private $password;
 
		public function __construct($email, $password) {
			$this->email = $email;
			$this->password = $password;
		}
 
		public function register($this->email, $this->password) {	
			$DB.connect();
			$revisar = strstr($email, '@');
			if (!($revisar)) {
				echo 'Su eMail no es valido. Por favor reviselo.';
			}
			else {
				if (strlen($password) <= 3) {
					echo 'La longitud de su contraseña es menor a la requerida.\nPor favor ingrese otra';
				}
				else {
					$checkusr = $DB.query("SELECT usuario FROM usuarios WHERE usuario=".$email);
					$doesUserExist = mysql_num_rows($checkusr);
					if ($doesUserExist > 0) {
						echo "El nombre de usuario ya existe. Por favor, eliga otro.";
					}
					else {
						$DB.query('INSERT INTO usuarios ('.$email.', '.$password.')');
						echo 'Su usuario ha sido registrado correctamente.\nAhora usted podra acceder a su cuenta solo con logearse.';
					}
				}
			}
			$DB.close();
		}
 
		public function login($this->email, $this->password) {
			$DB.connect();
			$rusr = $DB.query('SELECT usuario FROM usuarios WHERE usuario='.$usuario);
			$rowusr = mysql_fetch_array($rusr);
			if ($rowusr) {
				$rpass = $DB.query('SELECT pass FROM passwords WHERE pass='.$password);
				$rowpass = mysql_fetch_array($rpass);
				if ($rpass) {
					session_start();
					echo 'Logeado correctamente.';
				}
				else {
					echo 'Contraseña incorrecta.';
				}
			}
			else {
				echo 'Usuario no reconocido.';
			}
			$DB.close();
		}
 
		public function logout() { //De esta no estoy muy seguro.
			session_destroy();
		}
	}
?>

Database.php:

<?php
	/**
	 * Clase utilizada para crear y manejar un objeto que representa a una base de datos. 
	 * El objeto recoje los atributos necesarios para conectarse y manipular dicha base de datos.
	 */
	class Database {
        private $nameDB;
		private $hostDB;
		private $userNameDB;
		private $passwordDB;
		private $link;
 
		public function __construct($nameDB, $hostDB, $userNameDB, $passwordDB){
			$this->nameDB = $nameDB;
			$this->hostDB = $hostDB;
			$this->userNameDB = $userNameDB;
			$this->passwordDB = $passwordDB;
		}
		/**
		 * Metodo para conectarse a la base de datos.
		 */
		public function connect(){
			mysql_connect($this->hostDB, $this->userNameDB, $this->passwordDB) or die ('Error en la conexion');
			mysql_select_db($nameDB) or die ('Error en la seleccion de DB');
		}
 
		/**
		 * Metodo para cerrar la base de datos.
		 */
		public function close(){
            mysql_close();
		}
 
		/**
		 * Metodo para realizar una query a la base de datos.
		 */
		public function query($query){
			return mysql_query($query);
		}
	}
?>

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Excepciones

Los lenguajes de programacion modernos ofrecen unas estructuras para lanzar y capturar excepciones. PHP desde la version 5 incorpora esta funcionalidad. Te la detallo un poco a continuacion y si lo deseas puedes ampliar con Google.

Imaginate que estamos desarrollando el codigo y en un punto se produce una situacion anomala y por tanto tenemos que notificarla. Para ello creamos y provocamos una excepcion mediante la estructura: throw new
Exception("Mensaje que se desea transmitir");

A partir de que se ejecuta ese codigo de lanzamiento todo lo que se encuentre detras no se va a ejecutar.

Ahora que ya tenemos una excepcion lanzada (una excepcion puede estar lanzada por el lenguaje de programacion como puede ser division entre cero) esta puede ser capturada en otra parte del codigo. La estructura es try-catch

try{

En esta parte va el codigo que podria lanzar la excepcion

}catch Exception {

Si se lanza la excepcion no se ejecutaria lo que quedase del try y se pasaria a este bloque para tomar las decisiones correspondientes, es decir, en este bloque se trata la excepcion.

}

Te informo que se pueden crear excepciones especificas de forma que puedas capturar una a una y no todas en la generica Exception.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

:-O

Eso es totalmente nuevo XDDD. No lo había visto en ningún otro lenguaje antes...
Investigaré sobre él y me podré con los archivos ;-P

Un saludo.

Edito: Me ha surgido una duda =P:

Necesito un try { ... } catch (customException $e) {echo $e->errorMessage(); } por cada throw new cutomException(...); o con uno solo para varias excepciones alcanza?


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Entendido?

Seria de la siguiente forma:

try{

}catch (exception1 $e){

}catch (exception2 $e){

}

Es decir un try y luego todas las excepciones que puedan producirse. De esta forma puedes capturarla y tratarla de forma independiente y distinta


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

No estoy seguro de entenderlo del todo...

Mira este trozo y dime si esta bien para revisar lo demás:

public function register($this->email, $this->password) {	
			try {
				$DB.connect();
				$revisar = strstr($email, '@');
				if (!($revisar)) {
					throw new customException('Su eMail no es valido. Por favor reviselo.');
				}
				else {
					if (strlen($password) <= 3) {
						throw new customException('La longitud de su contraseña es menor a la requerida.\nPor favor ingrese otra');
					}
					else {
						$checkusr = $DB.query("SELECT usuario FROM usuarios WHERE usuario=".$email);
						$doesUserExist = mysql_num_rows($checkusr);
						if ($doesUserExist > 0) {
							throw new customException('El nombre de usuario ya existe. Por favor, eliga otro.');
						}
						else {
							$DB.query('INSERT INTO usuarios ('.$email.', '.$password.')');
							echo 'Su usuario ha sido registrado correctamente.\nAhora usted podra acceder a su cuenta solo con logearse.';
						}
					}
				}
				$DB.close();
			} catch (customException $e) {
				echo 'Error: '.$e->errorMessage();
			}
		}


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de moikop

Database.php y UserBasic.php

Dejo los dos aquí. El Databasic.php corregido y el UserBasic.php nuevo:

<?php
	/**
	 * Clase utilizada para crear y manejar un objeto que representa a una base de datos. 
	 * El objeto recoje los atributos necesarios para conectarse y manipular dicha base de datos.
	 */
	class Database {
        private $nameDB;
		private $hostDB;
		private $userNameDB;
		private $passwordDB;
		private $link;
 
		public function __construct($nameDB, $hostDB, $userNameDB, $passwordDB){
			$this->nameDB = $nameDB;
			$this->hostDB = $hostDB;
			$this->userNameDB = $userNameDB;
			$this->passwordDB = $passwordDB;
		}
		/**
		 * Metodo para conectarse a la base de datos.
		 */
		public function connect(){
			mysql_connect($this->hostDB, $this->userNameDB, $this->passwordDB) or die ('Error en la conexion');
			mysql_select_db($nameDB) or die ('Error en la seleccion de DB');
		}
 
		/**
		 * Metodo para cerrar la base de datos.
		 */
		public function close(){
            mysql_close();
		}
 
		/**
		 * Metodo para realizar una query a la base de datos.
		 */
		public function query($query){
			mysql_query($query);
		}
	}
?>

<?php
 
	include("/class/Database.php");
	DB = new Database($nameDB, $hostDB, $userNameDB, $passwordDB); //Completar...
 
	class UserBasic {
		private $email;
		private $password;
 
		public function __construct($email, $password) {
			$this->email = $email;
			$this->password = $password;
		}
 
		public function register($this->email, $this->password) {	
			DB.connect();
			$checkusr = DB.query("SELECT usuario FROM usuarios WHERE usuario=".$email);
			$doesUserExist = mysql_num_rows($checkusr);
			if ($doesUserExist > 0) {
				echo "El nombre de usuario ya existe. Por favor, eliga otro.";
			}
			else {
				DB.query('INSERT INTO usuarios ('.$email.', '.$password.')');
				echo 'Su usuario ha sido registrado correctamente.\nAhora usted podra acceder a su cuenta solo con logearse.';
				DB.close();
			}
		}
 
		public function login($this->email, $this->password) {
			DB.connect();
			$rusr = DB.query('SELECT usuario FROM usuarios WHERE usuario='.$usuario);
			$rowusr = mysql_fetch_array($rusr);
			if ($rowusr) {
				$rpass = DB.query('SELECT pass FROM passwords WHERE pass='.$password);
				$rowpass = mysql_fetch_array($rpass);
				if ($rpass) {
					session_start();
					echo 'Logeado correctamente.';
				}
				else {
					echo 'Contraseña incorrecta.';
				}
			}
			else {
				echo 'Usuario no reconocido.';
			}
			DB.close();
		}
 
		public function logout() { //De esta no estoy muy seguro.
			session_destroy();
		}
	}
?>

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Buen codigo

Muy buen codigo. Enhorabuena, estas haciendo un trabajo fascinante.

Dije anteriormente que poner el puntero $this no era obligatorio en la mayoría de los casos (cuando termine las clases creare un post detallando el uso de $this). Sin embargo en este proyecto siempre lo vamos a declarar para evitar futuros conflictos y para llevar un convenio.

Fallos:

  • Los objetos se manejan igual que las variables por lo que tienes que definirlo $DB en vez de DB
  • Si te das cuenta en "$checkusr = DB.query("SELECT usuario FROM usuarios WHERE usuario=".$email);" recibes un valor. Sin embargo cuando creaste el método en Database.php no retornas nada.

Vamos a esperar haber si el resto del equipo desea enviar codigo y si no seguimos mejorando que aun queda mucho hasta que se pueda considerar estos dos archivos como versiones funcioneles y finales. XD

 


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

One month later...

I realize you've answered my comment XDDD.

  • Oh, ya veo. Eso no lo sabía XD. Cuestion de corregir el archivo.
  • Pues eso es simple de solucionar. Esa función quedaría algo asi:
    public function query($query){
        return mysql_query($query);
    }
      no?

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Exacto

Ya es correcto XD.

Creo recordar que el codigo ya podria ser usable en una web. Asi que si quieres puedes crearte la infraestructura o mas tarde añadiré yo un simple codigo para ir probandolo.

Ya hemos conseguido un codigo usable pero ¿que le falta?


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

Faltan varias cosas... XDDD

Faltan los datos del server, los archivos HTML y los CSS (Y si aún no ha sido creada, una DB con una estructura que se adapte al código del Database.php)...
Se me esta escapando algo? XD


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Bien, bien

Eso falta para que el codigo creado pueda ser utilizado y sea presentado visualmente,...

Yo me referia a que le faltaba a los dos codigos creados (scripts).

1.- Uso de excepciones para controlar situaciones excepcionales como que no existe un usuario, no se ha podido conectar con la base de datos,...

2.- Las excepciones implican que ciertos elementos se tenga que tener cierto control como puede ser que el email sea valido o no. Es decir falta por construir esos metodos.

3.- Seguridad. Estos scripts son vulnerables a inyeccion SQL. Cuando se programa webs hay que tener mucho cuidado con inyecciones SQL y otro tipos de ataques que en esta ocasion no vamos a controlar. La seguridad de la inyeccion SQL la veremos mas adelante.

Bueno ya sabeis que es lo que teneis que controlar. Emails y nombres son adecuados y uso de excepciones.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

Aaaa, ok.

Pero esas excepciones (al menos la de error de conexión y la de email/pass inconrrecto al loguearse) no has sido ya controladas?
Creo que solo faltaría la de si el eMail es valido o no...


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de moikop

Nunca antes

Había trabajado con POO (Sólo estudié (Y cuando tengo tiempo sigo) un poco de Java. Pero luego la secundaria se metió en la mitad XD). He completado el Database.php. Lo posteo aqui y dime si esta bien para comenzar con el otro...

<?php
	/**
	 * Clase utilizada para crear y manejar un objeto que representa a una base de datos. 
	 * El objeto recoje los atributos necesarios para conectarse y manipular dicha base de datos.
	 */
	class Database {
        private $nameDB;
		private $hostDB;
		private $userNameDB;
		private $passwordDB;
		private $link;
 
		public function __construct($nameDB, $hostDB, $userNameDB, $passwordDB){
			$this->nameDB = $nameDB;
			$this->hostDB = $hostDB;
			$this->userNameDB = $userNameDB;
			$this->passwordDB = $passwordDB;
		}
		/**
		 * Metodo para conectarse a la base de datos.
		 */
		public function connect(){
			mysql_connect($hostDB, $userNameDB, $passwordDB) or die ('Error en la conexion');
			mysql_select_db($nameDB) or die ('Error en la seleccion de DB');
		}
 
		/**
		 * Metodo para cerrar la base de datos.
		 */
		public function close(){
            mysql_close();
		}
 
		/**
		 * Metodo para realizar una query a la base de datos.
		 */
		public function query($query){
			mysql_query($query);
		}
	}
?>

Y tengo unas duda.

Para que sirve la función __construct? Y el $this->$x = $x?
Y si no me equivoco, estas funciones se usaría así: Database.connect() Database.close() y Database.query($query), no?

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de pspgorrister

Dudas razonables

  • Para que sirve la función __construct?. En realidad a esto se les llama métodos de clase o métodos, en vez de funciones. Este método en concreto, es algo "especial", es llamado internament cada vez tú creas un objeto de dicha clase. Ejemplo

MiBaseDatos = new Database(x, y, z);

Se puede ver que no se ha llamado al método __construct de forma ímplicita, sino que se ha llamado a su clase directamente, en este claso Database. Esta forma de trabajar suele ser muy común en POO.

  • Y el $this->$x = $x?. El $this, es un puntero que hace referencia al mismo objeto, de hecho el método connect es incorrecto, debe ser

mysql_connect($this->hostDB, $this->userNameDB, ...

Si se pone $hostDB y $userNameDB, se hace referencia a otras variables. un ejemplo se puede si en el código que has puesto tú ponemos un método llamado TestThis()

function TestThis() {
   $hostDB = "hola mundo"
   echo $this->hostDB //Imprimer por ejemplo 231.234.23.1, estamos "referenciando" el objeto
   echo $hostDB //Imprime "hola mundo"
 
}

  • Y si no me equivoco, estas funciones se usaría así: Database.connect()
    Database.close() y Database.query($query), no?
    . No, Database es el nombre de la clase. Te voy a poner un ejemplo con un vehículo, tenemos una clase vehículo que se puede mover y parar, no podemos mover un vehículo, porque es algo genérico, podemos mover un modelo de coche en concreto, un coche determinado. Ejemplo:

Vechiculo.Mover() //¿Pero qué es un vehículo?, ¿un coche, una moto?, un vehículo es algo abstracto.
AudiTT = new Vehiculo()  //Definimos Audi TT como vehículo
AudiTT.Mover()    //Ahora sí tiene sentido moverlo
AudiTT.Parar()

Esto en tu ejemplo, no sería "una base de datos" (un vehículo), sino "tu base de datos" (tu vehículo) sería

MiBD = new Database()
MiBD.connect()


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de moikop

Lo de las clases, metodos y

Lo de las clases, metodos y demás, me quedo más que claro. Gracias.

Lo que no entiendo del todo son los punteros. He leído de todo (Hasta tu tuto) y sigo sin comprenderlos. Sé que los punteron son 'variables' que contienen la dirección de memoria de alguna otra variable. Entonces en echo $this->hostDB, estamos escribiendo la dirección en donde se encuentra la variable hostDB en la memoria, no?. Y en echo $hostDB estamos escribiendo el valor de dicha variable. Si en lo anterior no me equivoque, mysql_connect($this->hostDB... estamos señalando a la dirección de la memoria. Que al mismo tiempo contiene el valor de la variable. Eso me parece un poco rebundante, por eso creo que en algo me estoy equivocando...

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de pspgorrister

Sobre $this y punteros

$this, sólo puede ser usado dentro de un método. Si tú tienes una clase Database y la clase Vehiculo, $this sólo podrás usarlo dentro de sus métodos, fuera no vale. Y por convenio, siempre se llama $this, es una variable que se crea cada vez que entras en un método y hace referencia al objeto creado(1).

Sobre los punteros, en realidad no es un puntero propiamente dicho, tal y como podría serlo en C, ten en cuenta que PHP es un lenguaje interpretado y no tienes acceso físico a la RAM. Quizás el término puntero sea incorrecto, aunque yo lo llamo así. $this, más que contener la dirección de memoria, contiene una referencia a la tabla interna con los datos del objeto, que para el caso es practicamente lo mismo.

Para no confundir, vamos a llamar a las funciones de una clase métodos, y a las variables, datos, que es como suele hacerse en POO.

$this->hostDB: Apunta al dato hostDB del objeto Database

$hostDB: Es una variable cualquiera, que coincide que se llama igual que el dato del objeto.

(1)Esto parece una tontería, pero es necesario en POO saber de dónde viene un dato en concreto, para evitar las redundancias:

Puedes llegar a tener que reescribir un montón de código. Imagina que tienes una Clase empleado. A ti te gusta llamar la variable que usas en los bucles contador:

MetodoCualquiera() {
  $contador = 0;
  while (contador < 3) {
    //Hacer lo que sea ....
  }
}

Bien, esa misma  variable la usas en tus bucles for, etc. Resulta que en la empresa han puesto un nuevo aparato que cuenta las veces que un empleado de vigilancia completa la ronda y pulsa un botón (vaaale, complicado y rebuscado, pero es que cualquiera encuentra un ejemplo así en frío :P). Y hay que guardarlo en el dato "contador". Tendrías un gran problema, eliminar cualquier referencia a tu variable contador porque se crea una confusión con el dato de la clase. Usando $this->contador se sabe "qué contador" se está usando.

Rebuscando un poco más nos encontramos con la herencia. Imaginemos  que la clase vigilante desciende de la clase trabajador, el trabajador tiene un contador, por ejemplo se usa en unas horas que hecha, y el vigilante tiene un contador que se refiere a sus rondas.

VerContador() {
  $contador = 0;
  echo $this->contador;
}

Ese es el contador del vigilante, pero ¿como muestras el del empleado?, referencias a su clase padre:

echo parent::contador;

En POO, los datos debido a la herencia y a conflictos con variables, pueden liar bastante, de ahí que se usen esas referencias.

 

Un saludo y perdón por el ladrillo... xDDD


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de moikop

Perfecto.

Ya lo tengo bastante claro. Muchas gracias :)

Un saludo.

Imagen de Carlosls

Buen trabajo

Buen trabajo el codigo es totalmente correcto. Sin ningun fallo apreciable a primera vista.

Ahora me encuentro con dos semanas de examenes así que hasta que no termine no voy a poder seguir explicando la programacion orientada a objetos. En la proxima lección os explicare los punteros, la diferencia entre metodos de objetos y metodos de clase y como utilizar los objetos desde fuera, es decir, como se crean y se utilizan.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de Carlosls

Proyecto (una vuelta de tuerca)

NOTA: NO COMENTAR EN ESTE COMENTARIO



25/05/2010:

1-Modularizando y estableciendo jerarquías

Para ir empezando vamos a establecer las partes del proyecto. Nuesto objetivo es crear modulos los más independientes posibles para ser reutilizados en este u otros proyectos sin necesidad de copiar y pegar. Con este objetivo apareció la programacion orientada a objetos de la que vamos  a hacer uso en este proyecto.

En primer lugar vamos a crearnos las distintas clases que vamos a utilizar en ficheros distintos que llevaran el mismo nombre (coincidiendo mayusculas y minusculas):

  1. Database - controlará todo lo relacionado con las bases de datos (conexión, seleccion, cierre, consultas,...)
  2. UserBasic - se encargará del control de los usuarios (registrar, activar, loggear, logout,...)

Leyenda:

  • Negrita = Nombre fichero y de clase
  • Normal = Comentario de lo que hace

Los dos ficheros que tenemos que crear iran situados en una carpeta llamada "class" dentro de la carpeta donde esteis desarrollando el proyecto.

2-Database

En el archivo database que corresponde con la siguiente estructura segun lo especificado arriba:

<?php
	/**
	 * Clase utilizada para crear y manejar un objeto que representa a una base de datos. 
	 * El objeto recoje los atributos necesarios para conectarse y manipular dicha base de datos.
	 */
	class Database {
                private $nameDB;
		private $hostDB;
		private $userNameDB;
		private $passwordDB;
		private $link;
 
		public function __construct($nameDB, $hostDB, $userNameDB, $passwordDB){
			$this->nameDB = $nameDB;
			$this->hostDB = $hostDB;
			$this->userNameDB = $userNameDB;
			$this->passwordDB = $passwordDB;
		}
		/**
		 * Metodo para conectarse a la base de datos.
		 */
		public function connect(){
                      //RELLENAR
		}
 
		/**
		 * Metodo para cerrar la base de datos.
		 */
		public function close(){
                      //RELLENAR
		}
 
		/**
		 * Metodo para realizar una query a la base de datos.
		 */
		public function query($query){
			//RELLENAR
		}
	}
?>

Ya estamos utilizando objetos ya que esta clase crea una instancia u objeto. Los objetos se crean mediante el contructor que en la mayoria de los lenguajes se especifica con el mismo nombre que la clase. PHP aparte de poder especificarlo con el mismo nombre puedes hacer uso de __construct(...).

Los objetos suelen tener atributos (que son variables controladas unicamente por el propio objeto creado). Antes de continuar y para evitar confusiones voy a señalar un breve matiz:

  • Una clase (tiene el mismo nombre que el archivo que la guarda) permite crear un objeto.
  • Todos los objetos que sean creados mediante una clase son independientes. Esto quiere decir que los atributos que se ha definido en la clase son unicos para cada objeto creado.

Para aclarar un poco más esto imaginemos una clase que se llama Automoviles y presenta un atributo llamado Ruedas. Si creamos un objeto llamado Coche a partir de la clase Automoviles el atributo recibirá 4. Sin embargo, si creamos un objeto llamado Moto a partir de la clase Automoviles
el atributo recibirá 2.

Automoviles es la clase. Moto y Coche es el objeto. Ruedas es el atributo. ¿Ha quedado claro la noción basica?

Mediante el constructor iniciamos los atributos para cada objeto. En nuestro caso todos los objetos que creemos a partir de Database se construirán con un nombre, un host, una contraseña,... ya que serán los datos necesarios para acceder a una base de datos.

Como podeis observar los atributos delante llevan la palabra reservada private. Esto es debido a que nosotros queremos que nadie desde fuera pueda modificar los atributos, cuando me refiero a fuera quiero decir fuera del objeto. El objeto tiene que ser el unico que debe modificar los atributos. Nosotros sin embargo si podemos crear metodos (nombre que reciben las funciones y procedimientos cuando hablamos de programacion orientada a objetos) que permitan desde fuera modificar los atributos. Pero nunca hay que permitirlo hacerlo directamente. Un ejemplo de metodo sería: public function connect(){...}

Espero que los terminos más basicos de programacion orientada a objetos os vayan sonando. Ahora me gustaría que adaptarais vuestros codigos que habeis enviado a la estructura ofrecida arriba.

3- UserBasic

A partir del modelo anterior intentad formar una clase UserBasic.

Si teneis cualquier duda no dudeis en postearla pero no lo hagais repito en este comentario

Manos a la obra!!!

 


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de pspgorrister

Validar registros

Voy a aportar mi granito de arena sobre el tema de validar y gestionar los registros, es como lo hago yo, hay muchos más métodos, pero este es el que a mí mas me gusta, más adelante explico las ventajas. No voy a poner código, sólo el concepto, ya que este hilo se trata de desarrollar el código por uno mismo.

Es bueno tener una tabla aparte de altas y poner un campo nuevo en la tabla de usuarios. Este campo, podría llamarse "activado", un campo lógico que por defecto es false y que nos dice si dicho usuario ha activo su registro.

Estructura básica de la tabla de altas:

  • usuario: Nombre con el que se registró.
  • fecha_alta: Fecha del alta.
  • codigo_activacion: Se puede poner lo que se quiera, aunque es preferible un campo alfanumérico con un HASH, generado a partir de un entero o un texto aleatorio.

Bien, ahora enviamos el mail al usuario con un enlace similar a este

http://www.lapaginaquesea.com/validad_usuario.php?usuario=pe...

Cuando alguien reciba ese mail, y pinche en la validación, tendremos un código en el que haremos lo siguiente:

  • Comprobar en la tabla de registros si usuario coincide con codigo_activacion.
  • Si coincide y desde fecha_alta han pasado X días (se puede poner una validez del enlace una semana, o lo que queramos), se muestra un mensaje de que ese registro ha caducado y se vuelva a dar de alta, se borrar el registro de la tabla_altas, y el usuario de la tabla_usuarios.
  • Si está dentro del plazo, en la tabla usuarios, el campo activado pasa a ser true, y la fecha de alta de la tabla usuarios se pone con la actual. Porque es la fecha de alta REAL. Borramos el registro de la tabla altas.
  • Si no coincide usuario y codigo_activacion, se muestra un mensaje de error.

Ahora voy a explicar el porqué de usar una segunda tabla de altas, se puede hacer todo en la tabla de usuarios, pero es más facil crear una rutina que elimine en la tabla altas las que tenga una fecha superior a X días y a la vez borre dichos usuarios de la tabla usuarios. Permite hacer una purga de datos inútiles mucho más fácil.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de the dragon lives

Excelente

Muchas gracias por ayudarnos en el concepto, sin dudas es una gran respuesta, bien pensada y con gran lógica, espero poder llevarlo a la practica con buenos resultados.

Imagen de the dragon lives

Y los "maestros"

Me gustaría ver código de "los maestros", así podemos aprender algo mas.

Otra funcione que me parecen interesante pero no se como agregarla: validar el registro mediante un mensaje a el email.

Imagen de moikop

sobre el mail...

tengo una idea que puede parecer un poco 'rebuscada' pero puede funcionar.
en lo que consiste mi idea es que en vez de que la funcion 'register()' agregue al usuario en la db, esta funcion genere una pagina (esto es mas o menos facil hacerlo) y que con la funcion 'mail' nativa de php, de ese link al usuario. y que esa pagina generada por la funcion 'register' sea la que agregue al usuario a la db. y como medida de seguridad adicional, una vez agregado ese user, la pagina de checkeo del mail se autoelimine


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de moikop

continuacion...

obviamente, para que no se sobreescriban las paginas, el nombre seria almacenado en una variable del tipo float que iria aumentando. y esa es mi idea XD. decir que no tengo un teclado como la gente. si no haria un script 'demo' =P. si se perdieron en alguna parte diganme XD.
un saludo.
pd: me autorespondo porque la psp, no se por que, no me dejo escribir mas XDDD


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

No hay codigo XD

No voy a sacar por mi parte ningún codigo ya que el proyecto no se trata de eso si no de a partir de ahora con lo que tenemos ir mejorando los metodos y funciones e ir tapando los huecos de seguridad de forma que cuando se finalice se obtenga un codigo como el que tengo desarrollado o mejor. Si lo saco no tiene gracia entonces y habria muchas cosas que no entenderíais si no estais familiarizados con algunos conceptos de programación.

Cuando tenga un poco de tiempo (estoy liado con la universidad) empezaremos a mejorar el codigo


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de the dragon lives

Terminando

Terminando con algo básico pero funcional:

Dando de alta al nuevo usuario en nuestra base de datos.

<?
  //incluimos el archivo que contiene el nombre del servidor, usuario y contraseña y realizamos la conexión
  include("datos_conexion.inc.php");
  $c=@mysql_connect($mysql_server, $mysql_login, $mysql_pass) or die ("Imposible realizar la conexión");
  echo "Conexión realizada <br>";
  $base="usuarios";
  $tabla="datos";
  mysql_select_db($base,$c);
  echo "Base de datos seleccionada<br>";
 
  mysql_query("INSERT $tabla (nombre,pass,correo) VALUES ('".$nombre."','".$pass."','".$correo."')",$c);
 
 //Comprobamos si se ha producido un error
  if (mysql_errno($c)==0){
      echo "<h2>Registro AÑADIDO</b></H2>";
             }else{
             if (mysql_errno($c)==1062){
                echo "<h2>No ha podido añadirse el registro<br>Ya existe un campo con este correo electrónico</h2>";
            }else{
            $numerror=mysql_errno($c);
            $descrerror=mysql_error($c);
            echo "Se ha producido un error nº $numerror que corresponde a: $descrerror  <br>";
        }
  }
  mysql_close($c);
?>

 

Y por fin, las primeras lineas que nuestros futuros usuarios veran, el formulario de registro.

<html>
<head>
<title>Usuario Nuevo</title>
</head>
<body>
<form method="post" action="altausuario.php">
<p><b>REGISTRO DE USUARIOS</b></p>
<p><b>Usuario:</b><input type="text" name="nombre" size="30"/></p>
<p><b>Email:</b><input type="text" name="correo" size="30"/></p>
<p><b>Contraseña:</b><input type = "password" name="pass" size="30"/></p>
<p><input type="submit" name="submit" value="registrarse"></p>
</form>
</body>
</html>

Imagen de moikop

Viendo que...

Se está empezando con el código (esta parte me gusta ^^ XDDD), posteo el user.php. Obviamente, dependiendo de como sea la db, habrá que modificarle una que otra cosa...

<?php
 
session_start();
 
function register($email, $password) {
	mysql_connect('localhost','nomebreUsuario','Contraseña') or die ('Hubo un error de conexion:'.mysql_error()); //Editar cuando tengamos los datos de la base...
	mysql_select_db('Base') or die ('Error al seleccionar la base de datos'.mysql_error()); //Editar cuando tengamos los datos de la base...
	$chkusr = mysql_query("SELECT usuario FROM usuarios WHERE usuario=".$email."");
	$DoesUsrExist = mysql_num_rows($chkusr);
	if (DoesUsrExist > 0) {
		echo "El nombre de usuario ya existe. Por favor, eliga otro.";
		//Aca se puede redireccionar a una funcion que sea la del formulario de registro.
	}
	else {
		$query = 'INSERT INTO usuarios ('.$email.', '.$password.')'
		mysql_query($query) or die (mysql_error());
		echo 'Su usuario ha sido registrado correctamente.\nAhora usted podra acceder a su cuenta solo con logearse.';
	}
	mysql_close();
}
 
function login($email, $password) {
	mysql_connect('localhost','nomebreUsuario','Contraseña') or die ('Hubo un error de conexion:'.mysql_error()); //Editar cuando tengamos los datos de la base...
	mysql_select_db('Base') or die ('Error al seleccionar la base de datos'.mysql_error()); //Editar cuando tengamos los datos de la base...
	$rusr = mysql_query('SELECT usuario FROM usuarios WHERE usuario='.$usuario.'');
	$rowusr = mysql_fetch_array($rusr);
	if ($rowusr) {
		$rpass = mysql_query('SELECT pass FROM passwords WHERE pass='.$password.'');
		$rowpass = mysql_fetch_array($rpass);
		if ($rpass) {
			echo 'Logeado correctamente.';
		}
		else {
			echo 'contraseña incorrecta.';
		}
	}
	else {
		echo 'Usuario no reconocido.';
	}
	mysql_close();
}
 
?>

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Muy buen codigo

Buen codigo aunque hay varias cosas discutibles que posteriormente hablaremos cuando recibamos el codigo del resto de la gente.

Para que haya uniformidad voy a decir la estructura de la base de datos. Va a ser una tabla llamada users que contendra un campo id (int), otro email (String) y otro password (String codificado sha512).


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de the dragon lives

Añado algo mas

Los datos de conexión los llamare "datos_conexión.inc" :

<?php
     $mysql_server="localhost";
     $mysql_login="admin";
     $mysql_pass="pass";
?>

Una tabla que llamare "datos" y trabaje sobre la cabe de datos creada anteriormente (usuarios).

<?
  include("datos_conexion.inc");
  $c=@mysql_connect($mysql_server, $mysql_login, $mysql_pass) or die ("Imposible realizar la conexión");
  echo "Conexión realizada <br>";
  mysql_select_db("usuarios",$c);
  echo "Base de datos seleccionada<br>";
  $crear_tabla="CREATE TABLE IF NOT EXISTS datos(nombre VARCHAR(12), contra VARCHAR(10), correo VARCHAR(30), PRIMARY KEY (correo) )";
 
  if (mysql_query($crear_tabla,$c))
     echo "Tabla creada con éxito <br>";
  else
     echo "Error al crear la tabla <br>";
  if (mysql_close($c))
            echo "<b>Conexión cerrada con éxito</b><br>";
         else
            echo "<b>No se ha cerrado la conexión</b><br>";
?>

Imagen de pspgorrister

Security error!!

Cuidado con ese código, la primera linea es muy inocente, pero tienes una gran vulnerabilidad. Si un usuario teclea:

http://lapaginaquesea.com/datos_conexion.inc

Tiene toda la información disponible para conectarse por MySql. Risa

Yo a los includes, los nombro como fichero.inc.php, de esta forma te aseguras de que el servidor lo va a procesar como un script php y no mostrará nada. Está claro que puedes configurar apache para que trate los .inc como .php pero esto es depender de una configuración, y si cambias de servidor o se modifica la conf. del mismo, volvemos a ser vulnerables.

Un saludo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de the dragon lives

Excelente

Comentarios como este hacen darnos cuenta de la importancia de esos pequeños detalles.

Muchas gracias.

Imagen de Carlosls

Seguridad web

Cuando desarrollemos el codigo final es entonces cuando nos centraremos en la seguridad. Primero vamos ha elaborar un codigo funcionable y luego ya le añadimos la seguridad necesaria. Yo creo que es la mejor forma en este proyecto. Aunque esta bien que la gente vaya encontrando agujeros XD


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de Carlosls

Muy bien

Excelente. Esto es lo que me gustaria conseguir que la gente participe y junto vayamos viendo los fallos y haciendo un codigo adecuado.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de Carlosls

Gracias y bien hecho

Muy bien por tu trabajo!!! Veamos si la gente se anima a colaborar y a aprender.

A continuación te voy a comentar algunos detalles:

  • Con mysql_connect(...) se conecta al servidor donde se encuentra la base de datos
  • Con mysql_select_db(...) se selecciona la base de datos con la que vamos a interactuar que se encuentra en la base de datos
  • Con mysql_query(...) se realizar una petición a la base de datos

Me alegro que hayas comprendido correctamente las funciones pero te comento un pequeño detalle de mysql_query(): No es necesario introducirle el segundo parametro que indica el identificativo de conexion (salvo casos excepcionales). Esto lo puedes apreciar en la documentacion oficial que si observas el segundo parametro esta entre corchetes lo que significa en programacion que es opcional.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de the dragon lives

Creando la base de datos

Aquí una base de datos llamada "usuarios".

<?
  include("datos_conexion.inc");
  $c=@mysql_connect($mysql_server, $mysql_login, $mysql_pass) or die ("Imposible realizar la conexión");
  $nombre="usuarios";
  $bandera=0;
  $p=mysql_list_dbs($c);
  $n=mysql_num_rows($p);
  for ($i=0;$i<$n;$i++)
      	if (mysql_db_name($p,$i)==$nombre)
          $bandera=1;
  if ($bandera==0){
     mysql_query("CREATE DATABASE $nombre");
     echo "Base de Datos creada <br>";
  }
  else
      echo "Imposible crear la base de datos<br>";
  if (mysql_close($c))
            echo "<b>Conexión cerrada con éxito</b><br>";
         else
            echo "<b>No se ha cerrado la conexión</b><br>";
?>

Imagen de P22

En C, ahora que estoy

En C, ahora que estoy aprendiendo las estructuras, sería tan simple hacer una base de datos (en este ejemplo pongo sólamente nombre de user y pass, pero es fácilmente ampliable) como:

#include <stdio.h>
 
main(){
...
   struct{
      char[15] pass;
      char[10] name;
   }user[1000];
...
}

En ese ejemplo creo una estructura, con una array de mil elementos con nombre y pass cada uno. No se que hace la tuya, pero seguro que es mejor que la mía xD.

PD: Una base de datos es lo que he hecho yo no? :p


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de the dragon lives

La verdad no se mucho de C

No me he metido en el mundo de C (y no creo que lo haga, al menos de forma directa, preferiría entrar a C++).

Por lo que puedo ver de tu código; veo una estructura que pide una contraseña que no supere los 15 caracteres, un nombre que no supere los 10 caracteres y que el máximo de la estructura sean 1000 entradas de información.

Por otro lado, creo que el fin de crear una base de datos para un registro es que no se limite y se puedan registrar hasta el infinito y más aya ... :p

De todos modos espera a que alguien que entienda algo más de C responda sobre el funcionamiento de tu estructura.

Saludos.

Imagen de pspgorrister

Pues te respondo yo

Realmente, cualquier motor SQL, al final trabaja internamente como estructuras de C/C++, todo ello camuflado con una capa de funciones y métodos que lo hace todo mucho más fácil, sería un equivalente a Lua y a C, que tanto se ven por la sección de PSP. Problemas de hacer una base de datos en C/C++ con un array de structuras "a pelo":

  • Dificultad a la hora de hacer opciones de búsqueda, toca ir creando funciones para ello, ya que no se pueden crear sentencias "WHERE" "INNER JOIN", etc. Si los datos van a usar muchos métodos de búsqueda, es una pesadilla.
  • Gestión de memoria. La forma de usar cada registro, no es crear un número fijo. Primero porque nos cargamos la memoria, por ejemplo creamos una BD con 1000000 registros ¿resevamos "1000000bytes *  sizeof (registro)" aunque sólo tengamos uno creado?. Una animalada. Habría que ir ampliando/reduciendo la tabla dinámicamente, y aquí tienes que saber usar punteros sí o sí. Además llegará un momento que si hay muchísimos registros, el programador debe de manejar cuantos va a cargar el el buffer de memoria (por ejemplo de 10mil en 10mil), lo cual complica mucho las cosas, por ejemplo para las búsquedas.
  • Imagina lo que supone tener 4 arrays que estén relacionados estilo "INNER JOIN" o "LEFT JOIN", a mi me dan sudores solo de pensar cómo implementar eso juntado arrays Risa

Esta es la forma en que trabajan los motores de BD internamente, afortunadamente, hay varios motores disponibles, que porsupuesto tienen su API En C/C++ (MySql, PostgreSQL, SQLite),... no hace falta reinventar la rueda.

Para listas sencillas, y profundizar en el manejo de punteros y aprender más de C/C++, las veo viables e interesantes, aunque mejor usar un motor de BD.

Un saludo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de P22

Te dije que se puede modificar

Puedes poner en la variable pass 3000 de índice como si quieres crear 100000000000000 de users.

Mi intención:

#include <stdio.h>
 
main(){
   typedef struct{
      char[30] pass;
      char[30] name;
   }user[1000];
 
   user no1;
 
   //A la hora de crear un user:
 
   /*Pedir que no empiece el nombre por un 0 y que tanto el nombre
   como la contraseña sean de menos de 30 caracteres*/
 
   //Guardar en un archivo externo el índice del último user creado
 
   /*Si el último user es menor a 999, crear un user en la dirección no1[ultimouser-1]
   Y si es igual, crear una nueva estructura llamada no2, no3, non...*/
}

Como ves, en ese pseudo código demuestro que es más fácil de  lo que parece.

 


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de the dragon lives

Yo me retrasare un poco

La verdad estoy teniendo algún que otro problemilla al haber creado la base de datos atravez de phpmyadmin, si no le encuentro solución en dos días la creare manualmente, pero eso me retrasara como mínimo hasta el miércoles.

Imagen de Carlosls

Creacion de pagina web

Bueno vamos a ir empezando a hacer cosillas interesantes para cualquier web:

  1. Se pide el desarrollo en PHP de un login y registrar que interactue con una base de datos donde se guarda los usuarios y contraseñas de la web.
  2. Se aconseja utilizar programacion orientada a objetos siempre que sea posible.
  3. No se pide el formulario html asi que unicamente os teneis que centrar en realizar las funciones necesarias. Lo unico que debeis tener en cuenta son dos parametros "email" y "password" que deben ser pasado a la funcion o al constructor(en caso de ser un objeto).
  4. Se aconseja hacer login, logout(no desarrollar de momento) y registrar en un mismo archivo. 

Como medida de aprendizaje no se os dará mas detalles de como se interactua con bases de datos asi pues buscar informacion e ir mandando vuestras soluciones.

Saludos

PD: Cualquier duda irla posteando.

PD2: Todo proyecto debe ir bien documentado. Esto significa que cosas absurdas no se ponen y cosas necesarias sí.

PD3: Solo ha de entregarse el codigo php


Actualización

El archivo con el codigo se debe llamar "user.php" contendrá minimo dos funciones o metodos:

  1. login($email, $password)
  2. register($email, $password)

Vosotros decidireis que errores son necesario controlar y dar aviso.


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de Carlosls

Codigo

Ya han pasado unos dias desde que se inicio la tarea y brilla los comentarios por la ausencia de codigo y dudas XD

Tengo pensado para el Domingo 25 intentar dar por finalizado la recogida de codigo para poder empezar a debatir en grupo e idear el codigo final, asi que ir apurando vuestros envios o dudas que tengais por favor.

Si necesitais tiempo tambien decidlo porque de momento no soy adivino XD.

Saludos

 

 


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

session_start(); y familia...

Lo he visto en varios ejemplos y la duda es si es un método nativo del php/base de datos MySQL o es una función creada por los que crearon el ejemplo...

EDITO: Pregunto lo mismo de las fuciones mysql_connect(), mysql_error() y mysql_select_db(), mysql_query()...

Un saludo.

PD: No sé si llegue al domingo. Ya que en lo que queda de la semana tendré 2 evaluaciones más :S. Si necesito más tiempo, te lo haré saber =P

EDITO2: La funcion de registrar ya casi le termino, solo falta lustrarla =P. Pero con la de login estoy medio perdido XD. Y otra cosa: la funcion register, debe incluir el formulario de registro (tal vez le respuesta sea obvia, pero progunto igual XD).

Un saludo.


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Imagen de Carlosls

Session Start y PHP

session_start(); es una funcion de PHP que funciona de forma similar a cookies. Lo que se pretende con esta funcion es guardar informacion del usuario en el ordenador de este para que al cambiar de pagina por ejemplo no se tenga que logear de nuevo.

Todas las funciones mysql que has escrito se encuentran en las librerias de PHP y te permite realizar toda serie de operaciones con bases bajo mysql.

NOTA IMPORTANTE: No debeis incluir el formulario de registro, ya que el objetivo es desarrollar unicamente las funciones. El siguiente paso que demos será realizar el formulario y unir las partes.

La funcion login debe ser de la siguiente forma:

function login($email, $password){
//Conectar base de datos
 
//Realizar consulta a la base de datos
 
//Cerrar base de datos
 
//Si la consulta ha salido al menos una entrada entonces devolver true y sino devolver false
}


EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7

Imagen de moikop

Listas.

Ya estan terminadas las dos funciones. Aunque como nunca antes había trabajado con PHP o MySQL, seguramente son un poco 'simples' por asi decirlo...

Un saludo.

PD: Las funciones las posteo aquí o cómo nos organizaremos?


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.