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

Manjo con Clases

Estas en el tema de Manjo con Clases en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola Compañeros. Estoy trabajando con varias clases. CLass A,B,...,Z y una clase SQL En las clases A,B,..,Z tienen una propiedad que es SELECT. Y este ...
  #1 (permalink)  
Antiguo 27/04/2006, 15:08
Avatar de lcervantes  
Fecha de Ingreso: abril-2002
Mensajes: 137
Antigüedad: 22 años
Puntos: 0
Manjo con Clases

Hola Compañeros.
Estoy trabajando con varias clases.
CLass A,B,...,Z y una clase SQL
En las clases A,B,..,Z tienen una propiedad que es SELECT.
Y este propiedad se inicializa en el contructor de su respectiva CLASE.
Si trabajo una a una de manera independiente no hay problemas, pero al trabajar de manera conjunta 2 clases (es decir 2 instancias de 2 clases) me da problemas porque al parecer no es capaz de diferencias A->SELECT de B->SELECT y se queda con los ultimos valores de select que haya realizado en ambas propiedades.
Solo las tengo declaradas como clases.. No se si le he de decir algo particular o declararlas diferentes para que me entienda que son instancias diferentes.

Gracias.

Luis
  #2 (permalink)  
Antiguo 27/04/2006, 16:02
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Pon algo de código para que podamos ayudarte y ver mejor el error.
  #3 (permalink)  
Antiguo 29/04/2006, 04:38
Avatar de lcervantes  
Fecha de Ingreso: abril-2002
Mensajes: 137
Antigüedad: 22 años
Puntos: 0
Aqui va algo de codigo..
config.php es donde tengo los parametros de conexion
//La clase SQL es donde realizo todas la operaciones de SQL SELECT, UPDATE, DELETE, LISTAS, COUNT, VALORREGISTRO, DEVOLVER FILA...
Y con el DATABASETYPE (MYSQL, MSSQL, ODBC)
Es decir un clase funcional para cualquier base de datos.
//----------------- SQL ---------------------
class SQL{
//Parametros de conexion
public $SERVER;
public $USER;
public $PASSWD;
public $DATABASE;
public $DATABASETYPE;

//Parametros de SQL
private $link;
private $result;
private $row;

//************* Connect ************************
public function Connect(){ .....}
//************* Query ************************
public function Query($query){ .....}
....... y mas metodos.
}

// --------------------- A --------------------------
class A{
// Variables de Classe
public $A_CODIGO = "";
public $A_NOMBRE = "";
public $A_DESCRIPCION = "";

private $SQL;

// **** Constructor ****
function __construct() {
include($_SERVER['DOCUMENT_ROOT'] . '/config.php');
$this->SQL = new SQL();
$this->SQL->DATABASETYPE = $DATABASETYPE;
$this->SQL->SERVER = $SERVER;
$this->SQL->DATABASE = $DATABASE;
$this->SQL->USER = $USER;
$this->SQL->PASSWD = $PASSWD;
$this->SQL->Connect();
}
function Guardar(){ ...Guardo un registro ...
$query = "Insert into A ....."
$this->SQL->Query($query);
}

function Borrar(){ ...Borro un registro..}
.... y otros metodos de la clase
}


// --------------------- B --------------------------
class B{
// Variables de Classe
public $B_CODIGO = "";
public $B_NOMBRE = "";
public $B_DESCRIPCION = "";

private $SQL;

// **** Constructor ****
function __construct() {
include($_SERVER['DOCUMENT_ROOT'] . '/config.php');
$this->SQL = new SQL();
$this->SQL->DATABASETYPE = $DATABASETYPE;
$this->SQL->SERVER = $SERVER;
$this->SQL->DATABASE = $DATABASE;
$this->SQL->USER = $USER;
$this->SQL->PASSWD = $PASSWD;
$this->SQL->Connect();
}
function Guardar(){ .....
$query = "Insert into B ....."
$this->SQL->Query($query);
}

function Borrar(){ .....}
.... y otros metodos de la clase

function Lista(){ ..Me muestra los valores en una tabla...}
.... y otros metodos de la clase
}


--------------------


Entonces desde el main..
al preparar las acciones a realizar con alguna clase..

$A = new A();
$A->Lista();

$B = new B();
$B->Lista()

unset($B)
unset($A)

En problema esta en que al parecer al realizar la
$A->Lista();
$SQL dentro de A se guardan sus respectivos datos
$B->Lista();
pero no se porque al realizar la lista de B los datos de A son modificados.
si luego queiro acceder a los datos de A.

el otro problema es que al realizar el unset(B) me libera $SQL de todos y luego si realizo el unset de(A) $SQL ya no lo localiza porque ha sido liberado.


Igual el problema es en el constructor de A y B que lo estoy haciendo mal.
y deveria crear un herencia SQL de A y SQL de B. Lo que no se si he de conciderar eso una herencia... ya que son funciones que se utilizo en todas las clases creadas...

Saludos y agradeceria cualquier ayuda..
  #4 (permalink)  
Antiguo 29/04/2006, 12:22
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Bueno con esa parte de codigo no hago mucho aunque puedo intuir dos clases de errores.

1) Que las dos clases tengan una instancia de SQL por referencia y que llamen a al mismo método y uno sobreescriba al otro.
2) Al estar referenciando al mismo objeto cuando destruyas uno automaticamente todos los que estaban referenciandolo se queden a null.


Por lo demás tu estructura de clases no es muy consistente. La mayoria de los atributos son publicos cuando deberian ser privados. Parece ser que utilizas la version 5 de php así que yo te recomiendo una implementación del patrón ActiveRecord. Es uno de los más elegantes y fáciles de implementar, y le puedes sacar todo el rendimiento con la versión 5.
  #5 (permalink)  
Antiguo 30/04/2006, 04:01
Avatar de lcervantes  
Fecha de Ingreso: abril-2002
Mensajes: 137
Antigüedad: 22 años
Puntos: 0
Hola Casius.
La versión de PHP que utilizo es la 5.0.
Respecto a llamada de SQL dentro de alguna de las clases parece que sea por referencia.... es loque he pensado... Pero las llamadas las hago normal
// **** Constructor ****
function __construct() {
include($_SERVER['DOCUMENT_ROOT'] . '/config.php');
$this->SQL = new SQL();

No aplico $this->SQL = &new SQL(); si no me equivoco, asi es como es por referencia...

Cuando te refieres que no es muy consistente a que te refieres....? Algun consejo de como deveríia ser..

Y respecto a lo de implementación del patrón ActiveRecord, Donde puedo encontrar documentación...?

Gracias y saludos...

Luis
  #6 (permalink)  
Antiguo 30/04/2006, 05:08
Avatar de lcervantes  
Fecha de Ingreso: abril-2002
Mensajes: 137
Antigüedad: 22 años
Puntos: 0
Creo que mi problema esta en la clase SQL.
ya que sin necesidad de usarla en otras clases si quiero realizar 2 instancias diferentes de la misma clase, para poder realizar una consulta dentro de otra me da problemas..

aqui va la clase SQL.

/////////////////////////////////// CLASS SQL////////////////////////////////////
<?
class SQL{
//Parametros de conexion
public $SERVER;
public $USER;
public $PASSWD;
public $DATABASE;
public $DATABASETYPE;
//Parametros de SQL
private $link;
private $result;
private $row;

//************* Connect ************************
public function Connect(){
switch ($this->DATABASETYPE){
case 'MSSQL': $this->link = mssql_connect($this->SERVER, $this->USER, $this->PASSWD) or die ("Could not connect MSSQL");
mssql_select_db($this->DATABASE,$this->link) or die ("Could not select database " . $this->DATABASE. " in MSSQL");
break;
case 'MYSQL': $this->link = mysql_connect($this->SERVER, $$this->USER, $$this->PASSWD) or die ("Could not connect MYSQL");
mysql_select_db($this->DATABASE,$this->link) or die ("Could not select database " . $param_conection['database'] . " in MYSQL");
break;
case 'ODBC': $this->link = odbc_connect($this->SERVER, $this->USER, $this->PASSWD ,'SQL_CUR_USE_ODBC');
break;
default: echo "Error tipo no seleccionado en CONNECT<br>";
break;
}
}

//************* Query ************************
//Devuelve en $result los resultados de la query.
public function Query($query, $ver_sql='N'){
if ($ver_sql=='S'){
echo "Query:$query<br>";
}
switch ($this->DATABASETYPE){
case "MSSQL": $this->result = mssql_query($query,$this->link);
break;
case "MYSQL": $this->result = mysql_query($query, $this->link);
break;
case "ODBC": $this->result = @odbc_exec($this->link,$query) or die ("<b>Error!</b> Couldn't Run Query:<br><br>$query<br><br>Error Code:" . odbc_error() . "<br>Description: " . odbc_errormsg() );
break;
default : echo "Tipo no seleccionado en QUERY.<br>";
break;
}
return ($this->result);
}

//************* GetHeaderRow ******************
public function GetHeaderRow(){
switch($this->DATABASETYPE){
case "MSSQL": $this->row = mssql_fetch_field($this->result);
break;
case "MYSQL": $this->row = mysql_fetch_field($this->result);
break;
default: echo "Tipo no seleccionado en GET HEADER ROW.<br>";
break;
}
return($this->row);
}

//************* GetFieldName *******************
public function GetFieldName($numerocampo) {
switch($this->DATABASETYPE){
case "MSSQL": return mssql_field_name($this->result, $numerocampo);
break;
case "MSSQL": return mysql_field_name($this->result, $numerocampo);
break;
case "MSSQL": return odbc_field_name($this->result, $numerocampo);
break;
default : echo "Tipo no seleccionado en GET FIELD NAME.<br>";
break;
}
}

//************* GetFetchRow *******************
//Te permite hacer referencia a los campos solo por numeros
public function GetFetchRow(){
switch($this->DATABASETYPE){
case "MSSQL": $this->row = mssql_fetch_row($this->result);
break;
case "MYSQL": $this->row = mysql_fetch_row($this->result);
break;
case "ODBC": $this->row = odbc_fetch_row($this->result);
break;
default: echo "Tipo no seleccionado en GET FECTH ROW<br>";
break;
}
return($this->row);
}

//************* GetFetchRow *******************
//Te permite hacer referencia a los campos por numeros o por nombres
public function GetFetchArray(){
switch($this->DATABASETYPE){
case "MSSQL": $this->row = mssql_fetch_array($this->result);
break;
case "MYSQL": $this->row = mysql_fetch_array($this->result);
break;
case "ODBC": $this->row = odbc_fetch_array($this->result);
break;
default: echo "Tipo no seleccionado en GET FECTH ROW<br>";
break;
}
return($this->row);
}

//************* GetValue *******************
//id_name será numero o nombre dependiendo de lo que utilice anteriormente GetFetchRow o GetFetchArray
public function GetValue($id_name){
$value = $this->row[$id_name];
return($value);
}

//************* NumFields *********************
public function NumFields(){
switch($this->DATABASETYPE){
case "MSSQL": return(mssql_num_fields($this->result));break;
case "MYSQL": return(mysql_num_fields($this->result));break;
case "ODBC": return(odbc_num_fields($this->result));break;
default: echo "Tipo no seleccionado en NUMFIELDS.<br>";break;
}
}

//************* Num Rows **********************
public function NumRows(){
switch ($this->DATABASETYPE){
case "MSSQL": return (mssql_num_rows($this->result)); break;
case "MYSQL": return (mysql_num_rows($this->result)); break;
case "ODBC": return (odbc_num_rows($this->result));break;
default: echo "Error tipo no seleccionado en NUMROWS<br>";break;
}
}

//************* Inserted ID ********************
public function InsertedID(){
switch ($this->DATABASETYPE){
case "MSSQL": echo "Opcion no implementada para MSSQL"; break;
case "MYSQL": return (mysql_insert_id($this->link)); break;
case "ODBC": echo "Opcion no implementada para ODBC";break;
default: echo "Error tipo no seleccionado en INSERT ID<br>";break;
}
}

//************** Table ************************
public function Table(){
$Cadena = "<Table border=1 cellpadding=0 cellspacing=0>";
switch ($this->DATABASETYPE){
case "MSSQL":
//Nombre Campos
$Cadena = "$Cadena<tr>";
while ($field = mssql_fetch_field($this->result)){
$Cadena = "$Cadena<th>$field->name</th>";
}
//Registros
$Cadena = "$Cadena</tr>";
while ($row = mssql_fetch_row($this->result)){
$Cadena = "$Cadena<tr>";
for($i=0;$i<count($row);$i++){
$valor = (strlen(trim($row[$i]))==0)?"&nbsp":$row[$i];
$Cadena = "$Cadena<td>$valor</td>";
}
$Cadena = "$Cadena</tr>";
}
break;
case "MYSQL":
//Nombre Campos
$Cadena = "$Cadena<tr>";
while ($field = mysql_fetch_field($this->result)){
$Cadena = "$Cadena<th>$field->name</th>";
}
//Registros
$Cadena = "$Cadena</tr>";
while ($row = mysql_fetch_row($this->result)){
$Cadena = "$Cadena<tr>";
for($i=0;$i<count($row);$i++){
$valor = ($row[$i]=="")?"&nbsp":$row[$i];
$Cadena = "$Cadena<td>$valor</td>";
}
$Cadena = "$Cadena</tr>";
}
break;
case "ODBC":
//Nombre Campos
$Cadena = "$Cadena<tr>";
$TotalCampos = odbc_num_fields($this->result);
for ($i=1 ; $i<=$TotalCampos ;$i++){
$Cadena = "$Cadena<th>" . odbc_field_name($this->result,$i) . "</th>";
}
//Registros
$Cadena = "$Cadena</tr>";
while (odbc_fetch_row($this->result)){
$Cadena = "$Cadena<tr>";
for($i=1;$i<= $TotalCampos;$i++){
$row = trim(odbc_result($this->result,$i));
$valor = (strlen($row) == 0)?"&nbsp":$row;
$Cadena = "$Cadena<td>$valor</td>";
}
$Cadena = "$Cadena</tr>";
}
$Cadena = "$Cadena</tr>";
break;
default: echo "Error tipo no seleccionado en TABLE<br>"; break;
}
$Cadena = $Cadena . "</Table>";
return ($Cadena);
}

//************* CLose ************************
function __destruct(){
switch($this->DATABASETYPE){
case "MSSQL":
mssql_free_result($this->result);
mssql_close($this->link);
break;
case "MYSQL":
mysql_free_result($this->result);
mysql_close($this->link);
break;
case "ODBC":
odbc_free_result($this->result);
odbc_close($this->link);
break;
default: echo "Error tipo no seleccionado en CLOSE"; break;
}
}
}
?>

///////////////////// main.php////////////////////////////////////////////

<?
$DATABASETYPE = 'MSSQL';
$SERVER = 'server';
$DATABASE = 'database';
$USER = 'usu';
$PASSWD = 'passwrod';
include_once($_SERVER['DOCUMENT_ROOT'] . '/class/sql.class.php');
$SQL = new SQL();
$SQL->DATABASETYPE = $DATABASETYPE;
$SQL->SERVER = $SERVER;
$SQL->DATABASE = $DATABASE;
$SQL->USER = $USER;
$SQL->PASSWD = $PASSWD;
$SQL->Connect();
$SQL->Query($query);
while ($row = $SQL->GetFetchArray()){
$NOM_TABLA = $row['TABLE_NAME'];
echo "<br>---------- INI $NOM_TABLA -------------<br>";
$SQL2 = new SQL();
$SQL2->DATABASETYPE = $DATABASETYPE;
$SQL2->SERVER = $SERVER;
$SQL2->DATABASE = $DATABASE;
$SQL2->USER = $USER;
$SQL2->PASSWD = $PASSWD;
$SQL2->Connect();
$query2 = "Select COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH ";
$query2 .= "From INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '" . $NOM_TABLA . "' ";
$query2 .= "Order By ORDINAL_POSITION";
$SQL2->Query($query2);
$SQL2->Table();
echo "---------- FIN $NOM_TABLA -------------<br>";
}
echo "FIN";
/////////////////// FIN MAIN ///////////////////////
se supone que al crear $SQL tiene unos valores y al crear SQL2 tiene otros valores que son diferentes...
porque al finalizar el primer SQL2 y al pasar al siguiente registro de SQL ya me da problemas? Destruye la instanca de SQL2 y al parecer tambien la SQL....

Muchas gracias.
  #7 (permalink)  
Antiguo 30/04/2006, 05:26
Avatar de lcervantes  
Fecha de Ingreso: abril-2002
Mensajes: 137
Antigüedad: 22 años
Puntos: 0
El problema puede ser en el destructor de la clase SQL.
La he comendado y me ha dejado de dar problemas..
Es como si al destruir me liberara todo...
El ejemplo anterior del mail.php es una select contra un SQLServer

Saludos
Luis
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 17:49.