Foros del Web » Programando para Internet » PHP »

PHP OO [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Estas en el tema de [APORTE]toma los datos del visitante (ip navegador lenguaje so ) en el foro de PHP en Foros del Web. Bueno les dejo una clase en la que aún estoy trabajando ( para ampliara ) es parte de un proyecto en el que trabajo, la ...
  #1 (permalink)  
Antiguo 13/10/2010, 18:41
Avatar de mcun  
Fecha de Ingreso: octubre-2010
Ubicación: tras la pantalla
Mensajes: 466
Antigüedad: 13 años, 6 meses
Puntos: 55
Mensaje [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Bueno les dejo una clase en la que aún estoy trabajando ( para ampliara ) es parte de un proyecto en el que trabajo, la comparto pues de esta web he aprendido mucho y es mi forma de decirles gracias y porque creo en el software libre



Código PHP:
Ver original
  1. <?php
  2. /*
  3.  *
  4.  *
  5.  *      Copyright 2010 Mauricio Rodriguez <[email protected]>
  6.  *
  7.  *      This program is free software; you can redistribute it and/or modify
  8.  *      it under the terms of the GNU General Public License as published by
  9.  *      the Free Software Foundation; either version 2 of the License, or
  10.  *      (at your option) any later version.
  11.  *
  12.  *      This program is distributed in the hope that it will be useful,
  13.  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *      GNU General Public License for more details.
  16.  *
  17.  *      You should have received a copy of the GNU General Public License
  18.  *      along with this program; if not, write to the Free Software
  19.  *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  20.  *      MA 02110-1301, USA.
  21.  */
  22.  
  23. class Get_data_vistor{
  24.     // atributos
  25.     private $frowarded_for;
  26.     private $http_via;
  27.     private $remote_addr;
  28.     private $lang=array();
  29.     private $so=array();
  30.     private $browser=array();
  31.     private $user_agent_conv_lang;
  32.     private $user_agent_conv_so;
  33.     private $user_agent_conv_browser;
  34.     function  __construct() {
  35.         // tomo la ip filtrando proxie
  36.         $this->frowarded_for=isset($_SERVER['HTTP_X_FORWARDED_FOR']);
  37.         $this->http_via=(isset($_SERVER['HTTP_VIA']));
  38.         $this->remote_addr=(isset($_SERVER['REMOTE_ADDR']));
  39.         // constructores de lenguage
  40.         $this->lang[0]="es";
  41.         $this->lang[1]="en";
  42.         $this->lang[2]="fr";
  43.         // constructores de so
  44.         $this->so[0]="linux";
  45.         $this->so[1]="windows";
  46.         // constructores de browser
  47.         $this->browser[0]="mozilla";
  48.         $this->browser[1]="explorer";
  49.         $this->browser[2]="chrome";
  50.         // convierto a minúsculas
  51.         $this->user_agent_conv_lang=strtolower($_SERVER[HTTP_ACCEPT_LANGUAGE]);
  52.         $this->user_agent_conv_so=strtolower($_SERVER[HTTP_USER_AGENT]);
  53.         $this->user_agent_conv_browser=strtolower($_SERVER[HTTP_USER_AGENT]);
  54.         }
  55.             // metodos
  56.     public  function get_ip_v(){
  57.         if ($this->frowarded_for) {
  58.             $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  59.         }elseif ($this->http_via)  {
  60.             $ip = $_SERVER['HTTP_VIA'];
  61.         }elseif ($this->remote_addr) {
  62.             $ip = $_SERVER['REMOTE_ADDR'];
  63.         }
  64.         echo $ip;
  65.         return $ip;
  66.     }// End function get_ip()
  67.         public function get_lang_v(){
  68.             if (@strpos($this->user_agent_conv_lang, $this->lang[0]) !== false){
  69.                 $lang= "Espa&ntilde;ol";
  70.             }
  71.             if (@strpos($this->user_agent_conv_lang, $this->lang[1]) !== false){
  72.                 $lang= "Ingles";
  73.             }
  74.             echo $lang;
  75.             return $lang;
  76.         }
  77.         public function get_so_v(){
  78.             if (@strpos($this->user_agent_conv_so, $this->so[0]) !== false){
  79.                 $so= "linux";
  80.             }
  81.             if (@strpos($this->user_agent_conv_so, $this->so[1]) !== false){
  82.                 $so= "windows";
  83.             }
  84.             echo $so;
  85.             return $so;
  86.         }// end functionget_so_v
  87.         public function get_browsrer_v(){
  88.         // verifico que se encuentre el nombre del explorador en la
  89.         // variable con strpos
  90.         if(strpos($this->user_agent_conv_browser, $this->browser[0]) !==false){
  91.             $browser="mozilla";
  92.         }
  93.         if(strpos($this->user_agent_conv_browser, $this->browser[1]) !==false){
  94.             $browser="explorer";
  95.         }
  96.  
  97.         if(strpos($this->user_agent_conv_browser, $this->browser[2]) !==false){
  98.             $browser="chrome";
  99.         }
  100.         if(strpos($this->user_agent_conv_browser,"opera") !==false){
  101.             $browser="opera";
  102.         }
  103.         if(strpos($this->user_agent_conv_browser,"mirodi") !==false){
  104.             $browser="mirodi";
  105.         }
  106.         echo $browser;
  107.         return $browser;
  108.     } // end function get_browser_v
  109.     public function up_mail_data_v(){
  110.         $ip=  $this->get_ip_v();
  111.         $so=  $this->get_so_v();
  112.         $lang=  $this->get_lang_v();
  113.         $browser=  $this->get_browsrer_v();
  114.         // Varios destinatarios
  115.         $para  = '[email protected]';
  116.         // subject
  117.         $titulo = 'data visitor';
  118.         // message
  119.         $mensaje = '
  120.        <html>
  121.            <head>
  122.                <title>datos del visitante</title>
  123.            </head>
  124.            <body>
  125.                <p>¡Estos son los datos tomados del visitante</p>
  126.                <table>
  127.                    <tr>
  128.                       <th>SO</th><th>Navegador</th><th>IP</th><th>lenguage</th>
  129.                    </tr>
  130.                    <tr>
  131.                       <td>'.$so.'</td><td>'.$browser.'</td><td>'.$ip.'</td><td>'.$lang.'</td>
  132.                    </tr>
  133.                    <tr>
  134.                    </tr>
  135.                </table>
  136.             </body>
  137.        </html>';
  138.         // Almaceno el la BBDD los datos
  139.         $date = date("Y-m-d");
  140.         $server='xxx';
  141.         $username='xxx';
  142.         $password='xxx';
  143.         $db='data';
  144.         $con=mysql_connect($server, $username, $password);
  145.         mysql_select_db($db, $con);
  146.         $sql="INSERT INTO visitante ";
  147.         $sql .="(id,ip,so,lang,browser,date)";
  148.         $sql .="VALUES ('NULL','$ip','$so','$lang','$browser','$date ')";
  149.         $res = mysql_query($sql,$con);
  150.     if (!$res) {
  151.         die("ATENCION!!! No fue posible insertar datos:<br />".mysql_error());
  152.     }
  153.         // Envio el mail co el reporte del visitante
  154.         // Para enviar un correo HTML mail, la cabecera Content-type debe fijarse
  155.         $cabeceras  = 'MIME-Version: 1.0' . "\r\n";
  156.         $cabeceras .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
  157.         // Cabeceras adicionales opcionales comentadas
  158.         //$cabeceras .= 'To: xxxx <[email protected]>, xxxx <[email protected]>' . "\r\n";
  159.         $cabeceras .= 'From: Recordatorio <[email protected]>' . "\r\n";
  160.         //$cabeceras .= 'Cc: [email protected]' . "\r\n";
  161.         mail($para, $titulo, $mensaje, $cabeceras);
  162.         }
  163.     function  __destruct() {
  164.         unset ($browser ,$lang, $so ,$ip);
  165.     }
  166.  
  167. }// end calss get_data_visitor
  168. echo 'class get_data_visitor <br />';
  169. $t=new Get_data_vistor();
  170. $t->get_lang_v();
  171. echo '<br />';
  172. $t->get_so_v();
  173. echo '<br />';
  174. $t->get_browsrer_v();
  175. echo '<br />';
  176. $t->get_ip_v();
  177. $t->up_mail_data_v();
  178. ?>
  #2 (permalink)  
Antiguo 13/10/2010, 19:41
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Comentarios:
- En realidad tu clase no hace más que encerrar un algoritmo que ahora necesitas .. necesitas abstraer más tu objeto.

- Tu clase debe estar bien definida, debe hacer una cosa. ¿Se supone trae información del visitante?, pues hasta ahí; el envío por correo está un tanto fuera de la función de esta clase. A eso me refiero con que ahora solo encierras un algoritmo que ahora necesitas.

- Tu destructor está eliminado variables locales a ese método, variables que no existen. Vaya, que no está haciendo nada ... ojo.

- Si la función es para obtener datos, hasta ahí. Piensa en la reutilización de código; cosas como estas no es recomendable:
Código PHP:
Ver original
  1. echo $ip;
  2.         return $ip;

- Evita silenciar errores directamente en las sentencias, osea, evita utilizar el operador @. Para quien intente utilizar tu código, esa práctica complicaría el debuggueo (...).

- Y, lo malo, estás presuponiendo cosas, como que solo existen 2 lenguajes, 2 sistemas operativos y 5 exploradores, cosa más alejada de la realidad. Piensa genérico.

- Cuidado con tu sintaxis. Procura seguir un estándar conocido, PEAR, Zend (¿recomendado?), eZ, Horde ... pero deberías adaptarte a uno.

Solo comentarios para mejorar tu código. Mis 2 centavos
__________________
I ♥ The Music!
  #3 (permalink)  
Antiguo 13/10/2010, 21:15
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: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Aparte de lo que dice Maturano PHP dispone de una función get_browser la cual te puede ayudar y dar muchos más datos que los que te da tu clase.

Saludos.
  #4 (permalink)  
Antiguo 14/10/2010, 11:21
Avatar de mcun  
Fecha de Ingreso: octubre-2010
Ubicación: tras la pantalla
Mensajes: 466
Antigüedad: 13 años, 6 meses
Puntos: 55
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

muchas gracias por los aportes .. tomo notas de ellos...

lo de la redundancia echo return es solo para mi prueba se me paso....

lo del mail si definitivamente debería llamar a un clase para ello o hacerlo de forma inversa mmm tal vez heredar de esta clase desde una case mail.......


que doy por echo que existen x sistemas operativos y x navegadores .... te refieres a que no los liste todos o que debería tratarlos de modo mas abstracto si es lo ultimo no ve como.....pensar en ello y también en lo de la sintaxis y destructor ( no entiendo por que no destruye nada)

gracias nuevamente maturano

GatorV gracias por el link lo chequeo... supongo que esta lleno de cosas que ya existen que uno intenta hacer todo el tiempo en fin gracias a ambos muy valiosas las criticas

Última edición por mcun; 14/10/2010 a las 12:24
  #5 (permalink)  
Antiguo 14/10/2010, 13:21
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: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

El destructor no destruye nada porque estas borrando variables que no estan en el alcance del destructor:
Código PHP:
Ver original
  1. public function __destruct()
  2. {
  3.       unset($browser);
  4. }

Ahí $browser nunca existio, quiza te refieras a $this->browser...

Saludos.
  #6 (permalink)  
Antiguo 14/10/2010, 13:27
Avatar de mcun  
Fecha de Ingreso: octubre-2010
Ubicación: tras la pantalla
Mensajes: 466
Antigüedad: 13 años, 6 meses
Puntos: 55
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Cita:
Iniciado por GatorV Ver Mensaje

Ahí $browser nunca existio, quiza te refieras a $this->browser...

Saludos.
si esa era mi intención para no repetir los destructores gracias nuevamente....

PD: ya estoy con la tarea
  #7 (permalink)  
Antiguo 14/10/2010, 13:29
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Cita:
Iniciado por mcun Ver Mensaje
lo de la redundancia echo return es solo para mi prueba se me paso....
Cuidado con ello, igual busca mejores maneras de hacer pruebas ... tan simple como el hecho de imprimir el valor retornado, que es lo que te interesa saber; total, es exactamente el mismo valor.

Cita:
Iniciado por mcun Ver Mensaje
lo del mail si definitivamente debería llamar a un clase para ello o hacerlo de forma inversa mmm tal vez heredar de esta clase desde una case mail.......
¿Herencia?; ERROR.

La programación orientada a objetos no es solo la utilización de clases. No pienses en tu código, en tu algoritmo, en una clase para lograr tu objetivo como ahora lo haces. Tienes que leer los conceptos, básico ...

Cita:
Iniciado por mcun Ver Mensaje
que doy por echo que existen x sistemas operativos y x navegadores .... te refieres a que no los liste todos o que debería tratarlos de modo mas abstracto
Código como este:
Código PHP:
Ver original
  1. public function get_so_v(){
  2.             if (@strpos($this->user_agent_conv_so, $this->so[0]) !== false){
  3.                 $so= "linux";
  4.             }
  5.             if (@strpos($this->user_agent_conv_so, $this->so[1]) !== false){
  6.                 $so= "windows";
  7.             }
  8.             echo $so;
  9.             return $so;
  10.         }// end functionget_so_v
Tema aparte de tu metodología (que igual habría que comentar), lo único que haces es comparar si un valor obtenido para el SO es "linux" o "windows". Viéndolo como código, en el caso que ninguna de las condiciones se cumpla tienes una variable no definida --error--, viéndolo como función de una clase, ese método no cumple su función de decirme qué SO se está utilizando, solo me dice si es Windows o Linux; ¿es esta tu intención?, entonces no crees que sería mejor crear métodos isWindows() e isLinux() que te retornen un booleano?.

Y no es solo caso de añadir "Mac" a tu lista, menos ahora con tanto "gadget" que sale a cada rato; Android --y variantes--, Moblin, Symbian, Palm OS, iPhone OS, Darwin, BSD, etc., etc., etc. ... no vas a enlistar todos los SOs, ¿o sí?


Cita:
Iniciado por mcun Ver Mensaje
y destructor ( no entiendo por que no destruye nada)
De nuevo: tu destructor está eliminando variables locales a ese método, variables que no están definidas, por ende, no está haciendo nada. Sigue tu propia metodología e imprime esas variables antes de eliminarlas ...

Además, si se destruye un objeto se va con todo y sus propiedades. Si tu intención es limpiar las propiedades del objeto --que así se entiende--, no tiene ningún caso. De nuevo, conceptos ...


Mi sugerencia:
Ve la función que te dejó GatorV, extrae toda la información que puedas o necesites, todo dentro del constructor y seteando a variables privadas por cada dato, luego entonces, solo necesitas getters para los valores que vayas a necesitas o métodos propios que puedan corresponder a tu objeto, como quizá un esLinux() como mencioné, quizá un esDispositivoMovil() que quizá podría interesar a quien utilize tu clase ... etc. etc. etc.


Saludos
__________________
I ♥ The Music!
  #8 (permalink)  
Antiguo 14/10/2010, 13:33
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

Cita:
Iniciado por GatorV Ver Mensaje
El destructor no destruye nada porque estas borrando variables que no estan en el alcance del destructor:
Código PHP:
Ver original
  1. public function __destruct()
  2. {
  3.       unset($browser);
  4. }

Ahí $browser nunca existio, quiza te refieras a $this->browser...

Saludos.
A eso me refería por una parte, la del código, pero igual no tiene sentido esa acción, pues si se destruye el objeto, se va con todo y sus propiedades, ¿qué no?.

Aunque se corrija el código, el destructor seguiría sin hacer mucho --ya no nada --.
__________________
I ♥ The Music!
  #9 (permalink)  
Antiguo 14/10/2010, 13:49
Avatar de mcun  
Fecha de Ingreso: octubre-2010
Ubicación: tras la pantalla
Mensajes: 466
Antigüedad: 13 años, 6 meses
Puntos: 55
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

maturano tus criticas son muy esclarecedoras gracias, acabo de encontrar un articulo gracias a tu critica sobre mi metodología de trabajo que me represento un buen ejemplo de como debería se la opp yo sin darme cuenta sigo programado de modo procedimental aunque usando "php5" .

bien voy a re-formular mi metodológica.

voy a programar una sola cosa pero que lo haga bien ( donde escuche eso....) y usando un MVC

saludos

edito........

no pude poner el link en bbcode

http://arleytriana.blogspot.com/2009/07/implementacion-del-patron-clasico-de.html
  #10 (permalink)  
Antiguo 14/10/2010, 14:21
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

... el artículo se refiere a un patrón de diseño, es independiente del paradigma de programación utilizado. De hecho, dicho artículo no utiliza objetos, sino programación estructurada (y que me parece medio mareador ... pero será cuestión de gustos).

Solo la observación, que la lectura no te hará daño y tiene algo de lo que mencioné aquí: separación clara de funciones, sin embargo a lo que me refería era a la POO, no a patrones.

Saludos
__________________
I ♥ The Music!
  #11 (permalink)  
Antiguo 14/10/2010, 14:32
Avatar de mcun  
Fecha de Ingreso: octubre-2010
Ubicación: tras la pantalla
Mensajes: 466
Antigüedad: 13 años, 6 meses
Puntos: 55
Respuesta: [APORTE]toma los datos del visitante (ip navegador lenguaje so )

si le falta POO el autor lo menciona pero el patrón me parecio simple... luego me queda pensarlo desde POO
  #12 (permalink)  
Antiguo 18/10/2010, 09:28
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
Tema movido desde PHP orientado a objetos a PHP

Etiquetas: ip, lenguaje, visitante, navegadores
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 11:00.