Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    Problemi con le sessioni

    Ciao a tutti..non so dove sbattere la testa
    Ho in cantiere un sito e sto implementando le registrazioni per gli account e quindi inevitabilmente ho incontrato le sessioni.. ma non funzionano! praticamente il sito è strutturato così:

    Praticamente adesso sto lavorando(si fa per dire) sulle parti del login..lasciando perdere il secondo menu a sinistra che comunque ha bisogno del login funzionante x funzionare..sto lavorando sulle pagine di login e poi quelle che si possono vedere da loggato! praticamente in quella cella al centro per la pagina di login ho creato il file che poi si include se richiamato da "VAR" ed è cosi strutturato:
    Codice PHP:
    <?PHP

    //creo uno switch con due step..uno per inserire i dati e uno per elaborarli
    switch ($_GET["step"]) {
        case 
    "": case "1":
    //se c'è il cookie ricava il nome e la password, poi cerca il nome nel database con quella password
    if(IsSet($_COOKIE['sav_user'])) {
      
    $info_cok=$_COOKIE['sav_user']; 
      
    $cok_user=strtok($info_cok,"%%"); 
      
    $cok_pass=strtok("%%");
    $query1 "SELECT Nickname FROM utenti WHERE Password = '$cok_pass'";
    $result mysql_query($query1$db) or die (error ());
    $nickname mysql_fetch_assoc($result);
    //dopo aver trovato il nome controlla che sia uguale a quello contenuto nel cookie, se non c'è dimmi che ho sbagliato nick o password
    if ($nickname['Nickname'] != $cok_user) {
    testa();
    echo 
    'Nickname o Password sbagliata';
    fine();
    //sennò dimmi che già sono loggato(se ho il cookie che mi fa loggare automaticamente è logico ke se entro nella pagina di login mi dice che sono già loggato)
    } else {
    $_SESSION['nick']=$cok_user
    testa();
    echo 
    'Sei già Loggato.';
    fine();
    }
    } else {
    //se non c'è il cookie invece stampami il form per loggarmi
        
    testa();
        echo 
    '<FORM method="post" action="http://localhost/***/index.php?pag=login&step=2">
    <table width="100%"  border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td colspan="2"><h1>Loggati!</h1></td>
        <td rowspan="3" align="right" valign="top">
        <div class="box">[b]Benvenuto![/b]
    Blablabla...</div></td>
      <tr>
        <td>Nickname: </td>
        <td><input type="text" name="nick" id="nick"maxlength="30" size="20"></td>
      </tr>
      <tr>
        <td>Password: </td>
        <td><input type="password" name="pass" id="pass2" maxlength="30" size="20"></td>
      </tr>
      <tr>
        <td>Ricordami: </td>
        <td><input type="checkbox" name="ricorda" id="ricorda" value="1"></td>
      </tr>
        <td colspan="2"><button type="submit">Conferma &raquo;</button></td>
        <td></td>
      </tr>
    </table>
    </form>'
    ;
    fine();
    }
        break;
        case 
    "2":
    //andiamo al passo 2
    $ricorda $_POST["ricorda"];
    $nick $_POST["nick"];
    $pass $_POST["pass"];
    //specifico che al momento della registrazione e del salvataggio della password non cripto solo la password, ma cripto il pacchetto compreso da "password+parola" che ho definito salt, cosi se malauguratamente il database va a finire in mani insicure almeno è molto + difficile trovare gli hash delle singole parole
    $psw md5(SALT.$pass);
    //qui controlliamo che i campi nick e pass non sono vuoti e se non lo sono dimmelo
    if (!isset($_POST["nick"]) || !isset($_POST["pass"])) {
    testa();
    echo 
    'Torna indietro e completa tutti i campi!';
    fine();
    } else {
    //se sono pieni prendiamo la password inserita già criptata e cerchiamola nel database, poi prendiamo il nickname associato
    $query1 "SELECT Nickname FROM utenti WHERE Password = '$psw'";
    $result mysql_query($query1$db) or die (error ());
    $nickname mysql_fetch_assoc($result);
    }
    //se il nick trovato non corrisponde col nick inserito allora dicci che o la password o il nick sn sbagliati
    if ($nickname['Nickname'] != $nick) {
    testa();
    echo 
    'Nickname o Password sbagliata';
    fine();
    } else {
    //se non ci sono errori iniziamo finalmente la sessione
    session_start();
    $_SESSION['nick'] = $nick;
    $_SESSION['psw'] = $psw;
    //se abbiamo selezionato il pulsante ricorda creiamo un cookie con nick e password
    if(IsSet($_POST['ricorda'])) 

      
    $cok=$nick."%%".$psw
      
    setcookie("sav_user",$cok,time()+31536000);

    //ora stampiamo a video ciò che è successo e poi metti il link alla pagina successiva
    testa();
    echo 
    'Ciao '.$_SESSION['nick'].'. Login effettuato con successo!
    Vai alla homepage: [url="http://localhost/fil08/index.php?pag=homeu"]Clicca qui[/url]'
    ;
    fine();
    }
    }
    ?>
    Solo che ci sono alcuni problemi:

    1)Non crea nessun cookie nonostante ci sono le condizioni x farlo
    2)La cosa fondamentale..non crea la sessione..anzi precisiamo..la sessione nella stessa pagina c'è infatti mi dice che sono loggato..ma quando vado nell'altra pagina mi dice che non sono loggato!
    3)Mi da messaggi di errore ke non so come risolvere:
    Warning: session_start(): Cannot send session cookie - headers already sent by (output started at d:\programmi\easyphp1-8\www\fil08\fileinclusi\head.php:10) in d:\programmi\easyphp1-8\www\fil08\fileinclusi\centro\login.php on line 72

    Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at d:\programmi\easyphp1-8\www\fil08\fileinclusi\head.php:10) in d:\programmi\easyphp1-8\www\fil08\fileinclusi\centro\login.php on line 72

    Warning: Cannot modify header information - headers already sent by (output started at d:\programmi\easyphp1-8\www\fil08\fileinclusi\head.php:10) in d:\programmi\easyphp1-8\www\fil08\fileinclusi\centro\login.php on line 78

    Aiutoooooooooooo

    Specifico che alcune funzioni e dati sono inseriti in un file esterno quindi se non trovate per esempio testa() o fine() non è che non ci sono ma sono in un altro file

  2. #2
    ah dimenticavo di specificare..

    la riga 10 del file head.php è costituita dal tag <body>..ma che significa? io sapevo che la sessione doveva iniziare prima di ogni altro tag html ma non posso anche perchè del login si occupa quella specifica cella e se la faccio prima della tabella poi non potrei gestire quell'impostazione..

  3. #3
    Prova a spostare session_start() in cima alla pagina, come prima istruzione... e mettilo in cima ad OGNI pagina che fara' uso di variabili $_SESSION, del session_id o in generale di qualsiasi altra cosa legata alle sessioni. Chiaramente se un file viene incluso in un altro che ha gia' avviato la sessione con session_start, non e' necessario inserirlo anche li' (anzi non devi farlo, altrimenti ti da' errore)...

  4. #4
    il fatto è che non posso iniziare la sessione prima ancora di aver fatto il login capito? ora pero sto provando diversamente..cioè nel file d configurazione incluso in tutte le pagine ho messo questa funzione:
    Codice PHP:
    function login() {
     if (isset(
    $_POST["nick"]) && isset($_POST["pass"])) {
      
    $ricorda $_POST["ricorda"];
      
    $nick $_POST["nick"];
      
    $pass $_POST["pass"];
      
    $psw md5(SALT.$pass);
      
    $query1 "SELECT Nickname FROM utenti WHERE Password = '$psw'";
      
    $result mysql_query($query1$db) or die (error ());
      
    $nickname mysql_fetch_assoc($result);
       if (
    $nickname['Nickname'] = $nick) {
        
    session_start();
        
    $_SESSION['nick'] = $nick;
        
    $_SESSION['psw'] = $psw;
         if(IsSet(
    $_POST['ricorda'])) { 
          
    $cok=$nick."%%".$psw
          
    setcookie("sav_user",$cok,time()+31536000);
         }
       }
     }

    cioè se sono verificate tutte le condizioni tipo nick e pass corrispondenti, nick e pass non vuoti ecc..crea la sessione..poi questa funzione l'ho richiamata subito dopo il tag body..tanto se un visitatore entra senza loggarsi allora la sessione non inizierà perchè non sono soddisfatte le condizioni..credo che cosi nn c'è bisogno nemmeno di mettere sessionstart in tutte le pagine dato che voglio che l'utente possa accedere a tutte le parti del sito(non ho una parte amministrativa)..il fatto è che ora non si connette al database :-\
    mi dice questo:
    Notice: Undefined variable: db in d:\programmi\easyphp1-8\www\fil08\fileinclusi\config.inc.php on line 45

    Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in d:\programmi\easyphp1-8\www\fil08\fileinclusi\config.inc.php on line 45

    ma io invece tutti i dati per il database li ho inseriti infatti prima se quelle condizioni le immettevo nel file login.php che ho scritto prima funzionava tutto..

    ah comunque io session_start() l'avevo inserito non solo nel file login.php ma naturalmente anche nelle pagine private..ma l'errore era proprio che non trovava nessuna sessione ne nessun cookie

  5. #5
    Originariamente inviato da Giuseppe1000
    il fatto è che non posso iniziare la sessione prima ancora di aver fatto il login capito?
    session_start() va messo prima di qualsiasi output video, altrimenti ti da' quell'errore di header che hai postato poco piu' sopra...

    ad ogni modo e' buona norma iniziare la sessione per ogni utente, ad inizio pagina, in modo da non trovarti in seguito a dover andare a cercare in che porzione di codice o all'interno di quale ciclo l'avevi iniziata, per poterla poi inserire anche nelle parti che risultano scoperte.
    Nel codice sopra ad esempio ho visto che fai un controllo su una variabile $_SESSION prima di dichiarare session_start.

    iniziare la sessione non vuol dire automaticamente autorizzare l'utente o dargli qualche tipo di privilegio, ma semplicemente avviare le procedure che fanno in modo di assegnare un ID di sessione univoco a quell'utente e identificarlo nel corso delle varie pagine di quella sessione.

    Pensa che io in genere session_start() lo metto direttamente nel costruttore della classe principale di un sito...

  6. #6
    ok ora provo grazie mille speriamo...

  7. #7
    Prima sistema le sessioni, poi ci occupiamo dell'altro errore

    Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in d:\programmi\easyphp1-8\www\fil08\fileinclusi\config.inc.php on line 45

    ... che vedrai sara' qualche piccolo errore di battitura o sintassi da qualche parte nella connessione al database...

  8. #8
    niente da fare non funziona!
    ho messo session_start sia all'inizio delle procedure di login(in tutti e due gli step) sia addirittura prima/dopo del tag <body>..ma non c'è verso di farlo funzionare da sempre lo stesso errore

  9. #9
    forse non sono stato sufficientemente chiaro, ma devi metterlo come prima istruzione assoluta, ancora prima di iniziare a scrivere l'html... non deve esserci nessun tipo di output prima...

    se hai una pagina index.php unica, da cui poi includi tutte le altre, mettilo nella primissima riga di quel file, e levalo da tutte le altre pagine che verranno incluse in quella.

    Altrimenti, se hai diversi file che vengono richiamati, devi metterlo all'inizio di tutti questi file, se fanno uso di dati di sessione...

  10. #10
    funzionaaaaaaaa

    l'ho messo all'inizio del file index.php(il file che poi genera tutte le pagine) e adesso funziona..ora mi dice finalmente che c'è la sessione..solo qualche problemino che spero sia da poco:
    Appena loggato..mi da questi errori:

    Notice: A session had already been started - ignoring session_start() in d:\programmi\easyphp1-8\www\fil08\fileinclusi\centro\login.php on line 2

    Warning: Cannot modify header information - headers already sent by (output started at d:\programmi\easyphp1-8\www\fil08\fileinclusi\head.php:11) in d:\programmi\easyphp1-8\www\fil08\fileinclusi\centro\login.php on line 58

    dove la linea2 è la chiamata a session start del primo step(quello dove c'è il form di inserimento dati..è subito dopo l'inizio del tag <?php e prima del tag switch) mentr la linea 58 è la stringa del cookie:
    Codice PHP:
      setcookie("sav_user",$cok,time()+31536000); 
    -------------
    entrando invece in una pagina dove c'è bisogno della sessione da questo messaggio:
    Notice: A session had already been started - ignoring session_start() in d:\programmi\easyphp1-8\www\fil08\fileinclusi\centro\homeu.php on line 3
    cioè si riferisce alla stringa sempre session_start();
    non è che dopo ke l'ho messo una volta non lo devo mettere più? in quel caso lo stesso la pagina sarà visibile solo a chi ha fatto il login?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.