Foros del Web » Programando para Internet » PHP »

Guardar dirección ip en BD

Estas en el tema de Guardar dirección ip en BD en el foro de PHP en Foros del Web. Hola! Estoy haciendo un cuestionario y necesito que cada persona que lo contestara guardara su dirección ip en la base de datos. Este procedimiento lo ...
  #1 (permalink)  
Antiguo 07/08/2007, 18:46
 
Fecha de Ingreso: febrero-2007
Ubicación: México
Mensajes: 44
Antigüedad: 17 años, 2 meses
Puntos: 0
Pregunta Guardar dirección ip en BD

Hola!

Estoy haciendo un cuestionario y necesito que cada persona que lo contestara guardara su dirección ip en la base de datos.

Este procedimiento lo he hecho de la manera tradicional, pero algo he de estar haciendo mal que no me lo guarda.
Previamente hice una tabla que se llama cat_ip y éste tiene 3 campos: id_ip, ip (lo definí como tipo "varchar" y 15 de longitud) y id_prom.
Éste ultimo campo es el que va a asociado a la tabla cat_prom donde guarda el promedio que es el resultado de haber contestado el cuestionario.

El código que hice es este:

Código PHP:
    .
                .
                .
              
$prom round(($resp1 $resp2 $resp3)/4,2); 
    
               
$connection mysql_connect ("localhost")
         or die (
"No se puede conectar al servidor");
    
mysql_select_db ("base_encuesta")
         or die (
"No se puede seleccionar BD");

    
//HAGO ESTA CONSULTA PARA TRAER EL ID DE LA ESPECIALIDAD POSTERIORMENTE GUARDARLA EN EL CAT_PROM
               
$query_id_esp mysql_query ("select * from cat_especialidad where especialidad='Obras Públicas'");
    
$r_id_esp mysql_fetch_array($query_id_esp);
    
$id_esp $r_id_esp[0]; 
 
                
$ip$_SERVER['REMOTE_ADDR'];
                
$dir_ip $ip;

//EN ESTA CONSULTA GUARDO LOS DATOS EN EL CAT_PROM
$instruccion "INSERT INTO cat_prom VALUES(null, $prom, $id_esp)"
$actualizacion mysql_query ($instruccion$connection)
or die (
"fallo en el insert a cat_prom");
    
$id_prommysql_insert_id();

    
    echo 
"$dir_ip ";
    echo 
"$id_prom";
    
       
//AQUI ES DONDE ME MARCA ERROR, PUES NO ME GUARDA LOS DATOS EN EL CAT_IP
    
$query_ip "INSERT INTO cat_ip VALUES(null, $dir_ip, $id_prom)";
                
$actualizacion mysql_query ($query_ip$connection)
                or die (
"Fallo en el agregado de la ip"); 
Espero me haya podido explicar, en esa última consulta me marca el mensaje de error que hubo fallo en el agregado de la ip, sin embargo si me imprime sus valores.

Me podrían orientar qué estaré haciendo mal?
Les agradezco de antemano.
Saludos!
  #2 (permalink)  
Antiguo 07/08/2007, 19:28
 
Fecha de Ingreso: agosto-2006
Mensajes: 121
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Guardar dirección ip en BD

Por lo menos te faltan las comillas en los valores de los campos varchar en la consulta de inserción:

INSERT INTO cat_ip VALUES(null, $dir_ip, $id_prom)

debería ser:

INSERT INTO cat_ip VALUES(null, '$dir_ip', '$id_prom')

Luego, el campo id_ip no sé qué tipo debe ser exactamente, pero es curioso que le des valor null. Si es un autoincrement creo que ta fallará. No sé ya contarás.

Un apunte más. La variante de sentencia INSERT que utilizas aunque correcta, es peligrosa. Esto es así porque omites los nombres de los campos que quieres utilizar después del nombre de la tabla donde quieres agregar. El problema es, ¿Qué seucederá si en un momento dado necesitas modificar la estructura de la tabla? Pues que casi seguro, el script dejará de funcionar bien (piensa por ejemplo en agregar un nuevo campo).
  #3 (permalink)  
Antiguo 07/08/2007, 19:50
 
Fecha de Ingreso: enero-2007
Ubicación: Buenos Aires, ARG
Mensajes: 71
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Guardar dirección ip en BD

Concuerdo con GikaJavi, deberías poner los nombres de los campos, y si el primero es autoincrement no hace falta q esté

Una forma podría ser

Código PHP:
$query_ip "INSERT INTO cat_ip ( dir_ip, id_prom) VALUES ( '$dir_ip', '$id_prom')"
en el caso que (dir_ip, id_prom) sean los nombres de las columnas de la tabla cat_ip

Otra forma

Código PHP:
$query_ip sprintf("INSERT INTO cat_ip ( dir_ip, id_prom) VALUES ( '%s', '%s' )"$dir_ip$id_prom); 
Espero te sirva, saludos!
  #4 (permalink)  
Antiguo 07/08/2007, 21:12
Avatar de Infernal  
Fecha de Ingreso: septiembre-2004
Ubicación: Tamaulipas, Mexico
Mensajes: 124
Antigüedad: 19 años, 7 meses
Puntos: 0
Re: Guardar dirección ip en BD

Te recomiendo usar las funciones ip2long y long2ip de php para guardar las ip's en la base de datos como datos enteros ya que esto te ahorrara espacio y las consultas seran mas rapidas.
  #5 (permalink)  
Antiguo 07/08/2007, 23:25
 
Fecha de Ingreso: febrero-2007
Ubicación: México
Mensajes: 44
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Guardar dirección ip en BD

GRacias GikaJavi, Saganxis e Infernal!!


Consideré los tips que me dieron.

1. Aunque no me marcaba error por las comillas, de todos modos se lo agregué, y pues tienes razón, en caso de que agregara otro campo tendría otra vez que hacer el script para la consulta, pero lo tomaré en cuenta ya que apenas estoy empapandome de éste lenguaje y traté de hacerlo como según fuí aprendiendo.

2. Tomé el 1er query que me escribiste, y bueno, solo tuve que modificar en la consulta el nombre del campo de la ip. y que crees? Funcionó perfectamente!!! Ya tengo almacenado en mi cat_ip la dirección ip del usuario que contesta el cuestionario. :D GRacias mil!

3. Las funciones que me recomendaste que checara (ip2long y long2ip), lo investigué hace rato y lo sentí muy complejo, en el manual de php me explica que es lo que hace pero no supe como manipularlo para mi caso, te agradecería si me dijeras un ejemplo, por favorcito.

Otra cosilla que se me ocurrió despues de ver que me funcionó el código (gracias a ustedes) es ahora cómo evitar que el usuario no conteste el cuestionario 2 veces. Aplicaría un if, cierto? cómo sería la condición?


Gracias nuevamente..
  #6 (permalink)  
Antiguo 08/08/2007, 08:40
 
Fecha de Ingreso: enero-2007
Ubicación: Buenos Aires, ARG
Mensajes: 71
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Guardar dirección ip en BD

bueno a a mi parecer:
si es una encuesta abierta asi sin más, no tendrías ningun tipo de control, ya que x el ip no lo podrías hacer, xq este ultimo cambia si el usuario se conecta de otro lugar.
Sin embargo si es una encuesta en la que cada uno q responde tiene un nombre de usuario bueno deberías usar un campo + a la tabla con el id de usuario y antes de insertar la respuesta del tipo pones un if preguntando si en ese campo ya está el id de usuario...

O sea, supongamos q el campo del id de usuario es "user_id"

tendrias q poner:

$user_id = $_POST[ 'user_id' ]; //supongamos q lo tomas del post o de una variable de session

$sql = "select user_id from cat_ip where user_id = $user_id";
$res = mysql_query( $sql , $conn);
if( mysql_num_rows( $res ) == 0){//o sea q no hay registro del usuario
...
acá insertas el codigo para agregar el ip o lo q quieras
...
}else{
//el usuario ya respondió anteriormente

}


Espero t sirva!, saludos
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 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 09:28.