Foros del Web » Programando para Internet » PHP »

PHP OO Dudas con PHP y POO !!!

Estas en el tema de Dudas con PHP y POO !!! en el foro de PHP en Foros del Web. Buen día, tal y como lo vengo diciendo hace un tiempo, estoy introduciéndome al mundo de la poo. Tome uno de mis proyectos ya realizados ...
  #1 (permalink)  
Antiguo 15/06/2018, 08:41
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Dudas con PHP y POO !!!

Buen día, tal y como lo vengo diciendo hace un tiempo, estoy introduciéndome al mundo de la poo.

Tome uno de mis proyectos ya realizados en estructurada, es un archivo que solo muestra una tabla con una serie de eventos a realizarse en la empresa, algo sencillo.

Pues lo primero que hice fue colocar ese archivo como index y realice un árbol así:
Cita:
Index.php
--root/
----loader.php
----class/
------config.php
------database.php
Archivo index.php
Código PHP:
Ver original
  1. <?php
  2.     // require_once(DIR_ROOT.SLASH.'loader.php'); // No funciona
  3.     require_once('root/loader.php');
  4.     echo DBM::conexion();
  5.     echo DBM::desconectar();
  6. ?>

Archivo loader.php
Código PHP:
Ver original
  1. <?php
  2.     define('SLASH', DIRECTORY_SEPARATOR);
  3.     define('DIR_ROOT', realpath(dirname(__FILE__)));
  4.     // define('DIR_CLASS', DIR_ROOT."/".'class'); // Preferi usar la constante
  5.     define('DIR_CLASS', DIR_ROOT.SLASH.'class'.SLASH);
  6.  
  7.     require_once(DIR_CLASS.'config.php');
  8.     require_once(DIR_CLASS.'database.php');
  9. ?>

Archivo database.php
Código PHP:
Ver original
  1. <?php
  2.     // error_reporting(0);
  3.     require_once(DIR_ROOT.SLASH.'loader.php');
  4.  
  5.     class DBM{
  6.         private $conexion;
  7.         private $database;
  8.  
  9.         public function conexion()
  10.         {
  11.             return self::conectar();
  12.         }
  13.  
  14.         private function conectar(){
  15.             $conexion = mysqli_connect(DB_HOST,DB_USER,DB_PASS);
  16.             $database = mysqli_select_db($conexion, DB_DATABASE);
  17.  
  18.             if (!$conexion){
  19.                 $response = '<b>Error al conectar al Servidor !!!</b> '.mysqli_connect_error();
  20.                 return $response;
  21.             }
  22.             else{
  23.                 if (!$database) {
  24.                     $response = 'Error al conectar con la Base de Datos <b>'.DB_DATABASE.'</b> '.mysqli_error($conexion);
  25.                     return $response;
  26.                 }
  27.                 else{
  28.                     $response .= $conexion->host_info . "<br>";
  29.                     $response .= 'Conectado al Servidor: <b>'.DB_HOST.'</b><br>';
  30.                     $response .= 'Base de Datos: <b>'.DB_DATABASE.'</b><br>';
  31.                     mysqli_set_charset($conexion, 'utf8');
  32.                     $response .= ('Conjunto de caracteres de la Base de Datos es: <b>'.$conexion->character_set_name().'</b><br>');
  33.                     return $response;
  34.                 }
  35.             }
  36.         }
  37.  
  38.         public function desconectar(){
  39.             $conexion = self::conexion();
  40.             echo '<hr>';
  41.             var_dump($conexion);
  42.             echo '<hr>';
  43.             if (isset($conexion)) {
  44.                 mysqli_close($conexion); //Linea 44
  45.                 unset($conexion);
  46.                 if (mysqli_close($conexion)) { // Linea 46
  47.                     $response = '<hr>Conexion a la Base de Datos Cerrada !!!';
  48.                     return $response;
  49.                 }
  50.                 else{
  51.                     $response = '<hr>La Conexion a la Base de Datos sigue Abierta !!!';
  52.                     return $response;
  53.                 }
  54.             }
  55.             else{
  56.                 $response = 'Conexion no esta definida';
  57.                 return $response;
  58.             }
  59.         }
  60.     }
  61.  
  62.     // $dbm = new DBM();
  63. ?>

Dudas

1- Porque desde index.php si coloco require_once(DIR_ROOT.SLASH.'loader.php'); no funciona, pero si coloco require_once('root/loader.php'); si ??

2- En database.php esta correcta la funcion conectar?? Osea, si funciona y muestra tal cual la informacion de los echo, pero no se si esta bien diseñada. o si el hecho de "redeclarar" $conexion es incorrecto?

3- La función desconectar esta bien diseñada?? Tengo dudas en esa variable $conexion puesto que el ejemplo que he seguido utiliza $this->conexion pero yo he englobado eso en la variable $conexion en la función conectar(), no se si deba hacerlo en cada función ?? me refiero al código $conexion = $this->conexion ??
A parte de eso No funciona, pongo captura del resultado


4- El ejemplo que estoy siguiendo es el que se puede descargar en Este Link, y esa gente hace una funcion para cada cosa.

5- Cual seria la forma de hacer una función para tratar todos los select? o hay que hacer una función por cada select ? de ser así es lo mismo que en estructurada

6- Tambien estaba siguiendo un curso de Cesar Cancino pero es super viejo, hoy estoy siguiendo Este de Facultad Autodidacta
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.

Última edición por KATHYU; 15/06/2018 a las 08:56
  #2 (permalink)  
Antiguo 15/06/2018, 10:14
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Información Respuesta: Dudas con PHP y POO !!!

hola bueno primero tienes que partir de que PHP es un leguaje de programacion interpretado, no es compilado como C y otros
Cita:
1- Porque desde index.php si coloco require_once(DIR_ROOT.SLASH.'loader.php'); no funciona, pero si coloco require_once('root/loader.php'); si ??
es logico ya que usas la constante DIR_ROOT y SLASH, y dichas constantes son declaradas o creadas dentro del archivo 'loader.php', osea como puedes comer el PAN sin que antes habaerlo comprado? o es como decir como que quieres usar algo que no es creado, y bueno tienes leer la documentacion oficial de PHP muchas funciones que estan en los archivos son usados por que en ese tiempo no existian funciones o constantes que ahora existen como __DIR__


Cita:
2- En database.php esta correcta la funcion conectar?? Osea, si funciona y muestra tal cual la informacion de los echo, pero no se si esta bien diseñada. o si el hecho de "redeclarar" $conexion es incorrecto?
bueno primero tienes que ver que estas usando POO y tienes que pensar en unas situaciones si , es que digamos en un proceso vas a conectarte y desconectarte reiteradas veces o simplemente quieres conectarte una vez y luego cuando el script termine desconectarte de la base de datos, el planteamiento esta bien, si tu script fuera algo que se ejecute infinitamente por ejemplo al usar CLI de php , pero veo que estas aprendiendo asi que la situacion es distinta ya que estaras conectandote una vez y luego cuando el script termine simplemente se liberan todos los recursos
en POO de php puedes aprovechar los metodos "magicos" http://php.net/manual/es/language.oop5.magic.php
y ahi agregarle tus funciones de conexion y desconexion, al momento de crear tu objecto y al destruirlo
a me olvidaba dentro de los metodos de tu clase para acceder a un metodo o variable tienes que indicarlo explisitamente como $this->Nombre_propiedad; en POO $this es lo que debes usar, de lo contrario te dara errores

Cita:
3- La función desconectar esta bien diseñada?? Tengo dudas en esa variable $conexion puesto que el ejemplo que he seguido utiliza $this->conexion pero yo he englobado eso en la variable $conexion en la función conectar(), no se si deba hacerlo en cada función ?? me refiero al código $conexion = $this->conexion ??
A parte de eso No funciona, pongo captura del resultado
no, si quieres llenar la propiendad conexion de tu clase debes llenarla con $this->conexion , ya que en ningun momento estas volviendolo global, para ello estan

function ejemplo(){ global $este_si_es_global; $este_si_es_global=1; } o

$GLOBALS['este_si_es_global']=1

cualquiera hace lo mismo, pero no es recomendable, no es cosas de malas practicas, no lo hagas enserio, no te mal acostumbres


Cita:
4- El ejemplo que estoy siguiendo es el que se puede descargar en Este Link, y esa gente hace una funcion para cada cosa.
le di una hojeada, y pues si bien parece una monstruosidad , tienen ciertas reglas, funciones globales y estructura definida, pues funciona por que ellos son varios y tiene una organizacion, es como si crearan un edificio , el cual despues de terminado ,hacerle modificaciones les costara un monton ,
mi recomendacion personal, si empiezas algo y quieres luego utilizar esee algo en varios proyectos organizate bien, crea tu propia DOCUMENTACION y una estructura base o DEMO, php es muy flexible te permite hacer muchas cosas , lo malo es que esa libertad puede entorpecer el trabajo en lugar de ayudarlo, puedes usar patrones de DISEÑO MVC ,etc existen varios patrones, incluso podrias crear tu mismo uno


Cita:
5- Cual seria la forma de hacer una función para tratar todos los select? o hay que hacer una función por cada select ? de ser así es lo mismo que en estructurada
jeej creo que la gripe y fiebre me destruyo algunas neuronas incluyendo la de mi gramatica , pero no te comprendi a que te referias, SELECT, html,mysql,delphi, c++,fortran,unix,
Cita:
6- Tambien estaba siguiendo un curso de Cesar Cancino pero es super viejo, hoy estoy siguiendo Este de Facultad Autodidacta
existen muchos cursos, libres y gratuitos pero la mayoria como el que estas viendo, estan desactualizadas, lo que te recomiendo, es que busques otros , no te estanques, veras cosas interesantes, hay incluso terminos que jamas usan, o no le toman importancia, como las variables por REFERNCIA, las clases FLUENT, , cuando estes ya un poco mas entendible en php, prueba ver como funcionan algunas librerias como PHP_MAILER, o SWIFTIMAILER , trata de comprender por que lo hicieron asi y no asi, ejeje
  #3 (permalink)  
Antiguo 15/06/2018, 10:46
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Que mal, quede peor

Si pongo
Código PHP:
Ver original
  1. $this->conexion = mysqli_connect(DB_HOST,DB_USsaER,DB_PASS,DB_DATABASE);
  2.             mysqli_set_charset($this->conexion, 'utf8');

Me sale: "Fatal error: Using $this when not in object context" puesto que tengo la funcion conectar como privada y accedo a ella con la funsion publica conexion (se supone que es mas seguro asi)
-----------------------------EDITO-------------------------------------

Cambie la lógica según tuadmin recomendo y he logrado abrir, mostrar los mensajes del servidor (cosa que es solo de prueba) y cerrar la conexión con éxito, segun parece.

Al final el archivo database.php quedo asi:
Código PHP:
Ver original
  1. <?php
  2.     // error_reporting(0);
  3.     require_once(DIR_ROOT.SLASH.'loader.php');
  4.  
  5.     class DBM{
  6.         private $conexion;
  7.  
  8.         public function conexion()
  9.         {
  10.             return self::conectar();
  11.         }
  12.  
  13.         private function conectar(){
  14.             $this->conexion = mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_DATABASE);
  15.             mysqli_set_charset($this->conexion, 'utf8');
  16.  
  17.             if (!$this->conexion){
  18.                 $response = '<b>Error al conectar al Servidor !!!</b> '.mysqli_connect_error();
  19.                 return $response;
  20.             }
  21.             else{
  22.                     // var_dump($this->conexion);
  23.                     // $response .= $this->conexion->host_info . "<br>";
  24.                     // $response .= 'Conectado al Servidor: <b>'.DB_HOST.'</b><br>';
  25.                     // $response .= 'Base de Datos: <b>'.DB_DATABASE.'</b><br>';
  26.  
  27.                     // $response .= ('Conjunto de caracteres de la Base de Datos es: <b>'.$this->conexion->character_set_name().'</b><br>');
  28.                     // return $response;
  29.             }
  30.         }
  31.  
  32.         public function desconectar(){
  33.             // echo '<hr>';
  34.             // var_dump($this->conexion);
  35.             // echo '<hr>';
  36.             if (isset($this->conexion)) {
  37.                 $cerrar = mysqli_close($this->conexion); //Linea 44
  38.                 unset($this->conexion);
  39.                 if ($cerrar) { // Linea 46
  40.                     $response = '<hr>Conexion a la Base de Datos Cerrada !!!';
  41.                     return $response;
  42.                 }
  43.                 else{
  44.                     $response = '<hr>La Conexion a la Base de Datos sigue Abierta !!!';
  45.                     return $response;
  46.                 }
  47.             }
  48.             else{
  49.                 $response = 'Conexion no esta definida';
  50.                 return $response;
  51.             }
  52.         }
  53.     }
  54.  
  55.     $dbm = new DBM();
  56. ?>


Y en el index, ya no lo llamo con :: si no con $dbm->function_name();

Con lo del curso, es uno de los mas actalizados que he encontrado.
Con lo del SELECT, es como si dijera las querys de consulta a la DB.
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.

Última edición por KATHYU; 15/06/2018 a las 11:11
  #4 (permalink)  
Antiguo 15/06/2018, 11:37
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Cita:
Iniciado por tuadmin Ver Mensaje
bueno primero tienes que ver que estas usando POO y tienes que pensar en unas situaciones si , es que digamos en un proceso vas a conectarte y desconectarte reiteradas veces o simplemente quieres conectarte una vez y luego cuando el script termine desconectarte de la base de datos, el planteamiento esta bien, si tu script fuera algo que se ejecute infinitamente por ejemplo al usar CLI de php , pero veo que estas aprendiendo asi que la situacion es distinta ya que estaras conectandote una vez y luego cuando el script termine simplemente se liberan todos los recursos
en POO de php puedes aprovechar los metodos "magicos" http://php.net/manual/es/language.oop5.magic.php
y ahi agregarle tus funciones de conexion y desconexion, al momento de crear tu objecto y al destruirlo
a me olvidaba dentro de los metodos de tu clase para acceder a un metodo o variable tienes que indicarlo explisitamente como $this->Nombre_propiedad; en POO $this es lo que debes usar, de lo contrario te dara errores
Pregunto, que es mejor? Cerrar la conexion con cada consulta y cosas asi, o mandar a llamar a la funcion desconectar() solo al final del scrip ??

Por ejemplo, el sistema que les puse, de donde estoy tomando las referencias, ponen la funcion de desconectar en el footer, eso significa que cierran la conexion en todas las vsitas html, pero solo la cierran cuando ya se han ejecutado todos los scripts y todas las querys, que tan bueno es eso ??

Una vez tengo la conexion y la desconexion, comenzare a hacer las clases y funciones de las querys, asi que esperen mas preguntas


Con lo del patron MVC, no se si es posible implementarlo con codigo puro o es necesario un framework? Con symfony, medio vi y entendi, como funciona MVC. En las vistas, ya no se ponia codigo php si no que llamadas a variables con twig, pero eso es muy pro aun para que lo haga en codigo puro, algun buen ejemplo de MVC que alguien tenga por ahi ?? Puede ser un CRUD basico, le agradecere mucho
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #5 (permalink)  
Antiguo 15/06/2018, 12:37
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Información Respuesta: Dudas con PHP y POO !!!

Cita:
Pregunto, que es mejor? Cerrar la conexion con cada consulta y cosas asi, o mandar a llamar a la funcion desconectar() solo al final del scrip ??
abrir una conexion en un script php es mas moroso claro hablando de microsegundos, te recomiendo abrir la conexion cuando necesites la consulta y si usas los metodos magicos __destruct dentro de ella manda o ordena cerrar la conexion, cuando no necesites el objecto o la clase de abse de datos solo eliminala y se quitara tambien la conexion SQL
Cita:
Por ejemplo, el sistema que les puse, de donde estoy tomando las referencias, ponen la funcion de desconectar en el footer, eso significa que cierran la conexion en todas las vsitas html, pero solo la cierran cuando ya se han ejecutado todos los scripts y todas las querys, que tan bueno es eso ??
lo que ponen es que cierra la conexion SI EXISTE una CONEXIOn, no es que cierran por cerrar, recuerda tomar eso en cuenta, antes de cerrar tienes que comprobar que la conexion realmente existe, o sino te dara un error, php tiene un GarbageCollector, bueno todos los lenguajes actualmente tienen uno, que se encarga de ello, de cerrar conexiones , eliminar variables memorias, pero es mejor tener todo controlado

Cita:
Una vez tengo la conexion y la desconexion, comenzare a hacer las clases y funciones de las querys, asi que esperen mas preguntas
eso esta muy bien, para aprender ya cuando quieras expandir mas las cosas veras que ya existen, CLASES en php que hacen lo que quieres, sin llegar a usar los grandisimos frameworks, aunque hay de todos los colores y sabores

Cita:
Con lo del patron MVC, no se si es posible implementarlo con codigo puro o es necesario un framework? Con symfony, medio vi y entendi, como funciona MVC. En las vistas, ya no se ponia codigo php si no que llamadas a variables con twig, pero eso es muy pro aun para que lo haga en codigo puro, algun buen ejemplo de MVC que alguien tenga por ahi ?? Puede ser un CRUD basico, le agradecere mucho ç
mmm bueno antes de meterte de lleno en un framework tienes que saber que es lo que necesitas con exactitud y si es que el framework cumple todo lo que necesitas, recuerda que la mayoria de frameworks hacen uso de PSEUDO CODIGO, no me gusta en lo particular, pero todo depende del proyecto, que quieras realizar, php de por si ya es un parseador de templates como TWIG

Código PHP:
<a href="<?=$variable_enlace?>"><?=(1==2?'1 es igual a 2':'1 no es igual a 2')?></a>
<ul>
<?php foreach(array(1,2,3,4,5,6,6) as $numero):?>
<li><?=$numero?></li>
<?php endforeach;?>
</ul>
en php existe el SHORT tags que son en vez de <?php echo es igual a <?=

puedes si quieres dominar un framework pero como te mencione a veces son demasiados robustos, son como querer usar un cañon para matar una mosca. ahora si quieres puedes empezar por cosas pequeñas y ya luego integrarlas a tu proyecto

http://idiorm.readthedocs.io/en/latest/querying.html

es un proeycto muchos años ensima pero tiene casi todo cubierto y bien estructurado

a tambien, busca informacion sobre los AUTOLOADERS,

http://php.net/manual/es/language.oop5.autoload.php

todos los frameworks tienen una incorpacion de los autoloaders
  #6 (permalink)  
Antiguo 15/06/2018, 14:34
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Cita:
Iniciado por tuadmin Ver Mensaje
abrir una conexion en un script php es mas moroso claro hablando de microsegundos, te recomiendo abrir la conexion cuando necesites la consulta y si usas los metodos magicos __destruct dentro de ella manda o ordena cerrar la conexion, cuando no necesites el objecto o la clase de abse de datos solo eliminala y se quitara tambien la conexion SQL
Aun no llego a los métodos destructores, incluso quise implementar un constructor en esta clase y no pude hacerlo funcionar.

Entonces, según le entiendo, si hago un __destruct() en la clase conectar, este automáticamente cerrara la conexión a MySQL?? Como llamo a un __construct o a un __destruct ??


Cita:
Iniciado por tuadmin Ver Mensaje
lo que ponen es que cierra la conexion SI EXISTE una CONEXIOn, no es que cierran por cerrar, recuerda tomar eso en cuenta, antes de cerrar tienes que comprobar que la conexion realmente existe, o sino te dara un error, php tiene un GarbageCollector, bueno todos los lenguajes actualmente tienen uno, que se encarga de ello, de cerrar conexiones , eliminar variables memorias, pero es mejor tener todo controlado
Para este caso, mi funcion desconectar esta bien?? pongo un isset($this->conexion) antes de pasar a cerrar la conexion



Cita:
Iniciado por tuadmin Ver Mensaje
eso esta muy bien, para aprender ya cuando quieras expandir mas las cosas veras que ya existen, CLASES en php que hacen lo que quieres, sin llegar a usar los grandisimos frameworks, aunque hay de todos los colores y sabores
Ejemplo de unas clases asi por favor ?? (solo para analizarlas)

Cita:
Iniciado por tuadmin Ver Mensaje
en php existe el SHORT tags que son en vez de <?php echo es igual a <?=
Investigare mas de esos Short Tags

Cita:
Iniciado por tuadmin Ver Mensaje
puedes si quieres dominar un framework pero como te mencione a veces son demasiados robustos, son como querer usar un cañon para matar una mosca. ahora si quieres puedes empezar por cosas pequeñas y ya luego integrarlas a tu proyecto

http://idiorm.readthedocs.io/en/latest/querying.html

es un proeycto muchos años ensima pero tiene casi todo cubierto y bien estructurado
Ese ORM se ve bastante robusto solo me acuerdo de doctrine en symfony. Me gustaría hacer algo parecido, pero con las querys, me imagino que la mayoría de los ORM's pasan a clases las tablas y asi las trabajan ??


Cita:
Iniciado por tuadmin Ver Mensaje
a tambien, busca informacion sobre los AUTOLOADERS,

http://php.net/manual/es/language.oop5.autoload.php

todos los frameworks tienen una incorpacion de los autoloaders
Leí un poco pero me confundió, así que lo dejare para mas adelante
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #7 (permalink)  
Antiguo 18/06/2018, 12:05
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Trabaje en entender un poco mas y logre hacer que mi clase funcione, y ya con una SELECT a la DB

database.php
Código PHP:
Ver original
  1. <?php
  2.     // error_reporting(0);
  3.     require_once(DIR_ROOT.SLASH.'loader.php');
  4.  
  5.     class DBM{
  6.         private $MySQLi;
  7.         // Para llamar al metodo privado conectar()
  8.         public function conexion()
  9.         {
  10.             return self::conectar();
  11.         }
  12.  
  13.         // Metodo provado donde hacemos la conexion a la DB
  14.         private function conectar(){
  15.             $MySQLi = $this->mysqli = new MySQLi (DB_HOST,DB_USER,DB_PASS,DB_DATABASE);
  16.  
  17.             if ($MySQLi->connect_errno){
  18.                 $MySQLi_error = $MySQLi->connect_error;
  19.                 $response = '<b>Error al conectar al Servidor !!!<br>Error '.$MySQLi->connect_errno.':</b> '.$MySQLi_error;
  20.                 echo $response;
  21.             }
  22.             else{
  23.                 $MySQLi->set_charset('utf8');
  24.                 // var_dump($this->mysqli);
  25.                 // $response .= $this->mysqli->host_info . "<br>";
  26.                 // $response .= 'Conectado al Servidor: <b>'.DB_HOST.'</b><br>';
  27.                 // $response .= 'Base de Datos: <b>'.DB_DATABASE.'</b><br>';
  28.  
  29.                 // $response .= ('Conjunto de caracteres de la Base de Datos es: <b>'.$this->mysqli->character_set_name().'</b><br>');
  30.                 // echo $response;
  31.             }
  32.         }
  33.  
  34.         // Metodo publico para desconectarnos
  35.         public function desconectar(){
  36.             $MySQLi = $this->mysqli;
  37.  
  38.             // Si hay una conexion, la cerramos
  39.             if (isset($MySQLi)) {
  40.                 $cerrar = $MySQLi->close();
  41.                 unset($MySQLi);
  42.                 // if ($cerrar) {
  43.                 //     $response = '<hr>Conexion a la Base de Datos Cerrada !!!';
  44.                 //     return $response;
  45.                 // }
  46.                 // else{
  47.                 //     $response = '<hr>La Conexion a la Base de Datos sigue Abierta !!!';
  48.                 //     return $response;
  49.                 // }
  50.             }
  51.             // else{
  52.             //     $response = 'Conexion no esta definida';
  53.             //     return $response;
  54.             // }
  55.         }
  56.  
  57.         // Metodo para hacer Querys
  58.         public function query_function($sql){
  59.             $MySQLi = $this->mysqli;
  60.             if (trim($sql != '')) {
  61.                 $result_set = $MySQLi->query($sql); // Linea 61
  62.             }
  63.             if (!$result_set) {
  64.                 echo '<br>Error en consulta :<pre> ' . $sql .'</pre>';
  65.             }
  66.             return $result_set;
  67.         }
  68.  
  69.         public function get_users(){
  70.             $sql = 'SELECT nombre FROM usuarios';
  71.             $result = $this->query_function($sql);
  72.             $users = $result->fetch_all(MYSQLI_ASSOC);
  73.  
  74.             return $users;
  75.         }
  76.     }
  77.  
  78.     // Instanciamos la clase DBM = DataBaseManager
  79.     $dbm = new DBM();
  80. ?>

Si hago un $users = $dbm->get_users(); me retorna los usuarios.

El problema es que quiero hacer las consultas desde un archivo aparte, osea tener el database.php unico y exclusivo para funciones de la base de datos y el querys.php para las consultas. Entonces hice un nuevo archivo y una clase para hacer el query

querys.php
Código PHP:
Ver original
  1. <?php
  2.     require_once(DIR_ROOT.SLASH.'loader.php');
  3.  
  4.     class Query{
  5.         public function get_users(){
  6.             $sql = 'SELECT nombre FROM usuarios';
  7.             $result = DBM::query_function($sql); // OJO que estoy llamando de un solo al método query_function con instanciacion rápida DBM::
  8.             $users = $result->fetch_all(MYSQLI_ASSOC);
  9.  
  10.             return $users;
  11.         }
  12.     }
  13.     // Instanciamos la clase Query
  14.     $query = new Query();
  15. ?>

Pero hal hacer $users = $query->get_users(); me da error
Cita:
Fatal error: Call to a member function query() on null in \root\class\database.php on line 61
La linea 61 del database.php es la que tiene este código $result_set = $MySQLi->query($sql);

Como puedo hacer para "conectar" las dos clases ?? Ya use extends y nada, instancie en querys.php la clase DBM y nada
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #8 (permalink)  
Antiguo 18/06/2018, 15:14
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Exclamación Respuesta: Dudas con PHP y POO !!!

Cita:
Iniciado por KATHYU Ver Mensaje
Trabaje en entender un poco mas y logre hacer que mi clase funcione, y ya con una SELECT a la DB
que bueno, eso es un gran avanze, poco a poco llegaras comprenderlas

database.php

Cita:
Si hago un $users = $dbm->get_users(); me retorna los usuarios.

El problema es que quiero hacer las consultas desde un archivo aparte, osea tener el database.php unico y exclusivo para funciones de la base de datos y el querys.php para las consultas. Entonces hice un nuevo archivo y una clase para hacer el query

querys.php
.............................{codigo de querys.php}.................
Pero hal hacer $users = $query->get_users(); me da error


La linea 61 del database.php es la que tiene este código $result_set = $MySQLi->query($sql);

Como puedo hacer para "conectar" las dos clases ?? Ya use extends y nada, instancie en querys.php la clase DBM y nada
bueno aca algo importante, recuerda PHP es un lenguate interpretado, entonces cuando haces un clase en un archivo A.php y otra en un archivo B.php y tu archivo de pagina web index.php

si B.php necesita la clase que esta en A.php , en el archivo principal, tienes que hacer
un require de los archivos A.php y B.php,
o de lo contrario en el archivo B.php haga el REQUIRE del archivo A.php asi tu archivo index.php solo necesita hacer un require en B.php
eejej bueno espero no haberte mareado pero en resumen, si creas un clase en un archivo, y quieres llamarlo desde otro archivo hazle un require, y trata de usar RUTAS semi estaticas, al decir semistaticas me refiero a usar la constante __DIR__
  #9 (permalink)  
Antiguo 19/06/2018, 07:45
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Cita:
Iniciado por tuadmin Ver Mensaje
que bueno, eso es un gran avanze, poco a poco llegaras comprenderlas

database.php


bueno aca algo importante, recuerda PHP es un lenguate interpretado, entonces cuando haces un clase en un archivo A.php y otra en un archivo B.php y tu archivo de pagina web index.php

si B.php necesita la clase que esta en A.php , en el archivo principal, tienes que hacer
un require de los archivos A.php y B.php,
o de lo contrario en el archivo B.php haga el REQUIRE del archivo A.php asi tu archivo index.php solo necesita hacer un require en B.php
eejej bueno espero no haberte mareado pero en resumen, si creas un clase en un archivo, y quieres llamarlo desde otro archivo hazle un require, y trata de usar RUTAS semi estaticas, al decir semistaticas me refiero a usar la constante __DIR__
Sabia que debía especificarles eso, pero creí que confiarían mas en mi

Si se fija, los dos archivos llaman a require_once(DIR_ROOT.SLASH.'loader.php'); que es básicamente mi cargador de todo. En loader.php ya tengo cargados todos los archivos que voy creando, y el loader lo mando llamar en index.php asi que ya todo se conecta.

Pasemos a porque da error en la linea 61

PD: Ya hice var_dump($sql); y si me trae la sentencia SQL de la otra clase

--------------------------EDIT----------------------------

Creo que ya encontré el error.

Código PHP:
Ver original
  1. public function queryFunction($sql){
  2.             // $querys = new Querys();
  3.             $MySQLi = $this->mysqli;
  4.             var_dump($MySQLi);
  5.             $sql = trim($sql);
  6.             var_dump($sql);
  7.             $result_set = $MySQLi->query($sql); // Linea
  8.  
  9.             if (!$result_set) {
  10.                 echo '<br>Error en consulta :<pre> ' . $sql .'</pre>';
  11.             }
  12.             return $result_set;
  13.         }

Al hacer var_dump($MySQLi); aparece en NULL eso significa que no esta mandando la conexión. Pero solo pasa esto si enlazo las clases, si lo hago todo en la misma clase, $MySQLi si guarda el array de la conexion. A que se debera que lo pierde al relacionarse con otra clase ??

----------------------EDIT 2.0---------------------------------

Ya lo resolvi

Tenia que inicializar el método de conexión en la función de la clase nueva
Código PHP:
Ver original
  1. public function getUsers(){
  2.             $dbm = new DBM();
  3.             $conexion = $dbm->conexion(); // Esta linea me faltaba
  4.             $sql = 'SELECT nombre FROM usuarios';
  5.             $result = $dbm->queryFunction($sql);
  6.             $users = $result->fetch_all(MYSQLI_ASSOC);
  7.  
  8.             return $users;
  9.         }

Ya vere como hago una función para esos casos
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.

Última edición por KATHYU; 19/06/2018 a las 10:00
  #10 (permalink)  
Antiguo 19/06/2018, 12:00
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Respuesta: Dudas con PHP y POO !!!

Bueno como comentario extra, te recomendaria ver sobre el PATRON SINGLETON, veras algo curioso y que lo mas seguro es lo que necesites
  #11 (permalink)  
Antiguo 19/06/2018, 13:51
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Cita:
Iniciado por tuadmin Ver Mensaje
Bueno como comentario extra, te recomendaria ver sobre el PATRON SINGLETON, veras algo curioso y que lo mas seguro es lo que necesites
Y es de hacerlo en cada clase ?? Segun estos links, parece que es de hacerlo en cada clase, verdad ??

https://www.uno-de-piera.com/el-patr...gleton-en-php/
https://www.imaginanet.com/blog/el-p...n-con-php.html

Otra cosa, solo puedo acceder al metodo desconectar desde mi segunda clase, archivo querys.php mas no de la clase que lo creó (database.php) alguna idea de porque pasa eso ??
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #12 (permalink)  
Antiguo 19/06/2018, 14:45
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 8 meses
Puntos: 120
Respuesta: Dudas con PHP y POO !!!

Cita:
Iniciado por KATHYU Ver Mensaje
Y es de hacerlo en cada clase ?? Segun estos links, parece que es de hacerlo en cada clase, verdad ??

https://www.uno-de-piera.com/el-patr...gleton-en-php/
https://www.imaginanet.com/blog/el-p...n-con-php.html

Otra cosa, solo puedo acceder al metodo desconectar desde mi segunda clase, archivo querys.php mas no de la clase que lo creó (database.php) alguna idea de porque pasa eso ??
Bueno la finalidad de SINGLETON es una CLASE ESTATICA GLOBAL, para evitar hacer por error abrir una conexion que ya existe, pero esto no quiere decir que lo hagas con todas las clases, sino con las que tu crees que son importantes, lo correcto es no abusar de las mismas, ya que de lo contrario seria como usar variables globales

por ejemplo tu clase DATABASE deberia ser global, ya que lo usaras para muchas cosas, y la conexion, y tu clase de QUERYS tambien

bueno la finalidad del POO, es que tambien uses en CONJUNTO con tu IDE de programacion, para la sugerencia de codigo, por ejemplo

digamos que depues de 1 año, retomas un proyecto abandonado usando POO,

quieres mostrar los datos del "usuario logeado" por asi decirlo, digamos que usaste un MAPPEO avanzado en tu base de datos y tus archivos PHP

y todo se gestiona con clases

Código PHP:
<?php
/*.......codigo..........*/
$usuario= new modelos_dbusuarios($id);
printf ("<h1>%s<h1/>",$usuarios->
al momento ahi es donde te sugiere que atributos o metodos tiene tu clase
ya que acabo de 1 año todos nos olvidamos de como fue hecho cada cosa, pero si fue hecha segun alguna estructura retomarlo o modificarlo no costara mucho
Código PHP:
<?php
namespace modelos_db
;
class 
usuarios
{
    public 
$id;
    public 
$password;
    public 
$apellido;
    public 
$nombres;
}
en resumen si gustas te recomiendo el IDE PHPSTORM es muy potente, no es por alentar la pirateria, pero ese programa de paga hay por google la "medicina" :v

Última edición por tuadmin; 19/06/2018 a las 14:47 Razón: su maldito maldito capcha se quedo frizado
  #13 (permalink)  
Antiguo 06/07/2018, 16:32
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 11 años, 5 meses
Puntos: 46
Respuesta: Dudas con PHP y POO !!!

Solo quería comentar que estoy aprendiendo de POO cada dia mas y mas
  1. Desde el día que tuadmin me recomendó sobre SINGLETON, busque y ese mismo día lo implemente
  2. Ya manejo bien los datos de conexiones
  3. Estoy entendiendo bien la lógica de POO
  4. Ya tengo funciones que me facilitan la interacción con la Base de Datos
  5. Básicamente haciendo mi propio Framework para trabajar todo asi.

Para que no se piense que deje esto tirado
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.

Etiquetas: funcion
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 11:14.