Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO programando una clase para manejar MySql

Estas en el tema de programando una clase para manejar MySql en el foro de Frameworks y PHP orientado a objetos en Foros del Web. He comenzado a programar con PHP OO luego de leer alguna documentación, y practicar algo el tema. Bueno lo primero que me dije a mi ...
  #1 (permalink)  
Antiguo 06/10/2012, 19:47
 
Fecha de Ingreso: agosto-2007
Ubicación: Santiago de Chile
Mensajes: 67
Antigüedad: 16 años, 7 meses
Puntos: 1
programando una clase para manejar MySql

He comenzado a programar con PHP OO luego de leer alguna documentación, y practicar algo el tema.

Bueno lo primero que me dije a mi mismo es quiero manejar las funciones de MYSQL con una clase ya sé que hay librerías dedicadas a este cometido, pero de todas maneras quiero hacerlo a "mi manera".

el problema que tengo es el siguiente, parto por detallar la clase.

Código:
<?php
require("config.ini.php");

class sql
{
private $DBserver = _DB_SERVER_ ;
private $DBname = _DB_NAME_ ;
private $DBusr = _DB_USR_ ;
private $DBpass = _DB_PASS_ ;

	private function DBconnect()
	{
	$DBcon = mysql_connect ($this->DBserver, $this->DBusr, $this->DBpass);
	$DBselect = mysql_select_db ($this->DBname,$DBcon);
	$DBconnect = $DBcon & $DBselect;
	return $DBconnect;
	}
	
	public function DBclose()
	{
	mysql_close();
	}
	

	public function DBselect($query)
	{
	$this->DBconnect();
	$DBselect = mysql_query ($query) or die ("Problemas Insertando registro. Constacte con el administrador " .mysql_error());
	return $DBselect;
	}
	
	public function f_array($query)
	{
		return @mysql_fetch_array($query);
	}

	
	
	/***
	- $tabla: indicar nombre de la tabla que se manipulará
	- $campos: debe seguir el siguiente formato " campo , campo2 "
	- $valores: deben seguir el siguiente formato " 'valor1' , 'valor2' " 
	***/
	public function DBinsert($tabla, $campos, $valores)
	{
	$this->DBconnect();
	$query = "INSERT into " .$tabla ."(" .$campos .") values (" .$valores .")";
	$DBinsert = mysql_query ($query) or die ("Problemas Insertando registro. Constacte con el administrador " .mysql_error());
	$this->DBclose();
	}
	
	
	public function DBdelete($tabla, $campo, $eliminado)
	{
	$this->DBconnect();
	$query = "DELETE from " .$tabla ." WHERE " .$campo ." = " .$eliminado;
	$DBdelete = mysql_query($query) or die ("Problemas Borrando registro. Constacte con el administrador " .mysql_error());
	$this->DBclose();
	
	echo $query;
	}
}

?>

Como pueden ver hay:

-Funcion que conecta * Funciona
- Función que cierra conexion *Funciona
- DBselect - consulta la base de datos *Funciona
- mysql_fetch array *errores
- insertar *Funciona
- Delete *Funciona

Mi problema es con f_array, lo más probable es que mi problema sea de lo más básico pero no encuentro la solución.

Necesito crear un ID el cual es el siguiente número del último registro. eso quiere decir que si el último usuario registrado es 3... el siguiente ID será 4, para eso realizo lo siguiente.

Código:
$ID = new sql;
$id_sql = $ID->DBselect('select usr_id from control_usr');
$id_arr = $ID->f_array($id_sql);

print_r ($id_arr);
me arroja sólo 1 resultado independiente de que hayan más registros.

al insertarlo en un while

Código:
while ($id = $id_arr){
echo $id['usr_id'];
}
me arroja un bucle infinito.

Que aplico mal ? :(
espero puedan ayudarme me despido y muchas gracias.


saludos
  #2 (permalink)  
Antiguo 07/10/2012, 02:38
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 17 años, 11 meses
Puntos: 14
Respuesta: programando una clase para manejar MySql

Hola. ¿Estás seguro de que nos has pasado bien el código? Creo que haber visto alguna cosa rara. También he visto que ocultas los errores con "@" y quizás eso te esté devolviendo algún mensaje útil que no ves

También creo haber visto algo raro por arriba. Asegúrate de que todo eso esté bien y creo que hay un par de cosas que podrías mejorar para tu clase y entre todos podemos ayudarte


Saludos!
__________________
No hay cuerda desafinada sino músico progresivo

Última edición por Smolky; 07/10/2012 a las 02:41 Razón: Corregir error
  #3 (permalink)  
Antiguo 07/10/2012, 07:09
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: programando una clase para manejar MySql

Hola i34a23

Antes que nada..., las funciones de Mysql que usas están desaconsejadas, usa las de Mysqli o PDO.

Errores que veo:
Tu método f_array es un simple wrapper de mysql_fetch_arrray, lee la doc para saber como trabaja

No hace falta hacer una consulta para eso, la funcion mysql_insert_id devuelve el ultimo id.

Eso para empezar :)
  #4 (permalink)  
Antiguo 07/10/2012, 10:25
 
Fecha de Ingreso: agosto-2007
Ubicación: Santiago de Chile
Mensajes: 67
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: programando una clase para manejar MySql

Hola,

Muchas gracias por sus comentarios, bueno el problema esta solucionado, el codigo corregido y obvio que quite las @ para ocultar errores, necesitaba saber que errores se manifestaban.

finalmente el error era de la forma en que ejecutaba el fetch_array.

lo dejé así
Código:
$ID = new sql;
$id_sql = $ID->DBselect('select usr_id from control_usr ORDER BY usr_id ASC');
	while ($id_arr = $ID->f_array($id_sql)){
		$id_calc = $id_arr;
		}
			if (!isset($id_calc['usr_id'])){
			$id = 1;
			}
			else{
			$id = $id_calc['usr_id'] + 1;
			}
?>
saludos y gracias

La verdad estoy iniciando un proyecto y estoy trabajando mi forma de programar estructurada, en clases, pero mi proximo paso es estudiar la librería PDO para manejar mysql.

de momento me acostumbro a usar las clases y entenderla, la verdad me ha ahorrado estimo yo casi un 70% de esfuerzo el uso e clases :)

saludos
  #5 (permalink)  
Antiguo 07/10/2012, 13:20
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: programando una clase para manejar MySql

Si colocaras un ORDER BY DESC con un LIMIT 1 tendrias el dato sin necesidad del while

De todas formas, como te dije antes, podrías evitar todo eso haciendo una método que te devuelva el ultimo id
  #6 (permalink)  
Antiguo 08/10/2012, 11:31
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 137
Respuesta: programando una clase para manejar MySql

foreach funciona mejor cuando manejas objetos que while,
WHILE(<esto sea verdadero>);
FOREACH(<recorre cada elemento>);
saludos
  #7 (permalink)  
Antiguo 09/10/2012, 04:58
Avatar de antonrodin  
Fecha de Ingreso: noviembre-2007
Ubicación: Madrid
Mensajes: 153
Antigüedad: 16 años, 4 meses
Puntos: 38
Respuesta: programando una clase para manejar MySql

Si quieres trabajar con clases te doy algunos consejos:

1. El nombre de clase en mayuscula.
2. El nombre de funciones en minuscula.
3. Las funciones de las clases por convenio puedes empezar por "_" private $_variable, aunque esto ultimo no se aplica mucho.

Podrías también investigar también utilizar vectores o clases para variables definidas... dicen que es mas rápido, aunque es muy discutido. Sin embargo quizás sea "mejor practica". Por ejemplo con la función autoload del PHP5 podrías cargar la clase CFG sin usar el include.

Yo por principios siempre añado un constructor en PHP es __construct() aunque si nos ceñimos a las buenas practicas añade:

1. Destructor
2. Constructor de copia (No estoy seguro si en PHP5 se puede hacer)
3. Constructor por asignación (No estoy seguro si en PHP5 se puede hacer)

Esto lo que me han enseñado a mi... y si lo haces por aprender así entenderás un poco OOP de PHP5 y del resto de lenguajes.

Un saludo!
__________________
Mi blog personal... o algo asi: http://www.azrodin.com, experimentando con un concurso seo.
  #8 (permalink)  
Antiguo 09/10/2012, 11:06
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 137
Respuesta: programando una clase para manejar MySql

Pues para este tipo de clases (manejo de bases de datos) yo optaria por utilizar singleton en vez de constructor
http://web.ontuts.com/tutoriales/cre...datos-con-php/
este tutorial es muy bueno te lo recomiendo para utilizar base de datos con POO sin ningun framework
  #9 (permalink)  
Antiguo 11/10/2012, 11:34
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 17 años, 11 meses
Puntos: 14
Respuesta: programando una clase para manejar MySql

Pero no abusemos del singleton (No sé si ya habían puesto estos enlaces)
http://back2dos.wordpress.com/2011/0...ngleton-abuse/
http://es.softuses.com/9737

Y un interesante debate
http://stackoverflow.com/questions/6...container-good

para los que les guste leer estas cosas


Yo he tenido proyectos donde he tenido que crear dos conexiones a base de datos, como cosas de PALO para Business Intelligence para hacer volcados de datos por ejemplo y creo que Singleton no es la mejor idea.
__________________
No hay cuerda desafinada sino músico progresivo
  #10 (permalink)  
Antiguo 11/10/2012, 12:16
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 137
Respuesta: programando una clase para manejar MySql

Cita:
Iniciado por Smolky Ver Mensaje
Pero no abusemos del singleton (No sé si ya habían puesto estos enlaces)
http://back2dos.wordpress.com/2011/0...ngleton-abuse/
http://es.softuses.com/9737

Y un interesante debate
http://stackoverflow.com/questions/6...container-good

para los que les guste leer estas cosas


Yo he tenido proyectos donde he tenido que crear dos conexiones a base de datos, como cosas de PALO para Business Intelligence para hacer volcados de datos por ejemplo y creo que Singleton no es la mejor idea.
Buena info, yo tambien manejo dos bases de datos, pero para los casos mas sencillos si es recomendable manejar singleton
  #11 (permalink)  
Antiguo 11/10/2012, 12:26
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 17 años, 11 meses
Puntos: 14
Respuesta: programando una clase para manejar MySql

Hola! Pero qué aporta en este caso un singleton en lugar de hacer algo como
Código PHP:
Ver original
  1. $_DB = new ConexionConBaseDeDatos () ;

Y donde tengas que usar la conexión hacer
Código PHP:
Ver original
  1. global $_DB ;

¿Quizás para hacer una carga perezosa y no abrir una conexión con la base de datos si no fuera necesaria?

Es decir, no abogo aquí por el uso de variables globales, ni me parece mal el singleton, si se usa para algo tan centralizado como esto, pero no veo bien que se use en multitud de sitios o usarse por usar.

Pero bueno, creo que esto tampoco tiene mucho que ver con el hilo y no creo que sea bueno que nos desviemos del tema
__________________
No hay cuerda desafinada sino músico progresivo
  #12 (permalink)  
Antiguo 11/10/2012, 13:06
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 137
Respuesta: programando una clase para manejar MySql

yo estoy en desacuerdo total con el uso de variables globales en cualquier lenguaje de programación, es una mala practica muy común en javascript y PHP (es una de las cosas que me hace odiar wordpress aveces)
Pero, bueno, yo si apoyo el singleton en algunos casos, obviamente no siempre sera la mejor opcion
  #13 (permalink)  
Antiguo 11/10/2012, 14:10
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: programando una clase para manejar MySql

Singleton(anti-pattern si los hay) es una forma muy pobre de resolver algo trivial y para una conexión a la bbdd no debería se siquiera una opción, hay bastante info en el foro o san google sobre el tema.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: clase, manejar, mysql, programando, registro, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:33.