January 04, 2006
Uso de herencia en AMFPHP en conexiones a bases de datos.
Esto es algo que he venido queriendo escribir desde hace rato....ahora aprovecho la oportunidad de que ando desarrollando una miniaplicación que me permita elaborar las facturas mas fácilmente (odio llenar los campos a mano en word). Básicamente lo que hace este desarrollo es llevar un registro de los clientes con los que trabajo (son sus respectivos datos como clave de factuación y domicilio), el tipo de trabajo realizado y algunas cotizaciones que yo pueda modificar. La ventaja es que me hace el desglose de impuestos automáticamente. Como se imaginarán (por el título) uso una base de datos que es MySQL. La situación es que, como muchos sabrán, cuando han manejado conexiones de bases de datos en una página, es muy práctico crear un típico archivo que se suele llamar config.php donde tenemos las conexiones y contraseñas. En AmfPhp como bien sabrán construimos nuestros servicios a base de clases de PHP. Y si son clases, porque no usar herencia? Ya habia comentado algo de herencia en AmfPHP en este tutorial pero aquí lo extenderemos a conexiones a bases de datos.
Básicamente este es el codigo que suelo usar para mi clase Config que esta dentro de un archivo llamado Config.php.
<?PHP
class Config {
//-------------------------
//Configuraciones MySQL
var $dbhost = "localhost";
var $dbname = "facturacion";
var $dbuser = "root";
var $dbpass = "";
//-------------------------
function Config ($db) {
if(basename($_SERVER['PHP_SELF']) == "Config.php") exit; //Esta línea es para evitar que accedan al archivo de manera pública.
$this->conn = $this->connect($db);
}
function connect ($db) {
if(!$conn = @mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass)) {
return false;
}
if (!@mysql_select_db ($db, $conn)) {
return false;
}
return $conn;
}
function log ($log) {
$file = readfile("log.txt");
$open = fopen ("log.txt", "w+");
$file .= date ("\l\o\g :::: d/m/Y h:m:s ----> ", time()).$log."\n";
fwrite ($open, $file);
fclose ($open);
}
}
?>
Si se leen detenidamente el código, creo unas propiedades al inicio de Config donde estan mis configuraciones de la base de datos. Dentro de la función constructora hago la conexión ademas de agregar una pequeña línea de seguridad. Ahí mismo verán que requiero como argumento el nombre de la base de datos y guardo el id de la conexión, aún a pesar de que la defino previamente como propiedad. Esto es porque en ocasiones en un projecto grande hacemos conexiones a mas de una base de datos. Esto me da la posibilidad de que en un servicio diferente sobreescriba la propiedad $dbname y todo siga funcionando correctamente. Mas adelante ustedes verán la función de connect (no tiene mucha ciencia si ya saben combinar PHP con MySQL) y otra llamada log la cual me ha llegado a resultar ser muy útil a la hora del debugeo del lado de AMFPHP. Muchos sabrán que cuando usamos remoting tenemos al NetConection Debugger para depurar la aplicación del lado de Flash....pero no tenemos nada del lado del servidor, por eso creo esa función que me permite llevar un cierto registro. Ahora en nuestro servicio hijo hacemos lo siguiente :
<?PHP
include_once ("Config.php");
class Billing extends Config {
function Billing () {
parent::__construct($this->dbname);//Esta linea llama al constructor de la clase.
$this->methodTable = array (
"getClients" => array (
"description" => "Get the client list from db.",
"access" => "remote",
"arguments" => array ()
)
);
}
//Metodos
/*-----------------------------------*/
function getClients () {
$query = "SELECT `client` AS label, `id` AS data, `address`, `rfc` FROM `clients` ORDER BY `client`;";
$this->log($query);//Uso el método heredado log para hacer debugeos
return mysql_query($query, $this->conn);
}
}
?>
Lo primero que hacemos primero es incluir el archivo Config.php y después establecemos la herencia con la palabra reservada extends. Además, si ven dentro de la función constructora de Billing hay una línea como esta :
parent::__construct($this->dbname);
Esta línea lo que hace es llamar a la funcion constructora de la superclase donde establecemos la conexion de la base de datos creandonos automáticamente la propiedad $conn que es muy importante para que si en un mismo servicio usamos dos bases de datos, podamos crear una conexion temporal en algún método (por eso dejo que la función connect heredable dentro de Config). También verán que dentro de getClients uso el método log que definí en la superclase Config. No es necesario usar ese método ahí, pero sirve para ilustrar el uso que se le puede dar.
En fin, este es todo el tutorial...la idea es proveer una solución mas elegante a las conexiones de bases de datos en remoting...por ahí he visto otras maneras usando constantes definidas en un archivo config.php pero nunca he han gustados. Espero que les sirva a algunos. Saludos!
Básicamente este es el codigo que suelo usar para mi clase Config que esta dentro de un archivo llamado Config.php.
<?PHP
class Config {
//-------------------------
//Configuraciones MySQL
var $dbhost = "localhost";
var $dbname = "facturacion";
var $dbuser = "root";
var $dbpass = "";
//-------------------------
function Config ($db) {
if(basename($_SERVER['PHP_SELF']) == "Config.php") exit; //Esta línea es para evitar que accedan al archivo de manera pública.
$this->conn = $this->connect($db);
}
function connect ($db) {
if(!$conn = @mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass)) {
return false;
}
if (!@mysql_select_db ($db, $conn)) {
return false;
}
return $conn;
}
function log ($log) {
$file = readfile("log.txt");
$open = fopen ("log.txt", "w+");
$file .= date ("\l\o\g :::: d/m/Y h:m:s ----> ", time()).$log."\n";
fwrite ($open, $file);
fclose ($open);
}
}
?>
Si se leen detenidamente el código, creo unas propiedades al inicio de Config donde estan mis configuraciones de la base de datos. Dentro de la función constructora hago la conexión ademas de agregar una pequeña línea de seguridad. Ahí mismo verán que requiero como argumento el nombre de la base de datos y guardo el id de la conexión, aún a pesar de que la defino previamente como propiedad. Esto es porque en ocasiones en un projecto grande hacemos conexiones a mas de una base de datos. Esto me da la posibilidad de que en un servicio diferente sobreescriba la propiedad $dbname y todo siga funcionando correctamente. Mas adelante ustedes verán la función de connect (no tiene mucha ciencia si ya saben combinar PHP con MySQL) y otra llamada log la cual me ha llegado a resultar ser muy útil a la hora del debugeo del lado de AMFPHP. Muchos sabrán que cuando usamos remoting tenemos al NetConection Debugger para depurar la aplicación del lado de Flash....pero no tenemos nada del lado del servidor, por eso creo esa función que me permite llevar un cierto registro. Ahora en nuestro servicio hijo hacemos lo siguiente :
<?PHP
include_once ("Config.php");
class Billing extends Config {
function Billing () {
parent::__construct($this->dbname);//Esta linea llama al constructor de la clase.
$this->methodTable = array (
"getClients" => array (
"description" => "Get the client list from db.",
"access" => "remote",
"arguments" => array ()
)
);
}
//Metodos
/*-----------------------------------*/
function getClients () {
$query = "SELECT `client` AS label, `id` AS data, `address`, `rfc` FROM `clients` ORDER BY `client`;";
$this->log($query);//Uso el método heredado log para hacer debugeos
return mysql_query($query, $this->conn);
}
}
?>
Lo primero que hacemos primero es incluir el archivo Config.php y después establecemos la herencia con la palabra reservada extends. Además, si ven dentro de la función constructora de Billing hay una línea como esta :
parent::__construct($this->dbname);
Esta línea lo que hace es llamar a la funcion constructora de la superclase donde establecemos la conexion de la base de datos creandonos automáticamente la propiedad $conn que es muy importante para que si en un mismo servicio usamos dos bases de datos, podamos crear una conexion temporal en algún método (por eso dejo que la función connect heredable dentro de Config). También verán que dentro de getClients uso el método log que definí en la superclase Config. No es necesario usar ese método ahí, pero sirve para ilustrar el uso que se le puede dar.
En fin, este es todo el tutorial...la idea es proveer una solución mas elegante a las conexiones de bases de datos en remoting...por ahí he visto otras maneras usando constantes definidas en un archivo config.php pero nunca he han gustados. Espero que les sirva a algunos. Saludos!
Comentarios
Hola, me agrado mucho tu tutorial y sobre todo por la seguridad que le implementas.
Solo una pequeña duda, en la funcion "getClients" antes del "return", no se deberia cerrar la coneccion a la base de datos, si es asi deberia de ser simplemente: mysql_close() o mysql_close($this->conn);
Gracias y saludos de antemano.
Solo una pequeña duda, en la funcion "getClients" antes del "return", no se deberia cerrar la coneccion a la base de datos, si es asi deberia de ser simplemente: mysql_close() o mysql_close($this->conn);
Gracias y saludos de antemano.
Hola phpleo
se puede cerrar la conexion con mysql_close($this->conn); como dices, pero recuerda que PHP automaticamente cierra las conexiones a mysql una vez finalize el script...realmente esto es necesario nada mas cuando tienes muchismas conexiones en tu script, y deseas liberar algo de memoria ;)
saludos!
se puede cerrar la conexion con mysql_close($this->conn); como dices, pero recuerda que PHP automaticamente cierra las conexiones a mysql una vez finalize el script...realmente esto es necesario nada mas cuando tienes muchismas conexiones en tu script, y deseas liberar algo de memoria ;)
saludos!
Saludos!, tu blog es muy interesante, me gustaría si es posible que me dieras alguna pista y un consejo, en mi escuela estamos haciendo una base de datos en php y ahora estamos implementando un modulo de recuperacion a través de un log; lo podemos hacer pormedio del uso de cookies???, que me recomiendas?
como puedo llamar la base de datos desde php
Great
Thanks.
Felicidades por tu ponencia, estubo muy bien explicada !!!
Si, Felicidades por tu ponencia, estubo muy bien explicada !
tu blog es muy interesante ! Thanks
Gracias y saludos de antemano.