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

    [CURIOSITÀ] - Strano comportamento PHP con le sessioni

    Ciao a tutti! Chiedo lumi riguardo uno strano comportamento che mi è capitato di osservare da parte di PHP con le sessioni.

    Nel mio applicativo ho una pagina che mostra alcune informazioni riguardanti gli utenti. Per facilità ho creato una funzione che da un id univoco restituisce il nick di un utente (interrogando il database).

    Funziona tutto, ecco la funzione, semplicissima:
    Codice PHP:
    function getnickfromuid($id)
    {
        
    $q mysql_query("SELECT `uid`, `nick` FROM `users` WHERE `uid` = " . (int) $id " LIMIT 0, 1");
        if(!
    is_resource($q)) return FALSE;
        else
        {
            
    $data mysql_fetch_array($q);
            return 
    $data['nick'];
        }

    Per sbaglio, ho urtato la tastiera e ho aggiunto una lettera alla mia funzione cambiando involontariamente la query in questo modo:
    Codice PHP:
    $q mysql_query("SELECT `uid`, `nick` FROM `users` WHERE `uid` = " . (int) $ikd " LIMIT 0, 1"); 
    (c'è una 'k' in più nella variabile $id, se state cercando la differenza come nella settimana enigmistica! ).

    Non ho verificato se la query va a buon fine (magari valorizzando $ikd per via del casting), ma se anche fosse restituirebbe un valore FALSE o ... boh!

    In ogni caso, la cosa strana è che questo errore porta ad una completa cancellazione della mia sessione, cookie compresi!

    Qualcuno sa spiegarmi il perchè?! O almeno ha idea di cosa possa esser successo al PHP?

    (ho risolto il problema, ma mi ha "spaventato")... :berto:

    Grazie!
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Credo che il punto sia nel fatto che non è proprio corretto il codice che usi.

    In pratica la tua query diventa:


    codice:
    SELECT `uid`, `nick` FROM `users` WHERE `uid` = 0 LIMIT 0, 1
    infatti il casting a int di una variabile vuota fa diventare il valore = 0.

    Ora se tu lanci questa query, $q sarà sempre una resource, e quindi passerà oltre il primo if.

    Non so cosa succeda alla sessione (probabilmente dipende da come tratti il risultato di questa funzione), ma sta di fatto che la funzione restituisce una stringa vuota, che quasi sempre equivale a "false" in php.

    Ciao

    EDIT.

    Io correggerei il codice cosi:

    codice:
    function getnickfromuid($id)
    {
        $q = mysql_query("SELECT `uid`, `nick` FROM `users` WHERE `uid` = " . (int) $id . " 
    LIMIT 0, 1");
        if($q) {
          if(mysql_num_rows($q)) {
            $data = mysql_fetch_array($q);
            return $data['nick'];
          } else {
             return false;
          }
        } else {
          return false;
        }
    }

  3. #3
    Si infatti, quello l'avevo già fatto! Grazie per il consiglio...

    Come giustamente dici "dipende da come tratti il risultato"... Il problema è che il risultato è semplicemente stampato a video! è questo che mi ha lasciato perplesso, perchè non viene ASSOLUTAMENTE lasciato in mano a qualsiasi funzione o pagina che modifichi la sessione, anzi! Ho fatto un po' di debug e la sessione si annulla dopo la prima volta che la funzione restituisce un valore che a questo punto non saprei definire... o.O

    Grazie ancora x la risposta!
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  4. #4
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Se vuoi fare un po' di debug prova a stampare in diversi punti del codice il session_id(), e vedi se cambia cosi puoi cercare il motivo.

    ciao

  5. #5
    eh io ho fatto stampando l'array $_SESSION e cambia appena dopo quella funzione... Sono sempre più confuso... Questo va contro tutti i principi della programmazione procedurale (almeno finchè non trovo la gabola :P) eheh
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Sì però da noi pretendi l'impossibile.... potresti farci vedere il codice che usi prima e dopo la chiamata della sessione!!

  7. #7
    Eh, per pigrizia non l'ho copiaincollato prima.. è parecchio lungo e dovrei "spulciarlo" stando attento a cosa potrebbe in effetti potenzialmente modificare la sessione.
    Dunque vediamo che riesco a fare... :master:

    Così registro la sessione (questo è tutto il file della registrazione incluso all'inizio di ogni pagina, dopo aver chiaramente avviato la sessione):
    Codice PHP:
    <?php

    $sNICK 
    $_SESSION['nick'];
    $sUID = (int) $_SESSION['uid'];
    $sLEVEL = (int) $_SESSION['lev'];

    if((!isset(
    $_SESSION['nick']) || !isset($_SESSION['uid']))
    {
        
    $_SESSION['uid'] = '';
        
    $_SESSION['nick'] = '';
        
    $_SESSION['lev'] = '';
        unset(
    $sNICK);
        unset(
    $sUID);
        unset(
    $sLEVEL);
    }

    ?>
    Questa è la funzione incriminata (nonchè l'UNICA chiamata all'interno della pagina che dà problemi:
    Codice PHP:
    function getnickfromuid($id)
    {
        
    $q mysql_query("SELECT `uid`, `nick` FROM `users` WHERE `uid` = " . (int) $id " LIMIT 0, 1");
        if(!
    is_resource($q) || mysql_num_rows($q) == 0) return FALSE;
        else
        {
            
    $data mysql_fetch_array($q);
            return 
    $data['nick'];
        }

    E ora arriviamo al "succo"...
    All'interno della pagina incriminata c'è un semplice switch su una variabile (pulita) passata con GET (per comodità riporto solo il caso in cui riporta problemi).
    I files che non ho menzionato prima (config.php e select_lang.php) non contengono chiamate a funzioni di sessione, ma solo rispettivamente delle variabili di configurazione e il caricamento selettivo del linguaggio del sito:
    Codice PHP:
    <?php

    session_start
    ();
    include(
    "session_reg.php");
    include(
    "config.php");
    include(
    "select_lang.php");
    include(
    "functions.php");

    $a strip_tags($_GET['a']);
    if(
    $a == '' || !isset($a)) $a "main";

    switch(
    $a)
        {
            case 
    'user': { include( "/path/alla/pagina.php");
            } break;
    }
    ?>
    e infine la famosa pagina inclusa recita così:
    Codice PHP:
    <?php
    $queryj 
    mysql_query("SELECT * FROM `users` LIMIT 0, 10");
    $numresults mysql_num_rows($queryj);

    //Intestazioni per tabella (puro codice HTML) rimosse
    while($pic mysql_fetch_array($queryj))
        {
            
    $nick getnickfromuid($pic['uid']);
            
    //tabella html
                   //contenuto celle
                
    echo "<A href=\"" $pic['path'] . "\" target=\"_blank\"><IMG src=\"" $pic['thumb'] . "\" alt=\"$nick\" border=\"1\"></A>
    <A href=\"" 
    $_SERVER['PHP_SELF'] . "?a=profile&id=" $pic['uid'] . "\">" $nick "</A>
    <INPUT type=\"radio\" name=\"ch
    $cont\" value=\"1\"  checked=\"checked\"><IMG src=\"images/choice_yes.png\" border=\"0\" alt=\"$imlst4\">  <INPUT type=\"radio\" name=\"ch$cont\" value=\"0\"><IMG src=\"images/choice_no.png\" border=\"0\" alt=\"$imlst5\"><INPUT type=\"hidden\" name=\"photo$cont\" value=\"" $pic['id'] . "\">";
            
    //ancora tabella html
            //ancora tabella html
            
    $row++; //conteggio righe per colori diversi
            
    $cont++;
        }

    ?>
    Per dirla tutta, dopo il primo while, la sessione perde le variabili se la funzione getnickfromuid() viene modificata come ho accidentalmente fatto io (vd. post sopra)

    Grazie mille per la pazienza le pagine funzionano, quindi eventuali errori nelle variabili o nel flusso son dovute alla fretta o al copia/taglia/incolla selvaggio del momento
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non è che hai register_globals a on??!!?

  9. #9
    si in effetti è su on (sto facendo i test con xampp su linux), ma comunque non vedo come mai debba modificarmi la sessione.. io le variabili di sessione (e quelle che dipendono direttamente dall'array $_SESSION[]) non le chiamo nemmeno in causa... boh

    Grazie per la pazienza, mi sa che rimarrà un mistero!
    Questa e' la mia firma! Lo so, e' una mezza schifezza.
    Un sito
    - skype non è per consulenze online -

  10. #10
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non c'è nessun mistero. Con register_globals a on le variabili di sessione le chiami in causa anche senza volere
    Codice PHP:
    $nick getnickfromuid($pic['uid']); 
    Indovina che fine fa la variabile di sessione 'nick' quando la tua funzione non restituisce nulla

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.