Foros del Web » Programando para Internet » PHP »

Comprobar y continuar

Estas en el tema de Comprobar y continuar en el foro de PHP en Foros del Web. Hola, tengo un problema, quiero tener un sistema de referidos y que claro, solo se pueda referir una vez por IP pero que a ese ...
  #1 (permalink)  
Antiguo 24/04/2010, 05:12
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Comprobar y continuar

Hola, tengo un problema, quiero tener un sistema de referidos y que claro, solo se pueda referir una vez por IP pero que a ese usuario lo puedan referir mas veces y no solo una, esto funciona simplemente con entrar al index.php, no hace falta que nadie se registre


Imagenes de como es mi base de datos:






Aca pongo un ejemplo:

Usuario tiene ID... 318

Usuario 1 visita al index con reffer 318 (Procede a referirlo)
Usuario 2 visita al index con reffer 318 (Procede a referirlo)
Nuevamente el Usuario 1 visita al index con reffer 318 (Comprueba que lo hizo anteriormente y no deja referirlo otra vez)

Pero no se como hacerlo :S

Aca hay una pagina que tiene lo mismo que quiero yo: http://www.psncodegenerator.com/

Gracias por adelantado.
  #2 (permalink)  
Antiguo 24/04/2010, 05:30
 
Fecha de Ingreso: diciembre-2009
Mensajes: 612
Antigüedad: 14 años, 4 meses
Puntos: 16
Respuesta: Comprobar y continuar

simplemente tendrás que buscarlo en la bbdd.

Si agregas la IP junto con el referido como ya lo tienes, solo tienes que hacer un
select * from users where ip='$ip' and reffers='$referido'

Logicamente, bien hecha la consulta, y comprobar que no te arroja resultados, para seguir con el "trámite" o salir de la página
  #3 (permalink)  
Antiguo 24/04/2010, 05:55
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Gracias por responder, pero no entiendo lo que intentas decir... :S

Es que no estoy acostumbrado a hacer cosas con bases de datos y me confundo mucho.

Mira, este es todo el codigo que tiene mi index a la hora de crear el usuario y incrementar referidos:

index.php
Código PHP:
<?
include('conectar.php');

$ip $_SERVER['REMOTE_ADDR'];

$check_ip mysql_query("SELECT * from users where ip='$ip'");
 if(
mysql_num_rows($check_ip)!=0){
 echo 
"La IP ya esta registrada.";

$id $_GET['id'];
$query mysql_query("SELECT * FROM users WHERE id='$id'");
$ver mysql_fetch_array($query);
$reffers $ver['reffers'];
$updater mysql_query("UPDATE users SET reffers='$reffers'+'1' WHERE reffers='$reffers' AND id = $id");
@
mysql_fetch_array($updater);
$query2 mysql_query("SELECT * FROM users WHERE id='$id'");
$ver2 mysql_fetch_array($query2);
$fichastotal $ver2['reffers'];
echo 
"Referido añadido";

exit(); 


mysql_query("INSERT INTO users (ip) VALUES ('$ip')");
Yo tengo puesto un codigo que verifica que no hay un usuario anterior con esa IP y depende que como sea, crea el usuario o no.

Pero el codigo de referidos va sin control. Yo quiero que refiera a tanta capacidad como se pueda (ilimitadamente).
Pero no entiendo mucho :S

Gracias.

Última edición por nanshan; 24/04/2010 a las 08:51 Razón: Me olvide de colocar el codigo
  #4 (permalink)  
Antiguo 24/04/2010, 09:28
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

El Usuario 1 visita al referido 318, y lo registra, pero si lo intenta por 2da vez o más, le lanza el error de que ya lo visitó. Simplemente usas la IP.

Código PHP:
Ver original
  1. // Verificamos si la IP existe...
  2. $query = mysql_query("SELECT id FROM users WHERE ip='".$ip."'");
  3. if(mysql_num_rows($query)>0) {
  4.    die("La IP XXX.XXX.... ya se encuentra registrada.");
  5.    /*
  6.      O puedes usar un echo y un exit;
  7.      Ej :
  8.  
  9.       echo "La IP ya está registrada...";
  10.       exit;
  11.  
  12.    */
  13. }

Uso die, ya que tu código solo tiene un echo, es decir, tu código no detiene la ejecución de lo que está debajo, por lo cual seguirá insertando, e insertando.

Un consejo...

Tú tienes el siguiente comando update :

Código PHP:
Ver original
  1. $id = $_GET['id'];
  2. $query = mysql_query("SELECT * FROM users WHERE id='$id'");
  3. $ver = mysql_fetch_array($query);
  4. $reffers = $ver['reffers'];
  5. $updater = mysql_query("UPDATE users SET reffers='$reffers'+'1' WHERE reffers='$reffers' AND id = $id");

Lo que estás haciendo no es del todo necesario. Primero sacas los datos del usuario con ID = $_GET['id'], obtienes la cantidad de referidos y luego la sumas en la tabla, pero eso lo puedes hacer sin el primer select, un ejemplo :

Código PHP:
Ver original
  1. $id = $_GET['id'];
  2. $updater = mysql_query("UPDATE users SET reffers=reffers+1 WHERE id = $id");

Así es mucho más simple, menos carga a la BD, aunque sea ínfima y menos líneas de código también.

Sumar campos de esa manera es propio de los motores de base de datos.

Nos vemos.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #5 (permalink)  
Antiguo 24/04/2010, 17:38
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Gracias por responder y ayudarme, cambiando el codigo para aligerar la carga y poder bloquear el siguiente referimiento.

Pero es que ahora, una vez que esta IP se registro sin haber referido a nadie o ya habiendo referido a alguien, esta ya nunca mas va a poder referir a otra, es decir, puede referir una unica vez, y lo que necesito es que pueda referir varias veces, pero no referir a la misma persona. No se me ocurre ninguna forma de poder hacer esto.

Por ejemplo, guardando las IP's por filas, aunque no se como hacerlo, esto esta hecho a mano, cree yo los registros desde la base de datos y no se como hacerlo con un codigo...

Yo no se si esto se puede hacer o no, ya que tiene que comprobar en todas las filas si ahi esta su IP y despues si no esta insertarla en una fila en un orden.




O puede haber otra manera alternativa para realizar esto?

:S

Desde ya, muchas gracias.

Última edición por nanshan; 24/04/2010 a las 18:39
  #6 (permalink)  
Antiguo 24/04/2010, 19:04
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

Lo que te hace falta, es aprender a trabajar con llaves foraneas, para asi poder relacionar 2 tablas. ¿Pero por qué con llaves foreaneas? Porque así te evitas crear un campo por cada referido que pueda tener, el cual no contempla un número finito, así que los campos podría ser infinitos, lo cual no es lo mejor.

Tienes 2 tablas :

1.- Tabla usuarios, donde se guardará el IP del usuario a quien visitamos, y eliminamos el campo 'reffers', ya que la cuenta la podemos hacer sin un este campo.

2.- Tabla referidos, en esta guardaremos las IP's de quienes visitand, y la ID del usuario a quien visitan.

Código:
// Usuarios

ID       |    IP

234    |    1.2.3.4.5.6.7
342    |    2.8.7.2.1.2.3
Código:
// Referidos

ID      |      IP                   |      ID_USUARIO
12     |    12.8.6.23.5       |          234
13     |     2.34.46.67       |          342
Ahora, como sería el proceso de registro de la visita al usuario.

El usuario con IP 12.8.6.23.5 (tabla referidos) visita al usuario con ID 234 (tabla usuarios). Preguntamos a la tabla referidos, si la IP existe, y a quien visitó :

Código PHP:
Ver original
  1. $query = mysql_query("SELECT * FROM referidos WHERE ip='".$ip."' AND id_usuario='".$id."'");
  2. // El usuario con IP 12.8.6.23.5  NUNCA ha visitado al usuario con ID 234
  3. // asi que lo registramos
  4. if(mysql_num_rows($query) == 0) {
  5.      mysql_query("INSERT INTO referidos (ip, id_usuario) VALUES ('".$ip."','".$id."')");
  6. }
  7. // El usuario con IP 12.8.6.23.5  ya ha visitado al usuario con ID 234
  8. // asi que evitamos que lo registre nuevamente
  9. else {
  10.     die('Ya has visitado a XXXXXXXXXXX');
  11. }


Luego, si quieres saber cuantos usuarios han visitado a un usuario X, haces un join :


Código PHP:
Ver original
  1. $query = mysql_query("SELECT COUNT(u.*) AS cid FROM usuarios AS u, referidos AS r WHERE u.id=r.id_usuario");
  2. $result = mysql_fetch_array($query);
  3. echo $result['cid'];

Creo que es la mejor manera para estos casos... trabajar con 2 tablas distintas.

Espero que hayas entendido algo de lo que escribí . Si no, solo pregúntame y trataré de explicarte.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #7 (permalink)  
Antiguo 25/04/2010, 05:06
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Mil gracias por ayudarme :) Se entiende muy bien, lo unico que no entiendo y no consegui solucionar es lo de hacer un JOIN, me salta el siguiente error:

Cita:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /hosting/www/Prueba/ver.php on line 8
Y no se como solucionarlo...
  #8 (permalink)  
Antiguo 25/04/2010, 08:48
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

No sé que podrá ser, pero en todo caso, la consulta del SELECT COUNT, estaba mal :

Código PHP:
Ver original
  1. $query = mysql_query("SELECT COUNT(r.id_usuario) AS cid FROM usuarios u, referidos r WHERE u.id=r.id_usuario");
  2. $result = mysql_fetch_assoc($query);
  3. echo $result['cid'];

El count tiene que hacerse a la tabla referidos, no a la tabla usuarios.

No recuerdo si es con mysql_fetch_array que se toman los valores devueltos de ese tipo de consulta... podrías tratar con mysql_fetch_assoc.

Prueba y me comentas.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #9 (permalink)  
Antiguo 25/04/2010, 10:19
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Gracias, lo he probado, funciona, pero muestra un resultado global, es decir, muestra la cantidad de registros que hay en total de la tabla "referidos".
¿Que puede ser?
  #10 (permalink)  
Antiguo 25/04/2010, 10:38
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

.... ¿Qué datos tienes en la tabla referidos?
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #11 (permalink)  
Antiguo 25/04/2010, 11:54
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Pues la IP, un ID y USER_ID...



Por cierto, los nombres de las tablas son diferentes pero yo siempre modifico en el codigo por los nombres que yo tengo...
  #12 (permalink)  
Antiguo 25/04/2010, 16:13
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

Ya me di cuenta de que pasa...

Esta consulta :

Código PHP:
Ver original
  1. SELECT COUNT(r.id_usuario) AS cid FROM usuarios u, referidos r WHERE u.id=r.id_usuario

Siempre devolverá el total de lo que hay en la tabla, porque la condición de la cláusula WHERE es cierta para todos los valores, siempre y cuando existan en ambas tablas. Así que habría que simplificarla, y no es necesario el JOIN, ya que la cuenta se hace sobre solo una tabla...

Código PHP:
Ver original
  1. $query = ...("SELECT COUNT(*) AS cid FROM referidos WHERE id_usuario='".$id."'");

Era tan fácil como eso -.-... fueron lapsus :P.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #13 (permalink)  
Antiguo 26/04/2010, 11:43
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Muchisimas gracias spider_boy! :)

Ya solucione el problema, una ultima pregunta antes de dar por finalizado el tema, el codigo que me diste para mostrar los resultados, le hice una pequeña modificacion para que el ID lo busque desde la IP es decir, busca la IP en la BD y le busca el ID, y lo muestra (funciona) ahora, modifique el codigo que me diste para que busque

Código PHP:
include('conectar.php'); //Conectamos con la base de datos

$ip $_SERVER['REMOTE_ADDR']; //Recojemos la IP
$id $_GET['id']; //Recojemos el ID de referencia

//Busca la IP en la BD y recoje el ID y lo muestra
$sql "SELECT id FROM users WHERE ip='".$ip."'";
$miid mysql_query$sql );
if( 
$miid2 mysql_fetch_row$miid ) ) echo 'Tu ID es: ' $miid2 [0] ;

//Este es el codigo que me diste que muestra la cantidad de referidos recojiendo el ID desde (user_id='".$miid2."') (No funciona)

$query mysql_query("SELECT COUNT(*) AS cid FROM reffers WHERE user_id='".$miid2."'");
$result mysql_fetch_assoc($query);
echo 
$result['cid']; 
Por que me muestra un resultado "0", pero probe el codigo de la forma que me diste y funciona, no se porque cuando le cambio esta parte deja de funcionar :S

Saludos, y gracias ;)
  #14 (permalink)  
Antiguo 26/04/2010, 15:32
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

Mira, tú mismo te respondiste en la línea anterior al de la consulta COUNT :

Código PHP:
Ver original
  1. $miid2 = mysql_fetch_row( $miid );
  2. echo 'Tu ID es: ' , $miid2 [0] ;
  3.  
  4. $query = mysql_query("SELECT COUNT(*) AS cid FROM reffers WHERE user_id='".$miid2."'");

$miid2 devuelve un arreglo con los datos devueltos por la consulta, debes especificar el ID. .
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #15 (permalink)  
Antiguo 26/04/2010, 15:52
 
Fecha de Ingreso: septiembre-2009
Ubicación: España
Mensajes: 136
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Comprobar y continuar

Hay! Es verdad se me salto xP

Bueno, entonces ya esta solucionado el problema...

Muchisimas gracias spider_boy!

Saludos. (:
  #16 (permalink)  
Antiguo 26/04/2010, 15:57
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Comprobar y continuar

De nada .
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.

Etiquetas: comprobar
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 10:22.