[PHP] Problema visualizzazione nome utente loggato su sito ecommerce

  • Creatore Discussione Creatore Discussione Alucard
  • Data di inizio Data di inizio

Alucard

Nuovo Utente
18 Feb 2017
13
0
1
28
Ciao, ho un problema con lo sviluppo di un sito ecommerce fatto con bootstrap(il sito comprende anche PHP, JAVASCRIPT, MYSQL), in particolare con la gestione degli utenti dato che una volta che l'utente fa l'accesso, dopo i dovuti controlli, deve visualizzare su ogni pagina del sito il suo username. Per fare ciò sto usando le sessioni, però se ad esempio dalla pagina dell'elenco dei prodotti vado nella pagina del singolo prodotto e subito dopo torno indietro, mi compare il messaggio di errore ERR_CACHE_MISS. Questo errore mi compare solamente se nella pagina dell'elenco dei prodotti c'è il session_start(), però se non lo metto non mi compare il nome utente ma solo l'accedi. Voi sapete per caso come posso risolvere questo problema? Grazie in anticipo
 
In realtà il sessiob_start() lo dichiaro solamente nella pagina che riceve i dati username e password tramite il POST, successivamente dichiaro una sessione, chiamata $_SESSION['logged'] e la inizializzo = false, se l'utente è registrato nel database allora session 'logged' diventa true e attraverso un header ritorno nella home. Nella home faccio il controllo per sapere se session 'logged' è settato, se lo è mi compare il nome utente altrimenti la scritta accedi. Lo stesso identico controllo lo faccio per la pagina dell'elenco dei prodotti, però appunto se vado nella pagina del dettaglio del prodotto e poi torno indietro mi chiede la conferma del reinvio del modulo (ERR_CACHE_MISS). Quando riuscirò a scoprire come mettere il codice direttamente in questi messaggio, magari riuscirò a spiegarmi meglio :)
 
ciao
session_start() deve esserci in tutte le pagine in cui utilizzi le sessioni.
per mettere il codice sulla riga di formattazione del post iconcina "inserisci" -> codice -> incolli il codice e selezioni quale o html o php o code
 
ciao ti schematizzo
pagina di log
Codice:
<?php
session_start();
//.... da qui in poi se ti serve puoi mettere codice html
if($utente_loggato=="SI"){
    $_SESSION['utente']=$username;
}
//....
?>
altre pagine con errrore
PHP:
<htlm>
<?php
    $_SESSION['utente']="pinco";//manca session_start()
?>

PHP:
<htlm><!-- codice html o echo qualcosa -->
<?php
    session_start();
    $_SESSION['utente']="pinco";//session_start() c'è ma viene dopo un output html
?>

pagina senza errori
PHP:
<?php
session_start();
?>
<htlm><!-- codice html o echo qualcosa -->
<?php
    $_SESSION['utente']="pinco";
?>
 
Niente da fare, sempre lo stesso errore :(
In pratica il mio sito è strutturato così:
PAGINA FORM LOGIN:
contiene solo il form HTML

PAGINA CONTROLLO LOGIN:
 
PHP:
<?php
    session_start();
?>
<html>
Struttura pagina HTML
<?php
            require_once('config.php'); //richiamo il collegamento del database
     
            $_SESSION['username'] = $_POST['username']; //richiamo le variabili username e password
            $_SESSION['password'] = $_POST['password'];
            $_SESSION['logged'] = false;

UTILIZZO UNA QUERY PER CERCARE IL NOME E LA PASSWORD NEL DATABASE
     
            if(mysql_num_rows($query) == 1) // Se trovo un utente allora ritorna direttamente nella pagina principale altrimenti apparirà un form di errore che richiederà di rifare il login
            {
                $row = mysql_fetch_assoc($query);
                $_SESSION['logged'] = true;
                header('location: home.php');
            }else{
                $_SESSION['logged'] = false;
                echo("<h2 class='section-heading' align='center'>Accedi</h2>
                        <div align = 'center'>
                        <form data-toggle='validate' name='accedi' method='POST' action= 'login.php'>
                                <div class='form-group has-error'>
                                <label class='control-label'>Dati errati o mancanti. Riprova</label>
                                <input class='form-control' style='width: auto;' type='text' placeholder='Username' name='username' size='50'></div>
                                <div class='form-group has-error'>
                                <input class='form-control' style='width: auto;' type='password' placeholder='Password' name='password' size='50'></div>
                                <div class='form-group'>
                                <input class='btn btn-primary' type='submit' value='Accedi'><br> Oppure <br><a href='form_registrazione.php'>Registrati</a></div>
                        </form></div>");
         
            }          
        ?>
</html>
 
PAGINA HOME.PHP:
PHP:
<?php
    require_once('config.php');
    session_start();
?>
<html>
STRUTTURA PAGINA CON ANCHE IL FORM PER LA RICERCA DI UN PRODOTTO
<?php
                if(isset($_SESSION['logged'])) //controllo se è settato la sessione e se lo è comparirà il nome utente altrimenti la scritta accedi
                {
                    echo("<li><a href='form_accedi.php'><i class='glyphicon glyphicon-user'></i> ".$_SESSION['username']."</a></li>");
                 
                }
                else
                {
                    echo("<li><a href='form_accedi.php'><i class='glyphicon glyphicon-user'></i> Accedi</a></li>");
                }
           ?>
</html>

PAGINA ELENCO PRODOTTI:

Il controllo è identico alla pagina home, in questa pagina richiamo la variabile della ricerca tramite post e usando una query seleziono tutti i dati che mi interessano

PAGINA DETTAGLIO PRODOTTO:

Controllo della sessione uguale alla home
 
ciao
intanto una cosa, vedo che a $_session['logged'] da o il valore TRUE o FALSE, poi verifichi che la sessione esista, ora se provi questo mini script ti accorgi che non cambia nulla in funzione di true o false
PHP:
<?php
session_start();
//$_session['logged']=FALSE;
$_session['logged']=TRUE;
if(isset($_session['logged'])){
    echo "la sessione esite<br>";
}else{
    echo "la sessione NON esite<br>";
}
?>
l'output è sempre
la sessione è TRUE
sempre sia che tu inizializzi la sessione a true o false
se togli l'isset invece vedrai che l'if funziona secondo che sia true o false
PHP:
<?php
session_start();
$_session['logged']=FALSE;
//$_session['logged']=TRUE;
if($_session['logged']){
    echo "la sessione è TRUE<br>";
}else{
    echo "la sessione è FALSE<br>";
}
?>
verifica che gli errori non derivino da questo errore
stai attento gli errori di logica sono i più insidiosi perchè il codice è sintaticamente corretto, ma il fatto che sia sintatticamente corretto non vuol dire che faccia quello che intendi fargli fare
 
Ho provato come mi hai detto, però l'ERROR_CACHE_MISS compare ugualmente. Pacciocando un po sul codice, ho scoperto che forse il problema è dovuto dal fatto che quando visualizzo l'elenco dei prodotti->vado nel dettaglio del prodotto->torno indietro, non mi tiene in memoria la variabile di ricerca
 
Nella pagina dell'elenco dei prodotti la parte PHP lo scritta così
PHP:
<?php
                        if(!isset($_SESSION['prod'])) //in teoria servirebbe per controllare se la sessione della ricerca è stata settata
                        {
                            $_SESSION['prod'] = $_POST['ricerca'];
                            $prod = $_SESSION['prod'];
                        }
                        else
                        {
                            $prod = $_SESSION['prod'];
                        }
                        
                        require_once('config.php');
                        
                        /*utilizzo una query*/
                        $query= "SELECT * FROM prodotti WHERE nome LIKE '".$prod."%' OR marca LIKE '".$prod."%';";
                        
                        /*esegue la query scritta prima richiamandola con il nome della variabile*/
                        $risultato= mysql_query($query) or die("Errore mentre recuperavo i dati ".mysql_error());
                        
                        /*conta il numero di righe*/   
                        $righe= mysql_num_rows($risultato);
                        
                        echo("<h4>Risultati riscontrati ".$righe."</h4><br>");
                                                
                        for($i=0; $i<$righe; $i++)
                        {
                            
                            $nome= mysql_result($risultato, $i, 'nome');
                            $prezzo= mysql_result($risultato, $i, 'prezzo');
                            $img= mysql_result($risultato, $i, 'icone');
                            $codice= mysql_result($risultato, $i, 'cod_prod');
                            
                            echo(""); //Visualizzo ogni prodotto con il link che porta alla pagina del dettaglio
                        }
                        
                        //disconnetto il database
                        mysql_close($connessione);           
                    
                    ?>
 
La mia è solo un'ipotesi. Qualcuno di voi conosce un altro modo per memorizzare la variabile di ricerca? :)
 
Il session_start lo richiamo all'inizio di tutta la pagina, fuori dall'HTML e ovviamente dentro il PHP :)
 
ciao
per caso nella pagina di dettaglio hai qualcosa che elimini la/le sessione/1?
comunque prova ad aggiungere un var_dump e verifica cosa riporta non quando accedi alla pagina, ma quando torni indietro dalla pagina di dettaglio
PHP:
<?php
var_dump($_SESSION['prod']);//cosa ti riporta quando torni indietro dal dettaglio

if(!isset($_SESSION['prod'])) //in teoria servirebbe per controllare se la sessione della ricerca è stata settata
    {
        $_SESSION['prod'] = $_POST['ricerca'];
        $prod = $_SESSION['prod'];
    }
//eccetera....
?>
 
Si si. Ma secondo te se nella parte del codice dove richiamo la variabile di ricerca, al posto della sessione utilizzo un cookie funzionerebbe?
 

Discussioni simili