• User Attivo

    Facciamo sul serio - gestire i miei utenti

    Salve a tutti e buon anno.

    Spero di non creare problemi con la mia domanda e che sia il posto giusto per postarla.

    e da poco che sono del mondo php e cerco sempre di arrivare un po piu in la con il mio sito.

    Quello che chiedo è se il mio raggionameto e poi applicabile in pratica:

    Io ho un sito dove ho degli utenti si loggano ad un area riservata che elenca una serie di link.

    Io voglio tacciare i movimenti degli utenti, cioe sapere su quali link l'utente pino clicca.

    All'inizio della mia carriera di webmaster avrei creato una pagina personale per ogni utente e avrei monitorato ogni link con un contalink

    Ma adesso, com quasi mille utenti, non e proprio il caso.

    Quindi arriviamo al succo della domanda. per risolvere il problema ho pensato a questo:

    1.Dopo il login, reindirizzo a una pagina tipo utenti.php?id=nomeutente

    2.l'utente, dopo essersi loggato, accede all'area riservata che contiene una serie di link e su ogni link implemento il nome dell'utente ( non so come)

    Cosi secondo me, sempre tramite una sorta di conta click dovrei riuscire a capire che l'utente XXX ha cliccato su quei link.

    ora vi chiedo se questo ragionamento fila o è una ca...ta.

    ciao a tutti e auguri.


    scusate ma non so perche il messaggio è stato postato 2 volte


  • User

    Ciao fre2004, buon anno a te.
    Io piu' che usare una variabile GET utilizzerei una SESSIONE.
    Quando l'user esegue il login salvi sulla sessione un campo con il suo username,in modo tale che:

    1. Controllando se la sessione esiste, puoi anche controllare che l'user abbia eseguito il login.
    2. L'utente non puo' manomettere come nel caso delle variabile GET il tuo counter inserendo un nome di un altro username nell'indirizzo.

    Poi al posto dell'indirizzo vero e propio potresti crearti un "get_link.php?id=ID" che:

    1. Riporti nel tuo database il click dell'utente
    2. Redirecti l'utente nel sito

    Naturalmente questo metodo necessita di un database.


  • User Attivo

    un esempio pratico, se non è troppo lungo?


  • User

    Hmn... facciamo un esempio;

    Partiamo dal principio.
    Crei sul tuo database le tabelle che ci servirranno per farti il tuo piccolo sistema di contaclick.
    Ci servono due tabelle.
    Una click dove andiamo a inserire tutti i click effettuati dagli utenti, mentre nella seconda tabella chiamata link andiamo a inserire i link.

    La struttura di click è questa:

    • ID (Non credo debba aggiungere altro:P)
    • Utente (contiene il nome dell'utente che effettua un click)
    • Sito (Servirà a definire su quale link ha cliccato)
    • Timestamp (Ho inserito anche questo campo nel caso tu voglia vedere in un determinato arco di tempo quante volte questo user ha cliccato su un link)
    
    SQL:
    
    CREATE TABLE `click` (
    `id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `utente` VARCHAR( 5 ) NOT NULL ,
    `link` VARCHAR( 5 ) NOT NULL ,
    `timestamp` INT( 20 ) UNSIGNED NOT NULL
    ) ENGINE = MYISAM ;
    
    
    

    Mentre la struttura di link è la seguente:

    • ID
    • Link
      (qui puoi aggiungerci anche altri campi come per esempio una descrizione al link o qualsiasi altra cosa vuoi)
    
    SQL:
    CREATE TABLE `link` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `link` VARCHAR( 255 ) NOT NULL ,
    UNIQUE (
    `link`
    )
    ) ENGINE = MYISAM ;
    
    

    Create le tabelle in MYSQL bisogna creare la pagina che memorizza sul database i click e redirecta gli user a quell'indirizzo.
    Percui crea la tua pagina go_url.php e ci inserisci

    
       <?php
    $config['host'] = 'localhost';
    $config['user'] = '';
    $config['pass'] = '';
    $config['database'] = '';
    
     if(!$_SESSION['user'] || empty($_SESSION['user'])) {echo 'Devi prima seguire il login'; return 0;}
      if(!$_GET['id'] || !is_numeric($_GET['id'])) {echo 'L\'i deve essere numerico'; return 0;}
     
       $m_d = mysql_connect($config['host'],$config['user'],$config['pass']);
       if(!$m_d) { echo 'Connessione al database mysql non stabilita';return 0;} 
       
       mysql_select_db($config['database']);
        
        $r_h = mysql_query('SELECT link FROM `link` WHERE id = '.$_GET['id']) or die('Query non valida');
        if(mysql_num_rows($r_h) === 1) { 
        $r = mysql_fetch_assoc($r_h);
        
        $q = 'INSERT INTO `click`(utente,link,timestamp) VALUES(\''.$_SESSION['user'].'\',\''.$_GET['id'].'\',UNIX_TIMESTAMP())';
        $r_h = mysql_query($q) or die('Query non valida');
        
        if(mysql_affected_rows() === 1) header('Location: '.$r['link']); // Qui puoi gestirti il redirect come vuoi se via php o via JS 
        } else {
        echo 'Link inesistente o rimosso dall\'admin';
        }
       mysql_close();
    ?>
    
    

    Bhè...alla fine non è piu' un esempio..è il code vero e propio;

    P.S: Dò per scontato che sai eseguire query su MYSQL se cosi' fosse nn avrai difficoltà a farti il codice per stampare nella pagina i link 'http://tuodominioblabla/go_url.php?id=numero'; Il numero dovrai prendertelo con una semplice select nella tabella link.


  • User Attivo

    ok. ora ci provo,

    grazie mille.


  • User Attivo

    ho fatto tutto e fatto una prova, mi dice che devo eseguireil login.

    intuisco che è unproblema di sessioni.

    io ho gia una pagina dove gli utenti si loggano. il problema è che uso dreamwaver per creare il codice.

    dimmi se ci ho preso:

    la sessione sulla pagina di login ha un nome che non combacia con quello del codice che mi hai dato, giusto?

    quindi, devo cambiare qualcosa alla sessione?

    allego il codice del form per il login:

    <?php
    // *** Validate request to login to this site.
    if (!isset($_SESSION)) {
    session_start();
    }
    $loginFormAction = $_SERVER['PHP_SELF'];
    if (isset($_GET['accesscheck'])) {
    $_SESSION['PrevUrl'] = $_GET['accesscheck'];
    }
    if (isset($_POST['username'])) {
    $loginUsername=$_POST['username'];
    $password=$_POST['password'];
    $MM_fldUserAuthorization = "";
    $MM_redirectLoginSuccess = "welcome.php";
    $MM_redirectLoginFailed = "errore-login.html";
    $MM_redirecttoReferrer = false;
    mysql_select_db($database_gcv, $gcv);

    $LoginRS__query=sprintf("SELECT username, password FROM user WHERE username='%s' AND password='%s'",
    get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password));

    $LoginRS = mysql_query($LoginRS__query, $gcv) or die(mysql_error());
    $loginFoundUser = mysql_num_rows($LoginRS);
    if ($loginFoundUser) {
    $loginStrGroup = "";

    //declare two session variables and assign them
    $_SESSION['MM_Username'] = $loginUsername;
    $_SESSION['MM_UserGroup'] = $loginStrGroup;       
    if (isset($_SESSION['PrevUrl']) && false) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl']; 
    }
    header("Location: " . $MM_redirectLoginSuccess );
    

    }
    else {
    header("Location: ". $MM_redirectLoginFailed );
    }
    }
    ?>


  • User
    
    $_SESSION['MM_Username'] = $loginUsername;
    
    

    Questo è il nome della sessione,percui cambia il nome del campo 'user' (della mia sessione) e mettici 'MM_Username';

    Un altra,devi riprendere la vecchia sessione,questo puoi farlo inserendo dopo il <?php il comando session_start();


  • User Attivo

    ho risolto anche qui.

    ancora grazie.


  • Super User

    se vuoi creare un sistema di gestione utenti efficace dai una sbirciata alle pillole in rilievo in questa sezione, è stata sviluppata una discussione su come fare il login in modo veramente figo.

    :ciauz:


  • User Newbie

    Ciao a tutti,
    spero che mi possiate trovare una soluzione, visto che è da due settimane che ci sto sbattendo la testa.

    Ho seguito questa discussione, ho risolto il problema che ha riscontrato "fre2004" ma mi è comparso un altro:
    if(!$_GET['id'] || !is_numeric($_GET['id'])) {echo 'L'i deve essere numerico'; return 0;

    Sulla browser continua a dirmi che "L'i deve essere numerico"

    Non capisco il motivo, ho provato di tutto ma continuo a non capire..

    Vi posto anche login.php..

    <?php

    include 'dbc.php';

    $err = array();

    foreach($_GET as $key => $value) {
    $get[$key] = filter($value); //get variables are filtered.
    }

    if ($_POST['doLogin']=='Login')
    {

    foreach($_POST as $key => $value) {
    $data[$key] = filter($value); // post variables are filtered
    }

    $user_email = $data['usr_email'];
    $pass = $data['pwd'];

    if (strpos($user_email,'@') === false) {
    $user_cond = "user_name='$user_email'";
    } else {
    $user_cond = "user_email='$user_email'";

    }

    $result = mysql_query("SELECT id,pwd,full_name,approved,user_level FROM users WHERE
    $user_cond
    AND banned = '0'
    ") or die (mysql_error());
    $num = mysql_num_rows($result);

    // Match row found with more than 1 results - the user is authenticated.
    if ( $num > 0 ) {

    list($id,$pwd,$full_name,$approved,$user_level) = mysql_fetch_row($result);
    
    if(!$approved) {
    //$msg = urlencode("Account not activated. Please check your email for activation code");
    $err[] = "Account not activated. Please check your email for activation code";
    
    //header("Location: login.php?msg=$msg");
     //exit();
     }
     
    	//check against salt
    if ($pwd === PwdHash($pass,substr($pwd,0,9))) { 
    if(empty($err)){			
    
     // this sets session and logs user in  
       session_start();
       session_regenerate_id (true); //prevent against session fixation attacks.
    
       // this sets variables in the session 
    	$_SESSION['user_id']= $id;  
    	$_SESSION['user_name'] = $full_name;
    	$_SESSION['user_level'] = $user_level;
    	$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
    	
    	//update the timestamp and key for cookie
    	$stamp = time();
    	$ckey = GenKey();
    	mysql_query("update users set `ctime`='$stamp', `ckey` = '$ckey' where id='$id'") or die(mysql_error());
    	
    	//set a cookie 
    	
       if(isset($_POST['remember'])){
    			  setcookie("user_id", $_SESSION['user_id'], time()+60*60*24*COOKIE_TIME_OUT, "/");
    			  setcookie("user_key", sha1($ckey), time()+60*60*24*COOKIE_TIME_OUT, "/");
    			  setcookie("user_name",$_SESSION['user_name'], time()+60*60*24*COOKIE_TIME_OUT, "/");
    			   }
    	  header("Location: myaccount.php");
    	 }
    	}
    	else
    	{
    	//$msg = urlencode("Invalid Login. Please try again with correct user email and password. ");
    	$err[] = "Invalid Login. Please try again with correct user email and password.";
    	//header("Location: login.php?msg=$msg");
    	}
    } else {
    	$err[] = "Error - Invalid login. No such user exists";
      }		
    

    }

    ?>

    Vi prego, per un neofita come me essere arrivato fin qui con le proprie mani è stato un miracolo.
    Spero di trovare una soluzione.
    Grazie a tutti in anticipo!
    Ciao!


  • User Newbie

    Sono di nuovo io 🙂
    Qualcuno riuscirebbe a sistemarmelo?
    Sono anche disposto ad offrire una ricompensa a chi riesce a sistemarlo, credo che sia il minimo per il vostro aiuto.A ciascuno il suo, insomma 🙂
    Grazie ragazzi!