Foros del Web » Programando para Internet » PHP »

Problemas MongoDB con PHP

Estas en el tema de Problemas MongoDB con PHP en el foro de PHP en Foros del Web. Saludos a todos! Soy Nuevo en este foro y a la vez soy principiante en utilizar MongoDB (NoSQL) ya q tengo un proyecto sobre esto. ...
  #1 (permalink)  
Antiguo 30/09/2011, 11:25
 
Fecha de Ingreso: septiembre-2011
Ubicación: Peru - Lima
Mensajes: 16
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta Problemas MongoDB con PHP



Saludos a todos! Soy Nuevo en este foro y a la vez soy principiante en utilizar MongoDB (NoSQL) ya q tengo un proyecto sobre esto. Cabe decir q en mi vida universitaria (actualmente) solo eh trabajado con DB's Relacionales.

Entre investigando en estos ultimos dias sobre PHP con MongoDB ya sé como hacer un "insert, delete y select" en la DB no relacional con PHP(ver. 5) (utilizando Netbeans).

Aqui os le pego el codigo que hize(inicialmente) para Testear todo lo que eh investigando:

Código PHP:
$username 'administrador';
            
$userpass 'administrador';
            
$dataBase 'Carrito';

            
$conexion = new Mongo("mongodb://$username:$userpass@localhost/$dataBase");

            
$collection $conexion->selectCollection($dataBase,'Productos');
                                    
            
$nuevoRegistro = array("nombre" => "El Arma Secreta""Precio" => "S/. 65""Cantidad" => "67 unid");
            
$collection->insert($nuevoRegistro);
            
            
$collection->remove(array('nombre' => 'El Arma Secreta'));
            
$collection->remove();
            
            
$cursor $collection->find(array('Precio' => 'S/. 154'));
            
$cursor $collection->find();
            
            foreach (
$cursor as $prod) {
                echo 
"El producto es: ".$prod["nombre"]." El precio es: ".$prod["Precio"]." La cantidad disponible es: ".$prod["Cantidad"]."\n";
            } 
Un Codigo pobre.. como principiante que soy. Aqui probe cada sentencia y me salio OK. Hacia todo en la DB
Ahora mi problema recae Cuando Quiero formalizar mas este codigo. Miren ahora:

Código PHP:
class Persistencia {
    
/* Patron Singleton*/
    
private static $_instancia;
    public static function 
getInstancia() {
        try {
            if(
self::$_instancia == null){
                
self::$_instancia = new Persistencia();
            }
        } catch (
Exception $exc) {
            throw 
$exc->getMessage();
        }
    }
    
/*Fin del Patron */

    
private $_cn;
    private 
$_collection;


    public function 
__construct() {
        try {
            
$username 'administrador';
            
$userpass 'administrador';
            
$database 'Carrito';
            
$colecction 'Productos';
            
            
$this->_cn = new Mongo("mongodb://$username:$userpass@localhost/$database");
            
$this->_collection $this->_cn->selectCollection($database$colecction);

        } catch (
Exception $exc) {
            
error_log($exc->getMessage()."\n"3"../log/Error.log");
        }
    }
    
    private function 
_executeQuery($query$tipo) {
        try{
            switch (
$tipo) {
                case 
:
                    
$cursor $this->_collection->find();
                    return 
$cursor;
                    break;
                case 
:
                    
$this->_collection->insert($query);
                    break;
                case 
:
                    
$this->_collection->remove();
                    break;
            }
        }  catch (
Exception $exc){
            
error_log($exc->getMessage()."\n"3"../log/Error.log");
            
error_log("Query:$query\n"3"../log/Error.log");
        }
    }


    public function 
findAll() {
        
$lista $this->_executeQuery(""1);
        return 
$lista;
    }
    
    public function 
addProduct($nombre$precio$cantidad) {
        
$query = array("nombre" => $nombre"Precio" => $precio"Cantidad" => $cantidad);
        
$this->_executeQuery($query2);
    }
    
    public function 
deleteAll() {
        
$this->_executeQuery(""3);
    }
}

Persistencia::getInstancia(); 
Como se daran cuenta.. solo eh transladado todo el codigo anterior ah hacerlo en una clase.

Ahora.. quiero testear esto a ver si me sale tal y como lo hize en el 1er codigo y comenze con el FIND.

Código PHP:
<?php
require_once '../model/Persistencia.php';

$miInstancia Persistencia::getInstancia();
$lista $miInstancia->findAll();
var_dump($lista);
?>
Y ahora, nose que PASO que me sale "Fatal error: Call to a member function findAll() on a non-object in xampp\htdocs\ConnectMongoDB\test\Testear.php on line 6"
No entiendo...¿Que es lo que paso? Esa es mi duda. Trato de ver documentacion pero no encuentro el error.

Y una cosa mas.... ¿Puedo mejorar este codigo?.. Alguna mejora puedo hacerle?

Gracias!.. Espero con ansias sus respuestas.

  #2 (permalink)  
Antiguo 30/09/2011, 12:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problemas MongoDB con PHP

El problema es que tu Singleton esta mal, ya que no regresa nada, por eso te da ese error, también en el catch tienes esto:
Código PHP:
Ver original
  1. catch (Exception $exc) {
  2.     throw $exc->getMessage();
  3. }

Solamente puedes lanzar clases que sean Excepciones o derivadas de esta, por lo cual si vas a re-lanzar la excepción, entonces no la captures en el Singleton.

Saludos.
  #3 (permalink)  
Antiguo 30/09/2011, 14:13
 
Fecha de Ingreso: septiembre-2011
Ubicación: Peru - Lima
Mensajes: 16
Antigüedad: 12 años, 7 meses
Puntos: 0
Información Respuesta: Problemas MongoDB con PHP

Aahh.. es verdad, no regresaba nada.. Tenia que hacerle:

Código PHP:
return self::$_instancia

Y no entiendo a lo del CATCH.. A q te refieres con eso?

Y alguna recomendacion o algo que deba hacerle para mejorar mi codigo??
  #4 (permalink)  
Antiguo 30/09/2011, 14:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problemas MongoDB con PHP

Lo que estas haciendo en el catch es incorrecto, ya que lanzas el mensaje, y eso es un string y no puedes hacerlo.

Ya te comenté más arriba, si solo vas a cachar la excepción para lanzarla, pues no la caches y deja que fluya, o lanza la excepción:
Código PHP:
Ver original
  1. // mal
  2. catch (Exception $ex) {
  3.      throw $ex->getMessage();
  4. }
  5.  
  6. // bien "a medias"
  7. catch (Exception $ex) {
  8.      throw $ex;
  9. }

Saludos.

Etiquetas: mongodb, registro, sql
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 05:23.