Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] POO PHP y mysqli solo corre en navegador Opera

Estas en el tema de POO PHP y mysqli solo corre en navegador Opera en el foro de PHP en Foros del Web. Me sucede esto: Según yo estaba trabajando bastante bien en POO+mysql probando mis códigos en solo en Opera, pero cuando me da curiosidad por correrlo ...
  #1 (permalink)  
Antiguo 15/08/2013, 10:37
Avatar de j_silk_h  
Fecha de Ingreso: julio-2010
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 6
Pregunta POO PHP y mysqli solo corre en navegador Opera

Me sucede esto:
Según yo estaba trabajando bastante bien en POO+mysql probando mis códigos en solo en Opera, pero cuando me da curiosidad por correrlo en Chrome no me funciona, lo probé en IE10 y me paso lo mismo, Safari igual, firefox no lo tengo así que no se, pero en Opera todo anda de mil maravillas, esto sucede? Digo, el PHP es el mismo no? Se que varia en HTML, CSS y en ciertos casos JavaScript, aquí les dejo una muestra del código como información adicional:

Código PHP:
    public function ejecutar($sql){
        
$this->result $this->conex->query($sql);
    }
    
    public function 
getTotalRegistros(){
        
print_r($this->result->num_rows);
        return(
$this->result->num_rows);//En opera devuelve (1) es correcto pues solo tengo 1 reg en mi DB, pero en chrome y demas devuelve (0)
    
}
    
    public function 
getRegistro($campobd){
        if(
$campobd=="*"){
            return(
$this->result->fetch_array(MYSQLI_ASSOC));
        }else{
            
$array $this->result->fetch_array(MYSQLI_ASSOC);
            return(
$array[$campobd]);
        }
    } 
Esta es la función donde creo mi objeto

Código PHP:
function getUbicacionCliente(){
    
    
$ip $_SERVER["REMOTE_ADDR"];
    
$bd Db::getInstance();
    
$bd->ejecutar("SELECT * FROM maquinas_ubicaciones where ip = '".$ip."' ");

        
$bd->getTotalRegistros();//devuelve 0 en otros navegadores (incorrecto)

    
if($bd->getTotalRegistros()>1){
        echo 
"Direccion IP comprometida";
    }else{
        
//header("Location://".$bd->getRegistro("url")); esto solo funciona en Opera tambien
    
}

Aqui les dejo la clase y todo completo por si necesitan mas información

Código PHP:
<?php
session_start
();
date_default_timezone_set("America/Caracas");

class 
Conf{
    private 
$_user;
    private 
$_password;
    private 
$_host;
    private 
$_database;
    
    static 
$_instance;
    
    private function 
__construct(){
        require(
"config.php");
        
$this->_user=$user;
        
$this->_password=$password;
        
$this->_host=$host;
        
$this->_database=$db;
    }
    
    private function 
__clone(){
    }
    
    public static function 
getInstance(){
        if(!(
self::$_instance instanceof self)){
            
self::$_instance = new self;
        }
        return 
self::$_instance;
    }
    
    public function 
getUserDB(){
        
$var $this->_user;
        return 
$var;
    }
    
    public function 
getHostDB(){
        
$var $this->_host;
        return 
$var;
    }
    
    public function 
getPassDB(){
        
$var $this->_password;
        return 
$var;
    }
    
    public function 
getDB(){
        
$var $this->_database;
        return 
$var;
    }
}

class 
Db{
    private 
$servidor;
    private 
$usuario;
    private 
$password;
    private 
$database;
    private 
$conex;
    private 
$result;
    
    static 
$_instance;
    
    private function 
setConexion(){
        
$conf Conf::getInstance();
        
$this->servidor=$conf->getHostDB();
        
$this->database=$conf->getDB();
        
$this->usuario=$conf->getUserDB();
        
$this->password=$conf->getPassDB();
    }
    
    private function 
__construct(){
        
$this->setConexion();
        
        try{
            
$this->conex = new mysqli($this->servidor$this->usuario$this->password$this->database);
        }catch(
Exception $e){
            echo 
$e->getMessage();
        }
    }
    
    public static function 
getInstance(){
        if(!(
self::$_instance instanceof self)){
            
self::$_instance = new self();
        }
        return 
self::$_instance;
    }
    
    public function 
ejecutar($sql){
        
$this->result $this->conex->query($sql);
    }
    
    public function 
getTotalRegistros(){
        
print_r($this->result->num_rows);
        return(
$this->result->num_rows);
    }
    
    public function 
getRegistro($campobd){
        if(
$campobd=="*"){
            return(
$this->result->fetch_array(MYSQLI_ASSOC));
        }else{
            
$array $this->result->fetch_array(MYSQLI_ASSOC);
            return(
$array[$campobd]);
        }
    }
}

function 
getUbicacionCliente(){
    
    
$ip $_SERVER["REMOTE_ADDR"];
    
$bd Db::getInstance();
    
$bd->ejecutar("SELECT * FROM maquinas_ubicaciones where ip = '".$ip."' ");

    if(
$bd->getTotalRegistros()>1){
        echo 
"Direccion IP comprometida";
    }else{
        
//header("Location://".$bd->getRegistro("url"));
    
}
}

?>
:
__________________
!Si se puede imaginar se puede programar!
  #2 (permalink)  
Antiguo 15/08/2013, 11:05
Avatar de j_silk_h  
Fecha de Ingreso: julio-2010
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 6
Respuesta: POO PHP y mysqli solo corre en navegador Opera

Me creen si les digo que ya se la solución??

es aquí:

Código PHP:
function getUbicacionCliente(){

    
$ip $_SERVER['REMOTE_ADDR'];// <-------------- aqui devuelve ::1
    
    
$bd Db::getInstance();
    
$bd->ejecutar("SELECT * FROM maquinas_ubicaciones where ip = '".$ip."' ");

    echo 
" - ".$bd->getTotalRegistros();

    if(
$bd->getTotalRegistros()>1){
        echo 
"Direccion IP comprometida";
    }else{
        
header("Location://".$bd->getRegistro("url"));
    }

Esto


$ip = $_SERVER['REMOTE_ADDR'];
me devuelve ::1 y en mi BD no hay registro para esa direccion IP, pense que habia un error, pero no, resulta que "::1" es la IPv6 de 127.0.0.1
Como establezco por defecto un patrón de dirección IPv4 por defecto?
__________________
!Si se puede imaginar se puede programar!
  #3 (permalink)  
Antiguo 15/08/2013, 11:10
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: POO PHP y mysqli solo corre en navegador Opera

Hola ten en cuenta de que varias de las variables $_SERVER son dadas por el navegador, por eso hay que tener en cuenta de que esos valores pueden ser volubles y cambiantes y dependientes del navegador que uses

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #4 (permalink)  
Antiguo 15/08/2013, 11:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: POO PHP y mysqli solo corre en navegador Opera

Incorrecto, las variables $_SERVER las entrega el servidor, no el navegador, algunas sí tienen cosas como el user agent, pero es porque el servidor las hace disponibles para tu script PHP.

El que te de ::1 es porque así esta configurado tu servidor web, tienes que verificar que use solamente IPv4.

Saludos.
  #5 (permalink)  
Antiguo 15/08/2013, 13:33
Avatar de j_silk_h  
Fecha de Ingreso: julio-2010
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 6
Pregunta Respuesta: POO PHP y mysqli solo corre en navegador Opera

De ser asi, por que:

Código PHP:
$ip=$_SERVER['REMOTE_ADDR'];
echo 
$ip
Me devuelve en:
Opera. 127.0.0.1
Chrome y otros. ::1


Estoy en la misma pc usando wampserver 2.2
__________________
!Si se puede imaginar se puede programar!
  #6 (permalink)  
Antiguo 15/08/2013, 13:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: POO PHP y mysqli solo corre en navegador Opera

Al parecer es porque Chrome y Firefox se conectan en modo IPv6 al servidor cuando esta activado, Opera e IE (depende de la versión) no lo hacen, si no que siempre lo hacen a modo IPv4 a menos que lo actives (en Opera se puede activar).

Lo que te recomiendo es que si vas a estar usando IPv6, que uses inet_pton para transformar la IP y almacenarla correctamente (necesitas activar también el soporte IPv6 en PHP).

Saludos.
  #7 (permalink)  
Antiguo 15/08/2013, 14:24
Avatar de j_silk_h  
Fecha de Ingreso: julio-2010
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 6
Respuesta: POO PHP y mysqli solo corre en navegador Opera

Perfecto, me gusto la idea de trabajar con la IPv6, puesto que el wampserver ya viene con el activado, y ahora en ligar de acceder como: localhost/miproyecto accedo en cualquier avegador usando http://[::1]/miproyecto, una ultima pregunta, pienso guardar en mi BD un registro de actividades de las maquinas que acceden a el, como la direccion IP, si en mi red (trabajada con IPv6) crees que es recomendable que me guarde dicha dirección usando inet_pton() ?
__________________
!Si se puede imaginar se puede programar!
  #8 (permalink)  
Antiguo 15/08/2013, 14:27
Avatar de balerocms  
Fecha de Ingreso: agosto-2013
Ubicación: MX
Mensajes: 4
Antigüedad: 10 años, 8 meses
Puntos: 1
Respuesta: POO PHP y mysqli solo corre en navegador Opera

No te compliques, simplemente utiliza try...catch.

<?php

try {
$ip = $_SERVER['REMOTE_ADDR'];
if($ip != "127.0.0.1") { throw new Exception(); } // ip vacia
echo $ip;
} catch (Exception $e) {
// no obtienes la ip, entonces forzamos.
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
echo $ip;
// aun no imprime la ip? mas acciones aqui.
}
  #9 (permalink)  
Antiguo 15/08/2013, 14:36
Avatar de j_silk_h  
Fecha de Ingreso: julio-2010
Mensajes: 54
Antigüedad: 13 años, 9 meses
Puntos: 6
De acuerdo Respuesta: POO PHP y mysqli solo corre en navegador Opera

Cita:
Iniciado por balerocms Ver Mensaje
No te compliques, simplemente utiliza try...catch.

<?php

try {
$ip = $_SERVER['REMOTE_ADDR'];
if($ip != "127.0.0.1") { throw new Exception(); } // ip vacia
echo $ip;
} catch (Exception $e) {
// no obtienes la ip, entonces forzamos.
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
echo $ip;
// aun no imprime la ip? mas acciones aqui.
}
Es útil, pero no muy funcional para lo que quiero, pues me hablas de una sola IP y yo pretendo usar varias maquinas, dichas direcciones IP van a estar guardadas en mi BD para que el sistema me dirija al cliente al modulo de la aplicación que pertenece.

Imagina esto: Tengo una aplicación en una empresa, tiene 3 oficinas (compra, venta, RRHH) cuando ellos accedan a la aplicacion esta consulta en el servidor y verifica su IP en la BD, entonces dirá, 192.168.1.1 vas a RRHH, 192.168.1.2 vas a compras, y asi sucesivamente, y las redirige al modulo haciendo uso de header (PHP)

Creo que me quedare con la IPv6 por ahora, quizás tenga un problema a la hora de implantar si la red esta en IPv4 pero si agrego las direcciones a la BD no se si solucione, igual se que tengo una comunidad con quien contar

Gracias mis amigos
__________________
!Si se puede imaginar se puede programar!

Etiquetas: mysqli, poo
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 13:43.