Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Implementar patron singleton

Estas en el tema de Implementar patron singleton en el foro de PHP en Foros del Web. Bueno el caso es que realize un script Singleton.php, para conexion a la base de datos, pero ahora me piden implementarlo en un sistema que ...
  #1 (permalink)  
Antiguo 24/02/2014, 11:26
Avatar de giuli956  
Fecha de Ingreso: noviembre-2012
Mensajes: 149
Antigüedad: 11 años, 5 meses
Puntos: 1
Implementar patron singleton

Bueno el caso es que realize un script Singleton.php, para conexion a la base de datos, pero ahora me piden implementarlo en un sistema que habiamos hecho previamente, en dicho sistema tenia un script de conexion:

Código PHP:
Ver original
  1. <?php
  2.     function conectarDB(){
  3.         $conexion=mysql_connect("localhost","root","");
  4.         if (!$conexion){
  5.             die('Error al conectarse a mysql: ' . mysql_error());  
  6.         }else{
  7.             return $conexion;
  8.         }
  9.     }
  10.     function desconectarDB(){
  11.         mysql_close($conexion);        
  12.     }
  13.  
  14. ?>

Y solo hacia

Código PHP:
Ver original
  1. $con= conectarDB()

Pero quiero saber como utilizar es te archivo:

Código PHP:
Ver original
  1. <?php
  2.  
  3. class conectarDB{
  4.     static private $instancia=NULL;
  5.     private $servidor="localhost";
  6.     private $user="root";
  7.     private $pass="";
  8.     private $bd="sgu";
  9.     private $link;
  10.     private $stmt;
  11.     private $array;
  12.    
  13.     static $_instance;
  14.    
  15.     private function __construct(){
  16.         $this->conectar();
  17.     }
  18.     public static function getInstance(){
  19.       if (!(self::$_instance instanceof self)){
  20.          self::$_instance=new self();
  21.       }
  22.       return self::$_instance;
  23.    }
  24.    private function conectar(){
  25.       $this->link=mysql_connect($this->servidor, $this->user, $this->pass);
  26.       mysql_select_db($this->bd,$this->link);
  27. }
  28.     public function ejecutar($sql){
  29.       $this->stmt=mysql_query($sql,$this->link);
  30.       return $this->stmt;
  31.    }
  32.  
  33.    public function obtener_fila($stmt,$fila){
  34.       if ($fila==0){
  35.          $this->array=mysql_fetch_array($stmt);
  36.       }else{
  37.          mysql_data_seek($stmt,$fila);
  38.          $this->array=mysql_fetch_array($stmt);
  39.       }
  40.       return $this->array;
  41.    }
  42.  
  43.  
  44.    public function lastID(){
  45.       return mysql_insert_id($this->link);
  46.    }
  47. }
  48. ?>

por ejemplo en este archivo:

Código PHP:
Ver original
  1. <?php
  2. include("../php/modelo/Singleton.php");
  3. $con=conectarDB::getInstance();
  4.      function get_user_porid ($id){
  5.     if(isset($id)){
  6.         $sql="select *
  7.        from personas, usuarios
  8.        where
  9.        personas.idpersona=$id
  10.        ";  
  11.        
  12.         mysql_select_db("sgp",$con);
  13.         $resultado=mysql_query($sql,$con) or die('Mi error es: '.mysql_error());
  14.         $registro=mysql_fetch_object($resultado);
  15.      
  16.         return $registro;
  17. }
  18. }
  19. if ($_GET['id']!=''){
  20. $persona= get_user_porid($_GET['id']);
  21.  
  22. }
  23.  
  24.  
  25.  
  26.  
  27.    
  28. ?>
  29. <html>
  30.     <head>
  31.         <meta charset="UTF-8"/>
  32.         <title>Modificar usuario seleccionado</title>
  33.     </head>
  34.     <body>
  35.         <p align="center"><?php include("../php/header.php"); ?></p>
  36.         <form action="includes/modificoPersona.php" method="post" name="form">
  37.         <input type="hidden" name="id" value="<?php echo $persona->idpersona ?>" />
  38.             <table align="center" width="50%">
  39.             <tr>
  40.             <td>
  41.                 <fieldset>
  42.                     <legend>Relaize los cambios</legend>
  43.                     <table width="50%" cellpadding="5" border="0">
  44.                        
  45.                         <tr>                
  46.                             <td><p>Tipo de documento</p></td>
  47.                             <td><input type="text" name="tipo_documento" value="<?php echo $persona->idTipoDocumento?>"/></td>
  48.                         </tr>
  49.                         <tr>
  50.                             <td><p>Numero</p></td>
  51.                             <td><input type="text" name="numero" value="<?php echo $persona->numeroDocumento?>"/></td>
  52.                         </tr>
  53.                         <tr>
  54.                             <td><p>Apellido</p></td>
  55.                             <td><input type="text" name="apellido" value="<?php echo $persona->apellido?>"/></td>
  56.                         </tr>
  57.                         <tr>                            
  58.                             <td><p>Nombres</p></td>
  59.                             <td><input type="text" name="nombres" value="<?php echo $persona->nombres?>"/></td>
  60.                         </tr>                            
  61.                             <td><p>Fecha de nacimiento</p></td>
  62.                             <td><input type="text" name="fechanac" value="<?php echo $persona->fechaNacimiento?>"/></td>
  63.                         <tr>
  64.                             <td><p>Sexo</p></td>
  65.                             <td><input type="text" name="sexo" value="<?php echo $persona->sexo?>"/></td>
  66.                         </tr>
  67.                         <tr>    
  68.                             <td><p>Celular</p></td>
  69.                             <td><input type="text" name="Cel" value="<?php echo $persona->telefonoMovil?>"/></td>
  70.                         </tr>
  71.                         <tr>
  72.                             <td><p>Telefono</p></td>
  73.                             <td><input type="text" name="Tel" value="<?php echo $persona->telefono?>"/></td>
  74.                         </tr>
  75.                         <tr>
  76.                             <td><p>email</p></td>
  77.                             <td><input type="text" name="email" value="<?php echo $persona->email?>"/></td>
  78.                         </tr>
  79.                         <tr>
  80.                             <td><p>Domicilio</p></td>
  81.                             <td><input type="text" name="dom" value="<?php echo $persona->domicilio?>"/></td>
  82.                         </tr>
  83.                         <tr>
  84.                             <td><p>Provincia</p></td>
  85.                             <td><input type="text" name="prov" value="<?php echo $persona->provincia?>"/></td>
  86.                         </tr>
  87.                         <tr>
  88.                             <td><p>Localidad</p></td>
  89.                             <td><input type="text" name="loc" value="<?php echo $persona->localidad?>"/></td>
  90.                         </tr>
  91.                         <tr>
  92.                             <td><p>Pais</p></td>
  93.                             <td><input type="text" name="pais" value="<?php echo $persona->pais?>"/></td>
  94.                         </tr>
  95.                    </table>
  96.                 </fieldset>
  97.                      <fieldset>
  98.                     <legend>Datos de usuario</legend>
  99.                     <table width="50%" cellpadding="5" border="0">
  100.                         <tr>
  101.                             <td><p>User</p></td>
  102.                             <td><input type="text" name="user" value="<?php echo $persona->username?>"/></td>
  103.                         </tr>
  104.                         <tr>
  105.                             <td><p>Pass</p></td>
  106.                             <td><input type="text" name="pass" value="<?php echo $persona->password?>"/></td>
  107.                         </tr>
  108.                         <tr>
  109.                             <td><p>Tipo de Usuario</p></td>
  110.                             <td><input type="text" name="tipouser" value="<?php echo $persona->idTipoUsuario?>"/></td>
  111.                         </tr>
  112.                        
  113.                         <tr>
  114.                             <td><input type="submit" name="bt_enviar" value="Listo"/></td>
  115.                         </tr>
  116.                    </table>
  117.  
  118.                     </fieldset>
  119.              
  120.                     </td>
  121.                     </tr>
  122.                 </table>
  123.        
  124.         </form>
  125.     </body>
  126.    
  127. </html>

Lo que hice fue:

Código PHP:
Ver original
  1. include("../php/modelo/Singleton.php");
  2. $con=new conectarDB();
  3. $con->getInstance();

Obtengo el siguiente error:

Fatal error: Call to private conectarDB::__construct() from invalid context
Probe hacer publica el metodo constructor, pero igual da otros errores, no sera que tengo que pasar toda la aplicacion a objetos?
  #2 (permalink)  
Antiguo 24/02/2014, 12:03
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 9 meses
Puntos: 88
Respuesta: Implementar patron singleton

no puedes llamar al constructor directamente porque es privado, lo que debes de hacer es llamar al método estatico que es el que se encarga de devolver la misma instancia en caso de que ya exista una conección, de lo contrario te creará una
Código PHP:
Ver original
  1. include("../php/modelo/Singleton.php");
  2.     $instCon=conectarDB::getInstance();
en todo caso agrega un metodo público que te devuelva el link de conección
Código PHP:
Ver original
  1. public function getLink()
  2. {
  3.    return $this->link;
  4. }
y lo que tendrías que hacer a continuación es
Código PHP:
Ver original
  1. include("../php/modelo/Singleton.php");
  2.     $instCon=conectarDB::getInstance();
  3.     $con = $instCon->getLink()
esto sería un modo de salir del problema pero no es lo optimo, lo ideal, es que, si ya tienes tu objeto de conección, pues, usala, así en lugar de usar el mysql_query usa el método ejecutar.

saludos.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #3 (permalink)  
Antiguo 25/02/2014, 02:24
Avatar de giuli956  
Fecha de Ingreso: noviembre-2012
Mensajes: 149
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Implementar patron singleton

Bueno eits gracias por responder, probé hacer como me indicaste, lo de la conexion parece estar resuelto, por lo menos no da problemas.

Probe hacer luego:

Código PHP:
Ver original
  1. $resultado=conectarDB::ejecutar($sql);

para ejecutar la consulta, pero me dice:

Fatal error: Using $this when not in object context in H:\xampp\htdocs\sgu2\includes\php\modelo\Singleton .php on line 29

Es como que no esta creando un objeto conectarDB. Lo que observo es que la variable $sql no esta declarada en Singleton.php.

No se si puedes ayudarme te agradezco.
  #4 (permalink)  
Antiguo 27/02/2014, 18:00
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 9 meses
Puntos: 88
Respuesta: Implementar patron singleton

con el código que te dejé anteriormente erá todo lo que necesitabas, ahora bien, si quieres usar el método ejecutar deberás hacerlo de la siguiente manera
Código PHP:
Ver original
  1. include("../php/modelo/Singleton.php");
  2. $con=new conectarDB();
  3. $con->getInstance();
  4. $resultado=$con->ejecutar($sql);
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #5 (permalink)  
Antiguo 27/02/2014, 18:45
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Implementar patron singleton

Hay cosas que no entiendo:

Programar una clase (eso está bien), pero... para:

1- Conectar a base de datos usando una librería obsoleta y que desaparecerá en PHP 5.5: http://www.forosdelweb.com/f18/anunc...oleta-1008145/

2- Hacer un spaghetti en el resto del código, mezclando php y HTML

Te sugiero buscar info sobre los siguientes temas:
- Programación orientada a objetos y patrones de diseño
- Patrón de diseño MVC

Si no te sientes cómodo con lo anterior, también podrías buscar sistemas de plantillas para facilitarte tanto el desarrollo de tu proyecto como cambios de diseño (html, css, etc.)
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 28/02/2014, 05:15
Avatar de giuli956  
Fecha de Ingreso: noviembre-2012
Mensajes: 149
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Implementar patron singleton

Muchas gracias a los dos!! Y gracias @Triby por tus sugerencias..cualquier otra duda hago un nuevo tema.

Etiquetas: fecha, html, implementar, mysql, patron, registro, select, singleton, sql, usuarios
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 14:55.