Comunidad de diseño web y desarrollo en internet online

Conectar con mysqli mediante objetos

Citar            
MensajeEscrito el 11 Ene 2017 09:36 am
Hola, llevo tiempo programando con php (estructurado) y mysql y quiero comenzar a programar orientado a objetos en php y con mysqli.
Estoy intentando conectar con la base de datos y tengo el siguiente código que no me funciona:

Código :

/** clase para conectar a la base de datos - conectar.php **/
class Conectar {

    private $mysql;
    private $servidor;
    private $baseDatos;
    private $usuario;
    private $clave;
    
    //Conectar con mysql
    function __construct(&$mysql, $servidor = 'localhost', $baseDatos = 'myBase', $usuario = 'user', $clave = 'pass') {
        try {
            $this->mysql = new PDO('mysql:host=' . $servidor . ';dbname=' . $baseDatos, $usuario, $clave, 
            array(PDO::ATTR_PERSISTENT => true,
                PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8'));
        } catch (PDOException $e) {
            die("ERROR: </br>" . $e->getMessage() . "</br>");
        }
    }
    
    //validar login
    function login(&$mysql) {
        if (empty($user) || empty($pass)) {
                header("Location: index.php?login=error2") or die();
            } else {
                $user_found = FALSE;
                $pass = sha1($pass);
                $consulta = "select * from users where email = :email and password =  :pass";
                $sentencia = $mysql->prepare($consulta);
                $sentencia->bindValue(':email', $user);
                $sentencia->bindValue(':pass', $pass);
                $sentencia->execute();
                while ($fila = $sentencia->fetch()) {
                    if ($user == $fila['email']) {
                        $user_found = TRUE;
                    }
                }
                if ($user_found) {
                    $_SESSION['user'] = $user;
                    $_SESSION['pass'] = $pass;
                    $_SESSION['id'] = sha1(md5($user . $pass));
                } else {
                    $_SESSION['id'] = '';
                    header("Location: index.php?login=error") or die();
                }
            }
     }

}

/** indice de la aplicación - index.php **/

    include_once 'Conectar.php';
    $conecta = new Conectar();
    $conecta->login($mysql);
    
    echo '<h1>Biblioteca<h1>';


Si hago la conexión sin objetos, no tengo problema, es decir que he comprobado que los datos de conexión están bien y conecta debidamente. ¿Podéis ayudarme?

Por ch3ssmaster

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Ene 2017 02:06 pm
No entiendo el argumento por referencia mysql en el constructor. Luego no estas pasando parámetros en el constructor, asumo que el default son los datos correctos. Finalmente en el método login volves a pasar un argumento mysql por referencia y está esperando $user y $pass que no veo pasado como argumento ni definido por propiedad.
Te sugiero que no uses argumentos por referencia a menos que entiendas claramente para que sirven (e incluso así rompen la encapsulación, es una práctica desaconsejada para manejo de objetos)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 11 Ene 2017 04:08 pm
Lo mejor sería hacer algo así

Código :

class Database {
    protected $db;
    protected $server = 'localhost';
    protected $user = 'root';
    protected $password = '';
    protected $connection;

    public function __construct($db) {
        $this->db = $db;
    }

    /*
     * getters y setters
     */
    public function getDataBase()
    {
        return $this->db;
    }
    public function setDataBase($db)
    {
        $this->db = $db;
    }
    public function getServer()
    {
        return $this->server;
    }
    public function setServer($server)
    {
        $this->server = $server;
    }
    // ... y las demás

    public function connect() {
        try {
            $this->connection = new PDO('mysql:host='.$server.';dbname='.$db, $user, $password);
        } catch (PDOException $e) {
            die("ERROR: </br>" . $e->getMessage() . "</br>");
        }

        return $this->connection;
    }
}


Luego creas tu objeto pasando como parámetro únicamente el nombre de tu base de datos. Y posterior vas "seteando" las variables que requieras.

Código :

$mysql = new Database('base_de_datos');
$mysql->setUser('miUsiario');
$mysql->setPassword('miPassword');
$connection = $mysql->connect();

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 11 Ene 2017 10:47 pm
Hola amigo te dejare un regalito:

1. defino las constante de coneccion a la base de datos en un archivo especifico de Constantes de Sistema:

Código :

<?php
    if (!defined('CONECTOR_DB'))        define('CONECTOR_DB'    ,'PDO');
    if (!defined('DB_HOST'))                define('DB_HOST'                ,'localhost');
    if (!defined('DB_USERNAME'))        define('DB_USERNAME'        ,'root');
    if (!defined('DB_PASS'))                define('DB_PASS'                ,'');
    if (!defined('DB_PRE'))                 define('DB_PRE'             ,'TEST');
    if (!defined('DB_N_SEC'))               define('DB_N_SEC'           ,'USER');
    if (!defined('DB_PORT'))                define('DB_PORT'                ,'3306');
?>


2. Creo una Libreria de Gestion de Bases de Datos donde puedo manejar todo el codigo con respecto a esto:

Código :

<?php
class Class_BDManager{
# ============================================================================================
   function __construct(){
      # Contructior de la clase (No usado).
   }
   # ============================================================================================
   # funcion de Coneccion a la base de datos
   function Open_Con_DB($dbUsing){
      switch (CONECTOR_DB){
         case 'MySQLi':         # Conector para MySQLi
            $error      =   [];
            $error['dberror']='no';
            $dblink      =   mysqli_connect(DB_HOST, DB_USERNAME, DB_PASS);   # verificar donde se incluye el puerto
            $selected    =   mysqli_select_db($dblink,DB_PRE.$dbUsing);      # verificar donde se incluye el puerto
            if (!$selected) { $error   =   $this   ->errorDB($dblink); }            # Verificacion de Errores de Coneccion a la base de Datos
            try {
               if($error['dberror']=='si'){
                  throw new Exception('A ocurrido un Error De coneccion a la Base de Datos.<br>'.$error['msg']);
               }
            } catch (Exception $e) {
               echo 'Error: '.$e->getMessage().'<br>';
               die('Proceso Cancelado');
            }
            $dblink      ->query("SET NAMES 'utf8'");                  # Enlace de Coneccion UTF-8
            return $dblink;
         break;
         case 'Oracle':                                          # Conector para Oracle
            echo'no se puede utilizar este procedimiento';
         break;
         case 'PostGre':                                          # Conector para PostGre
            echo'no se puede utilizar este procedimiento';
         break;
         case 'SQL':                                             # Conector para SQL
            echo'no se puede utilizar este procedimiento';
         break;
         case 'PDO':                                             # Conector para PDO
            echo'no se puede utilizar este procedimiento';
         break;            
      }
   }
   #Funcion de Desconeccion a la base de datos.
   function Close_Con_DB($dblink){
      switch (CONECTOR_DB){
         
         case 'MySQLi':                                          # Desconector para MySQLy
            mysqli_close($dblink);
         break;
         
         
         case 'Oracle':                                          # Desconector para Oracle
            echo'no se puede utilizar este procedimiento';
         break;
         case 'PostGre':                                          # Desconector para PostGre
            echo'no se puede utilizar este procedimiento';
         break;
         case 'SQL':                                             # Desconector para SQL
            echo'no se puede utilizar este procedimiento';
         break;
         case 'PDO':                                             # Desconector para PDO
            echo'no se puede utilizar este procedimiento';
         break;
         default:                                             # otros
            echo'no Existe una coneccion establecida';
      }
   }
   # Funcion para generar Errores de Coneccion MySQLi
   function ErrorDB($dblink){
      $error['msg']= 'Indicacion: '.mysqli_error($dblink);
      $error['dberror']= 'si';
      return $error;
   }
   # insertar datos a BD
   function BDinsertar($dbquery,$dbUsing){
      $dblink      =      $this   ->   Open_Con_DB($dbUsing);
      mysqli_query($dblink,$dbquery) or $this   ->   errorDB($dblink);
      $this      ->   Close_Con_DB($dblink);
   }
   #Insertar Multiples Datos tablas diferentes
   function BDinsertarM($dbquery,$dbUsing){
      $dblink      =      $this   ->   Open_Con_DB($dbUsing);
      mysqli_multi_query($dblink,$dbquery) or 
      $this      ->   errorDB($dblink);
      $this      ->   Close_Con_DB($dblink);
   }
   # Obtener datos de la base de datos
   function BDquery($dbquery,$dbUsing){
      $dblink      =   $this   ->   Open_Con_DB($dbUsing);
      $datos      =   mysqli_query($dblink,$dbquery) or $this   ->   errorDB($dblink);
      $this      ->   Close_Con_DB($dblink);
      return $datos;
   }
   # ordenar busquedas
   function BDarreglar($datos){
      $arreglo   =      mysqli_fetch_array($datos);
      return $arreglo;
   }
   # ordenar busquedas
   function BDasociar($datos){
      $arreglo   =      mysqli_fetch_assoc($datos);
      return $arreglo;
   }
   # ordenar busquedas
   function BDListar($datos){
      $arreglo   =      mysqli_fetch_row($datos);
      return $arreglo;
   }
   #Ordena Busqueda
   function DBFilas($datos){
      $result   =      mysqli_num_rows($datos);
      return $result;
   }
   #Cerrar Filtro
   function BDCquery($datos){
      mysqli_free_result($datos);
   }
   #Obtiene la informacion de la tabla
   function BDInfo($dbtable,$dbUsing){
      $dbquery   =   "show columns from $dbtable;";
      $dblink      =   $this   ->   Open_Con_DB($dbUsing);
      $datos      =   mysqli_query($dblink,$dbquery) or $this   ->   errorDB($dblink);
      $this      ->   Close_Con_DB($dblink);
      return $datos;
   }
   # ============================================================================================
   #Funciones especificas para obtener datos de la DB en especial datos informativos y filtros
   function BDqueryFirstMissingINT($stmtpre,$dbUsing){ #Search Missing Lado PHP 
      $data      =   $this   ->   BDquery($stmtpre, $dbUsing);
      $row      =   $this   ->   BDarreglar($data);
      $count = 0;
      while($row   =   mysqli_fetch_array($data)){
         $count++;
         $value   =   (int)$row[0];
         if($value!==$count){
            $result = $count;
            break;
         }
      }
      return $result;
   }
   #Obtiene el Siguiente ID logico Faltante en forma compleja Consulta largas
   function BDqueryFirstMissingINTComplex($stmtpre,$dbUsing){ #Search Missing Lado Mysql para Consulta Largas
      $data      =   $this   ->   BDquery($stmtpre, $dbUsing);
      $row      =   $this   ->   BDarreglar($data);
      $result      =   $row[0];
      if($result==0){
         $result   = 1;
      }
      return $result;
   }
   #Obtiene la llave de la tabla funciona si la llabe de la tabla tiene un pattern especifico
   function DBGetKeyTBName($dbUsing,$dbtable){
      $data      =   $this   ->   BDInfo($dbtable,$dbUsing);
      $QIstring   =   $this   ->   BDarreglar($data);
      $pattern    = '/\b([^,]*KeyIdT[^,]*)\b/';
      preg_match_all($pattern, $QIstring[0], $KeyIdTs, PREG_SET_ORDER);
      foreach($KeyIdTs as $val){
         $KeyIdT = $val[1];
      }
      return $KeyIdT;
   }
   #Obtiene el Siguiente ID 
   function GetNextID($stmtpre,$DB){
      $result      =   $this   ->    BDqueryFirstMissingINTComplex($stmtpre,$DB);
      return $result;
   }
   #Obtiene el Siguiente ID logico
   function GetNextIDLogico($dbUsing,$stmtpre,$key){
      $result      =   1;
      $data      =   $this   ->   BDquery($stmtpre, $dbUsing);
      $result_exist   =   $data   ->   num_rows;
      if($result_exist<=0){
         $result    =   1;
      }else{
         $row   =   $this   ->   BDasociar($data);
         $result   =   (int)$row["$key"]+1;
      }
      return $result;
   }
   #sin desarrollar
   function ListTable($DB,$Pattern){

   }
   

# ============================================================================================
   #PDO Estructure Single DataBase
   public function PDOInsertM($dbUsing,$stmtpre){
      $started      = microtime(true);
      $DB         =[];
      $val         =[];
      $conn       = new PDO("mysql:host=".DB_HOST.";dbname=".DB_PRE."".$dbUsing."", DB_USERNAME,DB_PASS);
      $c            =0;
      foreach($stmtpre as $stmt){
         preg_match('/\binto\b\s*(\w+)/i',$stmt,$tables);
         $stmt      =   "SELECT AUTO_INCREMENT FROM  INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".DB_PRE."$dbUsing' AND TABLE_NAME = '".$tables[1]."';";
         $r         =   $conn->query($stmt);
         while ($row = $r->fetch(PDO::FETCH_ASSOC)){
            $val[$c]   =   $row["AUTO_INCREMENT"];
         }
         $c++;
      }
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      try {
         // set the PDO error mode to exception
         $stmt      ='';
         // begin the transaction
         $conn      ->beginTransaction();
         $count   =0;
         // our SQL statements
         foreach($stmtpre as $stmt){
            //echo $stmt."<br><br><br>";
            $count++;
            $conn   ->   exec($stmt);
         }
         // commit the transaction
         $conn      ->   commit();
         $DB['SMG']=   "Registro Correcto";
         $DB['R']      =   true;   #existe registro si 
      }catch(PDOException $e){
         // roll back the transaction if something failed
         $conn         ->   rollback();
         $conn         ->   beginTransaction();
         #rollback del auto_increment
         foreach($stmtpre as $stmt){
            preg_match('/\binto\b\s*(\w+)/i',$stmt,$tables);
            $conn->exec("ALTER TABLE ".$tables[1]." AUTO_INCREMENT = ".$val[0].";");
         }
         $conn         ->   commit();
         $DB['SMG']   ="Error en Tiempo de Ejecucion: " . $e->getMessage();
         $DB['R']      =false;
      }
      $conn            = null;
      $end            = microtime(true);
      $difference      = $end - $started;
      $queryTime   = number_format($difference, 10);
      $DB['T']         = "Tiempo de Ejecucion de las consultas MySQL: $queryTime ";
      $DB['S']         = "Se Realizaron $c Registros en la base de datos.";
      return $DB;
   }
   
   public function PDOUpdateM($dbUsing,$stmtpre){
      $started      = microtime(true);
      $DB         =[];
      $conn       = new PDO("mysql:host=".DB_HOST.";dbname=".DB_PRE."".$dbUsing."", DB_USERNAME,DB_PASS);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      try {
         // set the PDO error mode to exception
         $stmt      ='';
         // begin the transaction
         $conn      ->beginTransaction();
         $count   =0;
         $c=0;
         // our SQL statements
         foreach($stmtpre as $stmt){
            //echo $stmt."<br><br><br>";
            $count++;
            $conn   ->   exec($stmt);
            $c++;
         }
         // commit the transaction
         $conn      ->   commit();
         $DB['SMG']=   "Registro Correcto";
         $DB['R']      =   true;   #existe registro si 
      }catch(PDOException $e){
         // roll back the transaction if something failed
         $conn         ->   rollback();
         $conn         ->   beginTransaction();
         #rollback del auto_increment
         $conn         ->   commit();
         $DB['SMG']   ="Error en Tiempo de Ejecucion: " . $e->getMessage();
         $DB['R']      =false;
      }
      $conn            = null;
      $end            = microtime(true);
      $difference      = $end - $started;
      $queryTime   = number_format($difference, 10);
      $DB['T']         = "Tiempo de Ejecucion de las consultas MySQL: $queryTime ";
      $DB['S']         = "Se Realizaron $c Registros en la base de datos.";
      return $DB;
   }
   
   #PDO CSV Volcado
   public function PDO_UL_IUPD($dbUsing,$stmtpre){
      $started      = microtime(true);
      $DB         =[];
      $val         =[];
      $conn       = new PDO(
                           "mysql:host=".DB_HOST.";dbname=".DB_PRE."".$dbUsing."", 
                           DB_USERNAME,
                           DB_PASS,
                           array(
                              PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE,
                              PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
                              PDO::ATTR_EMULATE_PREPARES => FALSE,
                              PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
                              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                           ));
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      try {
         $conn      ->   beginTransaction();
         $count   =0;
         // our SQL statements
         foreach($stmtpre as $stmt){
            //echo $stmt."<br><br><br>";
            $count++;
            $conn   ->   exec($stmt);
         }
         $conn      ->   commit();
         $DB['SMG']   =   "Ejecucion Correcta.";
         $DB['R']   =   true;
      }catch(PDOException $e){
         $DB['SMG']   =   "Error en Tiempo de Ejecucion: " . $e->getMessage();
         $DB['R']   =   false;
      }
      return $DB;
   }
}
?>



3. La implementacion recomiendo hacerle include en la cabecera de la Aplicacion en lo mar arriba del Index, en todas las clases donde las vas a usar tienes que instanciarlas de la siguiente manera:

Código :

class Ejemplo1consultadirecta{
# ============================================================================================
   public function __construct(){
      $this   ->   DBMANAGER            =   new Class_BDManager();
   }
   function funcejemplo(){
$stmtpre                  =   "SELECT datos FROM tabla WHERE dato='$dato'" ;
               $data1                     =   $this      ->   DBMANAGER      ->   BDquery($stmtpre, DATABASE);
               $data                     =   $this      ->   DBMANAGER      ->   BDasociar($data1);

   }
}


Código :

class Ejemplo1consultabucle{
# ============================================================================================
   public function __construct(){
      $this   ->   DBMANAGER            =   new Class_BDManager();
   }
   function funcejemplo(){
$stmtpre                  =   "SELECT datos FROM tabla WHERE dato='$dato'" ;
               $data1                     =   $this      ->   DBMANAGER      ->   BDquery($stmtpre, DATABASE);


      #analisis
      $i=1;
      while($row1 = mysqli_fetch_assoc($data1)){
         $StorageID[$i]   = $row3['Sto_ID'];
         $StorageNS[$i]   = $row3['Sto_NameS'];
         $StorageNL[$i]   = $row3['Sto_NameL'];
         $StorageVL[$i]   = 0;
         $i++;
      }
}
}

Por arcanisgk

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Ene 2017 04:37 pm
Muchas gracias por vuestra ayuda, todas las respuestas me han sido de bastante utilidad. Creo que había planteado mal mi código y me toca seguir estudiando.

Por ch3ssmaster

1 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.