Autor Tema: clase para conectar con mysql  (Leído 5450 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carlos Belisario

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 263
  • Puntuación: 17
  • Sexo: Masculino
  • software lover
    • Ver Perfil
clase para conectar con mysql
« : 10 de agosto de 2010, 11:00:15 pm »
buenas estube trabajando en una clase para conectar y ejecutar consultas sql aki dejo el codigo para kien le sea util
Código: [Seleccionar]
<?php

class conexion

{

private $mysqlHost;

private $mysqlUser;

private $mysqlPass;

private $db;

private $connect;

private $query;

private $row;

public function __construct($mysqlHost="localhost",$mysqlUser="root",$mysqlPass=""#colocamos el usuario normalmente utilizado

{

$this->mysqlHost=$mysqlHost;

$this->mysqlUser=$mysqlUser;

$this->mysqlPass=$mysqlPass;

$this->conectar();

}

private function conectar()

{

$this->connect=@mysql_connect($this->mysqlHost,$this->mysqlUser,$this->mysqlPass) or die ("no se pudo conectar con el servidor ".mysql_error());

}

public function selectDb($db="db"#colocamos la base de datos normalmente utilizada

{

@mysql_select_db($db,$this->connect) or die ("Error al conectar con base de datos ".mysql_error());

}

public function ejecutarSentencia($query)

{

$this->query=mysql_query($query) or die (mysql_error());

return $this->query;

}

public function mostrarResultados($query)

{

while($this->row=mysql_fetch_assoc($query))

{

$this->result=$this->row;

return $this->result;

}

}

public function liberar()

{

mysql_free_result();

}

public function desconectar()

{

mysql_close();

}

}

?>

espero le sirva  a alguien
« Última Modificación: 10 de agosto de 2010, 11:15:43 pm por carlos_belisario »

Desconectado Carlos Belisario

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 263
  • Puntuación: 17
  • Sexo: Masculino
  • software lover
    • Ver Perfil
Re: clase para conectar con mysql
« Respuesta #1 : 10 de agosto de 2010, 11:16:54 pm »
cualkier aporte que puedan hacer seria bueno ya que mejoraria el codigo de esta clase esta sencilla pero funciona correctamente

Desconectado Carlos Belisario

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 263
  • Puntuación: 17
  • Sexo: Masculino
  • software lover
    • Ver Perfil
Re:clase para conectar con mysql
« Respuesta #2 : 20 de septiembre de 2010, 03:40:04 pm »
bueno estudiando un poco mas la oop encontre articulos que me contradecian mi clase por lo que decidi usar PDO que es una clase nativa de php para trabajar con diferentes base de datos, ademas separe responsabilidades ya que no es trabajo de la clase de conexion hacer consultas sino justamente eso realizar la conexion con la bd por lo que ahora son dos archivos que juntos hacen el trabajo espero les pueda ser util cree algunas funciones para agilizar los insert, y el buscar todos los archivos de una tabla ak el codigo
conexion.php
Código: [Seleccionar]
<?php 
require_once("config.php");
class 
Conexion extends PDO 
{
private static $_instance null;
private $_query;
private $_row;
function __construct($dbs,$type)
{
// Obtenemos el Config desde un array, clase config etc:
$config Config::getInstance();
$host=$config->Host;
if(empty($dbs)){
if($config->DBName!=""){
$db =$config->DBName;
}
else
echo "No ha configurado la base de datos";
}
else{
$db=$dbs;
}
$user $config->UserName;
$pwd $config->Password;
$attrs = array();
$dsn $type.&#39;:host=&#39;.$host.&#39;;dbname=&#39;.$db;
parent::__construct$dsn$user$pwd$attrs );
$this -> setAttribute PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
}
public static function getInstance($dbs="",$type="mysql"
{
if( self::$_instance==null){
self::$_instance = new self($dbs,$type);
}
return self::$_instance;
}

este es el archivo que se encarga de la conexion si se fijan se uso el patron singleton para que solo ubiera una instancia de la base de datos andando, si se fijan como pdo soporta varios gestores de base de datos con solo indicar el segundo parametro podemos cambiar entre los manejadores yo probe con los que conosco mysql que es el q mas he utilizado y postgre que he trabajado un poco con el por defecto coloque el mysql porq es la que mas uso, el archivo config es una clase con los parametros que se deben pasar a una base de datos aca dejo el que uso
config.php
Código: [Seleccionar]
<?php
class Config
{
public $Host=&#39;localhost&#39;;
public $DBName=&#39;unefa&#39;;
public $UserName=&#39;root&#39;;
public $Password=&#39;&#39;;
private static $_instances null;
private function __construct()
{
}
public static function getInstance() 
{
if( self::$_instances == null ) {
self::$_instances = new self();
}
return self::$_instances;
}
}
sql.php
Código: [Seleccionar]
<?php 
include("conexion.php");
class 
SQL
{
private $_conect;
private $_query;
private $_row;
private $_result;
public function __construct(){}
public function selectAll($table){
try{
$this->_conect=Conexion::getInstance();
$this->_query=$this->_conect->prepare("SELECT * FROM $table");
$this->_query->execute();
while($this->_row=$this->_query->fetch()){
$this->_result[]=$this->_row;
}
return $this->_result;
}
catch(PDOExeption $e){
echo $e->getMessaage();
}
}
public function buscarQuery($query,$parametro=NULL)
{
try{
$this->_conect=Conexion::getInstance();
$this->_query=$this->_conect->prepare($query);
$this->_query->execute($parametro);
while($this->_row=$this->_query->fetch()){
$result[]=$this->_row;
}
return  $result;
}
catch(PDOExeption $e){
echo $e->getMessaage();
}
}
public function insert($table,$campos,$valores)
{
if(!is_array($campos) || !is_array($valores)){
echo "Los datos deben de estar en formato de arreglo";
}
try{
$this->_conect=Conexion::getInstance();
$campo=implode(",",$campos);
foreach($valores as $id=>$valor){
$valorIngresar[]="&#39;".$valor."&#39;";
}
$valors=implode(",",$valorIngresar);
$sql="INSERT INTO $table ($campo) VALUES ($valors)";
$this->_conect->exec($sql);
}
catch(PDOExeption $e){
echo $e->getMessaage();
}
}
}
aca el archivo sql que se encarga de las consultas ak hice algunas funciones para ahorrar escritura revisenlas estan probadas pero si alguien tiene alguna mejora o acotacion me gustaria q la aportaran ya que mejoraria la clase saludos
« Última Modificación: 20 de septiembre de 2010, 03:59:05 pm por Carlos Belisario »

Desconectado NecroimiX

  • Novato
  • *
  • Mensajes: 3
  • Puntuación: 0
    • Ver Perfil
Re:clase para conectar con mysql
« Respuesta #3 : 01 de diciembre de 2010, 02:46:54 am »
esta bueno el codigo, y como haria uso de las clases en un formulario?

Desconectado NecroimiX

  • Novato
  • *
  • Mensajes: 3
  • Puntuación: 0
    • Ver Perfil
Re:clase para conectar con mysql
« Respuesta #4 : 01 de diciembre de 2010, 02:49:38 am »
segun lo que veo es que haz omitido el "_free_result(...)" y "_close(...)", acaso ya no es necesario?

Desconectado Carlos Belisario

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 263
  • Puntuación: 17
  • Sexo: Masculino
  • software lover
    • Ver Perfil
Re:clase para conectar con mysql
« Respuesta #5 : 01 de diciembre de 2010, 05:03:34 pm »
si te fijas trabajo heredando directamete de PDO para cerrar una conexion con esta clase lo que tendria que hacerse es limpiar la variable que la contiene, asi se cierra la conexion, saludos

y lo puedes usar en cualkier parte donde incluyas la clase
« Última Modificación: 01 de diciembre de 2010, 05:30:30 pm por Carlos Belisario »

Desconectado ashrey

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 471
  • Puntuación: 7
  • Sexo: Masculino
  • Wombat Team
    • Ver Perfil
    • Blog de ABerroteran
Re:clase para conectar con mysql
« Respuesta #6 : 01 de diciembre de 2010, 09:32:48 pm »
Igualas la instancia de la clase a Null o le das un unset, con eso se libera la memoria y se cierra la conexión.

Desconectado Carlos Belisario

  • Moderador Global
  • Fanático
  • *****
  • Mensajes: 263
  • Puntuación: 17
  • Sexo: Masculino
  • software lover
    • Ver Perfil
Re:clase para conectar con mysql
« Respuesta #7 : 02 de diciembre de 2010, 08:27:20 pm »
bueno viendo bien el post, hace un tiempo me indicaron que no es bueno usar singeton en las clases para conexiones ya que es una limitante, porque solo te deja crear una instancia y mas si la clase esta echa para realizar conexiones con distintas db, hice una mejora junto con otros compañeros que me indicaron lo que dije y quedo de esta manera para instanciar la clase
un archivo config.ini
Código: [Seleccionar]
; Every interaction with a database begins with a connection.
; Set here the parameters of the database you are using.
[MySql]
host     = 'localhost'
dbname   = 'db'
username = 'user'
password = ''
una clase ConfigReader para ver la configuracion establecida en confi.ini
Código: [Seleccionar]
<?php

class ConfigReader

{

    private 
$_config;

    public function 
__construct($archivo)

    {
       

 if (!file_exists($archivo)) {

            throw new 
Exception(&#39;No se encontro el archivo: &#39;.$archivo);

        
}

        
$this->_config parse_ini_file($archivotrue);

    }

 

    public function 
getConfig()

    {

        return 
$this->_config;

    }

}

?>

un patron registry que es lo recomendado por los compañeros para las clases de conexion
Código: [Seleccionar]
<?php

 
/**

 * Registers objects and variables

 *

 * Makes objects and variables available to any level

 * of the application without having to keep track

 * of their existence.  Also useful for objects such

 * as database connectors that are used globaly and

 * not to be duplicated.

 *

 * PHP version 5

 */

 
class registry

 
{

     
/**

      * Registry of variables and objects

      * @access private

      * @var array

      */

     
static private $registry = array();

 

     
/**

      * Adds an item to the registry

      * @access public

      * @param string item&#39;s unique name

      * @param mixed item

      * @return boolean

      */

     
public function add($name, &$item)

     {

         if (!
self::exists($name)) {

             
self::$registry[$name] = $item;

             return 
true;

         } else {

             return 
false;

         }

     }

 

     
/**

      * Returns true if item is registered

      * @access public

      * @param string item&#39;s name

      * @return boolean

      */

     
public function exists($name)

     {

         if (
is_string($name)) {

             return 
array_key_exists($nameself::$registry);

         } else {

             throw new 
Exception(&#39;Registry item\&#39;s name must be a string&#39;);

         
}

     }

 

     
/**

      * Returns registered item

      * @access public

      * @param string item&#39;s name

      * @return mixed (null if name is not in registry)

      */

     
public function &get($name)

     {

         if (
self::exists($name)) {

             
$return self::$registry[$name];

         } else {

             
$return null;

         }

         return 
$return;

     }

 

     
/**

      * Removes a registry entry

      * @access public

      * @param string item&#39;s name

      * @return boolean

      */

     
public function remove($name)

     {

         if (
self::exists($name)) {

             unset(
self::$registry[$name]);

         }

         return 
true;

     }

 

     
/**

      * Clears the entire registry

      * @access public

      * @return boolean

      */

     
public function clear()

     {

         
self::$registry = array();

     }

 }

 
?>

en mi caso una clase mysql para trabajar con este manejador aca se le da el dsn a PDO para instanciar la clase
Código: [Seleccionar]
<?php

final class MySQL extends PDO

{

    private 
$_username;

    private 
$_password;

    private 
$_host;

    private 
$_db;

 

    public function 
__construct(ConfigReader $config)

    {

        
$config_data $config->getConfig();

        
$this->_username $config_data[&#39;MySql&#39;][&#39;username&#39;];

        
$this->_password $config_data[&#39;MySql&#39;][&#39;password&#39;];

        
$this->_host $config_data[&#39;MySql&#39;][&#39;host&#39;];

        
$this->_db $config_data[&#39;MySql&#39;][&#39;dbname&#39;];

        
$this->_dsn = &#39;mysql:host=&#39;.$this->_host.&#39;;dbname=&#39;.$this->_db;

        
parent::__construct($this->_dsn$this->_username$this->_password);

    }

}

?>

el patron factory para hacer las llamadas de la clases
dbfactoryInterface
Código: [Seleccionar]
<?php

interface DbFactory_Interface

{

public static function create($sIniFile);

}

?>


Código: [Seleccionar]
<?php

error_reporting 
E_ALL );

ini_set "display_errors" ); 

include(
"DbFactory_Interface.php");

include(
"registry.php");

include(
"ConfiReader.php");

include(
"db.php");

class 
DatabaseFactory implements DbFactory_Interface

{   

    public static function 
create($sIniFile)

    {        

$config = new ConfigReader($sIniFile);        

        
$config_data $config->getConfig();

        
$database_class key($config_data);

        include(
$database_class.&#39;.php&#39;);

        
$db = new $database_class($config);

        
Registry::add($sIniFile$db);

        return 
$db;

    }

}

$db=new db();

$row=$db->selectAll(array(&#39;pedido&#39;,&#39;departamento&#39;,&#39;productos&#39;),&#39;&#39;,array(&#39;pedido.codigo_departamento=departamento.codigo_departamento&#39;,"pedido.codigo_producto=&#39;MS&#39;+productos.codigo_producto"));

print_r($row);



?>

y la clase db que es la que tiene los metodos espero que le sirva de algo a la gente de este foro
Código: [Seleccionar]
<?php 

   
#######################################################

   #          Clace para conexion con db                 #

   #                                                     #

   #   Creado por Carlos  Belisario          #

   #                                                     #

   #   Version: 3.1                                      #

   #                                                     #

   #   Fecha: 20/11/2010                                 #

   #                                                     #

   #######################################################

 
class db

{

/*establese la conexion*/

protected $_conect;

/*trabaja los query*/

protected $_query;

/*resultados de las consultas*/

protected $_row;

protected $_result;

public function __construct()

{

$site_path realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.&#39;config.ini&#39;;

$this->_conect=DatabaseFactory::create($site_path);

}

/*trae todos los datos de las tablas indicadas en el array tabla*/

public function selectAll($table = array(),$condicion = array(),$relacion = array()){

$result = array();

try{

if(!array($table)){

die("Las Tablas deben de estar en formato arreglo");

}

if(count($table)>1){

foreach($table as $id=>$valor){

if($id==0){

$tablas $valor." INNER JOIN ".next($table)." ON(".$relacion[$id].")";

}

else{

if($id!=1){

$tablas.= " INNER JOIN ".$valor." ON(".$relacion[$id-1].")";

}

}

}

}

else{

$tablas $table[0];

}

if(empty($condicion))

{

$sql "SELECT * FROM $tablas";

$this->_query $this->_conect->prepare($sql);

$this->_query->execute();

}

else{

foreach($condicion as $key=>$value){

$parametros[] = "$key=?";

$condic[] = $value;

}

$condiciones implode(" AND ",$parametros);

$sql "SELECT * FROM $tablas WHERE $condiciones";

$this->_query $this->_conect->prepare($sql);

$this->_query->execute($condic);

}

while($this->_row $this->_query->fetch()){

$result[] = $this->_row;

}

return $result;

}

catch(PDOExeption $e){

echo $e->getMessaage();

}

}

/*ejecuta una sentencia de MySQL Preparada usando el formato de PDO*/

public function ejecutarSentencia($query,$parametro NULL,$return false)

{

$result=array();

try{

$this->_query $this->_conect->prepare($query);

$this->_query->execute($parametro);

if($return==true){

while($this->_row $this->_query->fetch()){

$result[] = $this->_row;

}

return $result;

}

}

catch(PDOExeption $e){

echo $e->getMessaage();

}

}

/*inserta registros en la base de datos*/

public function insert($table,$valores)

{

if(!is_array($valores)){

echo "Los datos deben de estar en formato de arreglo";

}

try{

foreach($valores as $id=>$valor){

$parametros[] = &#39;?&#39;;

$campos[] = $id;

$value[] = $valor;

}

$val implode(",",$parametros);

if(!empty($campos)){

$fields implode(",",$campos);

$sql="INSERT INTO $table ($fields) VALUES ($val)";

}

$insert=$this->_conect->prepare($sql);

$insert->execute($value);

}

catch(PDOExeption $e){

echo $e->getMessaage();

}

}

/*Actualiza registros de la base de datos*/

public function update($table,$valores,$condicion)

{

if(!is_array($valores)){

echo "Los datos deben de estar en formato de arreglo";

}

try{

foreach($valores as $id=>$valor){

$parametro[]="$id=?";

$values[]=$valor;

}

foreach($condicion as $key=>$value){

$de=explode(".",$value);

if(count($de)>1){

$parametro_condicion[]="$key=$value";

}

else{

$parametro_condicion[]="$key=?";

$values[]=$value;

}

}

$parm=implode(",",$parametro);

$condiciones=implode(" AND ",$parametro_condicion);

$sql="UPDATE $table SET $parm WHERE $condiciones"

$update=$this->_conect->prepare($sql);

$update->execute($values);

}

catch(PDOExeption $e){

echo $e->getMessaage();

}

}

/*borra registros de la base de datos*/

public function deleteAll($table,$condicion=NULL,$return=false)

{

try{

foreach($condicion as $key=>$value){

$de=explode(".",$value);

if(count($de)>1){

$valorCondicion[]="$key=".$value;

}

else{

$valorCondicion[]="$key=&#39;".$value."&#39;";

}

}

$condiciones=implode(" AND ",$valorCondicion);

$this->_result=$this->_conect->exec("DELETE FROM $table WHERE $condiciones");

if($return){

return $this->_result;

}

}

catch(PDOExeption $e){

echo $e->getMessaage();

}

}

#reinicia la base de datos 

public function reiniciarTabla($table){

try{

$this->_result=$this->_conect->exec("TRUNCATE TABLE $table");

}

catch(PDOExeption $e){

echo $e->getMessaage();

}

}

}
[/
CODE ]
para mayor informacion sobre esta clase en un articulo de mi blog http://desphpparatodos.blogspot.com/2010/12/clase-para-conexion-utilizando-pdo-el.html hice una publicacion de como trabajarla dando mayor explicacion saludos
« Última Modificación: 15 de diciembre de 2010, 07:27:18 pm por Carlos Belisario »