Variabile session_id riporta solo un carattere

di il
17 risposte

Variabile session_id riporta solo un carattere

Buongiorno,

in un sito c'è il form di login(login.html) dove si collega l'utente e poi indirizzato a (login.php) e poi dashboard.php dove volevo inserire la frase "Benvenuto Nome (NomeUtente) il tuo session ID è session_id." (il Nome ora si inserisce manualmente nel form login poi dovrà prenderlo in automatico dal database)

mentre il NomeUtente me lo restituisce interno e anche la session_id il Nome no... mi restituisce solo il primo carattere. (stessa cosa per la e-mail)

la directory è
-login.html
-register.html
-php (cartella)
--login.php
--database.php
--register.php
--dashboard.php
--logout.php

poi ci sono anche css images e sql.

vi allego codici

login.html

<!DOCTYPE html>
<html>
    <head>
        <link rel="icon" href="images/logo.ico" />
        <title>Login</title>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap">
        <link rel="stylesheet" href="css/style-login.css">
    </head>
    <body>
        
     
        
        <form method="post" action="php/login.php">
            <img class="fotografia" src="images/logo.png" width="100" height="100" alt="Marchio"> <h1>Portale Web</h1>
            
            <h2>Accedi</h2>
            <input type="text" id="username" placeholder="Username" name="username" required>
            <input type="password" id="password" placeholder="Password" name="password" required>
            <input type="text" id="nome" placeholder="Nome" name="nome" required>
            <input type="text" id="email" placeholder="E-mail" name="email" required>
            <button type="submit" name="login">Entra</button>
        </form>
    </body>
</html>




register.html

<!DOCTYPE html>
<html>
    <head>
        <link rel="icon" href="images/logo.ico" />
        <title>Registrazione</title>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap">
        <link rel="stylesheet" href="css/style-registrazione.css">
    </head>
    <body>

    

        <form autocomplete="on" method="post" action="php/register.php">
            <h1>Registrazione Utente</h1>

            <input type="text" id="username" placeholder="Username" name="username" maxlength="50" required>
            <input type="password" id="password" placeholder="Password" value="1234" name="password" required>
            <input type="text" id="nome" placeholder="Nome"  name="nome" required>
            <input type="text" id="email" placeholder="E-mail"  name="email" required>

            <button type="submit" name="register">Aggiungi</button>
        </form>
    </body>
</html>




login.php
<?php
session_start();
require_once('database.php');

if (isset($_SESSION['session_id'])) {
    header('Location: dashboard.php');
    exit;
}

if (isset($_POST['login'])) {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    $nome = $_POST['nome'] ?? '';
    $email = $_POST['email'] ?? '';
    
    if (empty($username) || empty($password)|| empty($nome)) {
        $msg = 'Inserisci username e password %s';
    } else {
        $query = "
            SELECT username, password
            FROM users
            WHERE username = :username
        ";
        

        
        $check = $pdo->prepare($query);
        $check->bindParam(':username', $username, PDO::PARAM_STR);
        $check->execute();
        
        $user = $check->fetch(PDO::FETCH_ASSOC);
        
        if (!$user || password_verify($password, $user['password']) === false) {
            $msg = 'Credenziali utente errate %s';
        } else {
            session_regenerate_id();
            $_SESSION['session_id'] = session_id();
            $_SESSION['session_user'] = $user['username'];
            $_SESSION['session_nome'] = $nome['nome'];
            $_SESSION['session_email'] = $email['email'];
            
            header('Location: dashboard.php');
            exit;
        }
    }

    
    printf($msg, '<a href="../login.html">torna indietro</a>');
}



register.php

<?php
require_once('database.php');

if (isset($_POST['register'])) {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    $nome = $_POST['nome'] ?? '';
    $email = $_POST['email'] ?? '';
    $isUsernameValid = filter_var(
        $username,
        FILTER_VALIDATE_REGEXP, [
            "options" => [
                "regexp" => "/^[a-z\d.]{3,20}$/i"
            ]
        ]
    );
    $pwdLenght = mb_strlen($password);
    
    if (empty($username) || empty($password)) {
        $msg = 'Compila tutti i campi %s';
    } elseif (false === $isUsernameValid) {
        $msg = 'Lo username non è valido. Sono ammessi solamente caratteri 
                alfanumerici e l\'underscore. Lunghezza minina 3 caratteri.
                Lunghezza massima 20 caratteri';
    } elseif ($pwdLenght < 3 || $pwdLenght > 20) {
        $msg = 'Lunghezza minima password 3 caratteri.
                Lunghezza massima 20 caratteri';
    } else {
        $password_hash = password_hash($password, PASSWORD_BCRYPT);

        $query = "
            SELECT id
            FROM users
            WHERE username = :username
        ";
        
        $check = $pdo->prepare($query);
        $check->bindParam(':username', $username, PDO::PARAM_STR);
        $check->execute();
        
        $user = $check->fetchAll(PDO::FETCH_ASSOC);
        
        if (count($user) > 0) {
            $msg = 'Username già in uso %s';
        } else {
            $query = "
                INSERT INTO users
                VALUES (0, :username, :password, :nome, :email)
            ";
        
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->bindParam(':password', $password_hash, PDO::PARAM_STR);
            $check->bindParam(':nome', $nome, PDO::PARAM_STR);
            $check->bindParam(':email', $email, PDO::PARAM_STR);
            $check->execute();
            
            if ($check->rowCount() > 0) {
                $msg = 'Registrazione eseguita con successo <a href="../login.html">Vai alla Pagina di accesso</a> <a href="../register.html">Registra un altro Utente</a>';
            } else {
                $msg = 'Problemi con l\'inserimento dei dati %s';
            }
        }
    }
    
    printf($msg, '<a href="../register.html">torna indietro</a>');
}



dashboard.php

<?php
session_start();

if (isset($_SESSION['session_id'])) 
{ 	$session_user = htmlspecialchars($_SESSION['session_user'], ENT_QUOTES, 'UTF-8');
	$session_id = htmlspecialchars($_SESSION['session_id']);
    $session_nome = htmlspecialchars($_SESSION['session_nome']);    
    $session_email = htmlspecialchars($_SESSION['session_email']);
    
    printf("Benvenuto %s (%s), il tuo session ID è %s. E-mail: %s", $session_nome, $session_user, $session_id, $email);
    echo "<br>";
    printf("%s", '<a href="logout.php">logout</a>');
echo "<br>";
echo "<br>";
 

} else {
    printf("Effettua il %s per accedere all'area riservata", '<a href="../login.html">login</a>');

}


?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<link rel="stylesheet" type="text/css" href="../css/style1.css"> 

<title> Dashboard <?= $session_user ?></title>
<h2> Benvenuto <?= $session_nome ?></h2> 
<h3> questa è la tua mail: <?= $session_email ?></h3> 
</head>

</html>




se può servire
database.php

<?php
$config = [
    'db_engine' => 'mysql',
    'db_host' => 'ftp.xxxxx',
    'db_name' => 'my_arrigo',
    'db_user' => 'xxxxx',
    'db_password' => 'xxxxxxxxx',
];

$db_config = $config['db_engine'] . ":host=".$config['db_host'] . ";dbname=" . $config['db_name'];

try {
    $pdo = new PDO($db_config, $config['db_user'], $config['db_password'], [
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
    ]);
        
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
    exit("Impossibile connettersi al database: " . $e->getMessage());
}

Ho cercato ma non mi è sembrato che sia stata aperta una discussione sullo stesso argomento.

Vi ringrazio in anticipo per il vostro tempo dedicato.

Davide

17 Risposte

  • Re: Variabile session_id riporta solo un carattere

    Session_start() funziona da creazione o aggiornamento sessione http (poi più in la fù pensato di non dare errore se la connessione è già attiva).
    Teoricamente apri la sessione poi scrivi la tua variabile $_SESSION se non chiamato esplicitamente session_write_close verrà chiamato al termine dello script, questo ti consente di salvare il contenuto di quella variabile nel tuo file di sessione.
    Ricorda dopo aver chiamato session_write_close la connessione è su none (leggi session_status su php.net) però sarà comunque presente la variabile globale $_SESSION invece a te interessa solo quando la connessione è attiva, per quell'id poiché da php 7.1 la variabile $_SESSION non è più inizializzata se la connessione non è attiva.
    Per compatibilità utilizza sempre la sintassi estesa, su htmlentities usa sempre anche il terzo parametro
    $enconding UTF-8.
    <?php
    error_reporting(-1);
    ini_set('display_startup_errors', '1');
    ini_set('display_error', '1');
    ini_set('output_buffering', '0');
    //Cattivo esempio
    echo '<html>';
    session_start();
    Non deve esistere output prima della chiamata di session_start indipendentemente se nel php.ini è impostato o no session.use_cookie session.use_only_cookie.
    A volte purtroppo PDO UTF-8 (anche con php 7.3 etc) non funziona su php codice legacy, si ricorre all'uso di mysqli_set_charset e SET NAMES (se la collaction è conforme), SET NAMES è innocuo poiché chiamato dopo mysqli_set_charset altrimenti SET NAMES ti apre buchi nella sicurezza per il confronto dei tuoi caratteri inerente allo stesso database. Vedi tu se è più importante la sicurezza o usare PDO.
    Segue un'esempio.
    <?php
    //>=php 5.3.6 o comunque se MYSQL_ATTR_INIT_COMMAND non esiste come costante oppure non ha la patch necessaria.
    try {
         header('Content-type: text/plain; charset=utf-8');
        $user = '';
        $pass ='';
        $db = 'my_nick';
        $dbh = new PDO("mysql:host=localhost;dbname=$db;charset=utf8",$user, $pass,array (PDO::MYSQL_ATTR_INIT_COMMAND => "SET character_set_client = 'utf8',character_set_connection = 'utf8',character_set_results = 'utf8',COLLATE = 'utf8_unicode_ci'"));
    //$dbh->query('SET CHARACTER SET utf8');
        $dbh->exec("CREATE TABLE IF NOT EXISTS `$db`.`tabella2` (
        `campo` varchar(4) NOT NULL
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8");
        foreach($dbh->query("show variables like 'character\_set\_%'",PDO::FETCH_ASSOC) as $conf) {
            print_r($conf);
        }
        $dbh = null;
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "\n";
        die();
    }
    ?>
    se php non usa la patch non potrà utilizzare utf8, ergo codice php legacy.
    https://www.php.net/manual/en/pdo.prepared-statements.php
  • Re: Variabile session_id riporta solo un carattere

    Grazie mille per la tua risposta.

    Purtroppo non ne capisco tanto, perchè ho appena iniziato.

    Pensavo che il mio problema era molto più semplice siccome si vedeva la prima lettera, ora tu mi hai aperto un mondo troppo grande ...

    e non ho capito tanto ti sono sincero....
  • Re: Variabile session_id riporta solo un carattere

    Puoi provare da un browser diverso in modalità nascosta senza sessione, solo la query al database? (Giustamente quella con l'istruzione preparata e per utente esistente).
    Comunque la regex per il nome dovrebbe essere almeno un carattere da a-z e/o A-Z dopo è ammesso anche numeri? Nient'altro? Bene ti costruisco la regex dopo la tua conferma.
  • Re: Variabile session_id riporta solo un carattere

    Ho provato ti allego schermata. si grazie per la regex a-z / A-Z / e numeri.


    ti spiego:
    Prima si procede con la registrazione dell'Utente dove chiede nome user password e e-mail.

    Poi per accedere si va nella pagina login e ora si inserisce di nuovo mail e nome però vorrei togliere e-mail e nome e quando entra con solo nome utente e password nella pagina di destinazione io possa richiamare il nome e la e-mail es. Buongiorno Mario Rossi

    Poi avrei bisogno anche di questo aiuto....
  • Re: Variabile session_id riporta solo un carattere

    Si ho capito, ma devo capire una cosa.
    database.php
    <?php
    $config = [
        'db_engine' => 'mysql',
        'db_host' => 'ftp.xxxxx',
        'db_name' => 'my_arrigo',
        'db_user' => 'xxxxx',
        'db_password' => 'xxxxxxxxx',
    ];
    
    $db_config = $config['db_engine'] . ":host=".$config['db_host'] . ";dbname=" . $config['db_name'];
    
    try {
        $pdo = new PDO($db_config, $config['db_user'], $config['db_password'], [
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
        ]);
            
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch (PDOException $e) {
        exit("Impossibile connettersi al database: " . $e->getMessage());
    }
    error_reporting(-1);
    ini_set('display_startup_error', '1');
    ini_set('display_error', '1');
    require_once('database.php');
    $username = 'prova';
    $password = 'ciao';
    $nome = 'value';
    $email = 'prova@mail.com';
    $password_hash = password_hash($password, PASSWORD_BCRYPT);
    
            $query = "
                SELECT id
                FROM users
                WHERE username = :username
            ";
            
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
            
            $user = $check->fetchAll(PDO::FETCH_ASSOC);
            
            if (count($user) > 0) {
                $msg = 'Username già in uso %s';
            } else {
                $query = "
                    INSERT INTO users
                    VALUES (0, :username, :password, :nome, :email)
                ";
            
                $check = $pdo->prepare($query);
                $check->bindParam(':username', $username, PDO::PARAM_STR);
                $check->bindParam(':password', $password_hash, PDO::PARAM_STR);
                $check->bindParam(':nome', $nome, PDO::PARAM_STR);
                $check->bindParam(':email', $email, PDO::PARAM_STR);
                $check->execute();
    var_dump($check, $username, $nome, $email);
    }
    Definisci le quattro variabili esistenti (inerente soprattutto a username).
    Buongiorno.
  • Re: Variabile session_id riporta solo un carattere

    Non ho capito dove...
  • Re: Variabile session_id riporta solo un carattere

    Voglio controllare che il problema non risieda nell'istruzione preparata.. altrimenti penserò alla deserilizziazione della variabile $_SESSION.
    Crea pagina test, con modalità incognito la visualizzi.
  • Re: Variabile session_id riporta solo un carattere

    Creo una pagina test.php
    poi quale codice metto?
  • Re: Variabile session_id riporta solo un carattere

    Quello che ho postato sopra.
  • Re: Variabile session_id riporta solo un carattere

    Entrambi?
    o solo quello sotto?


    ho capito
  • Re: Variabile session_id riporta solo un carattere

    Vedo una pagina bianca....

    forse ho sbagliato qualcosa.

    ho fatto:

    creo test.php
    incollo questo codice
    
    <?php
    error_reporting(-1);
    ini_set('display_startup_error', '1');
    ini_set('display_error', '1');
    require_once('database.php');
    $username = 'elisa.pace';
    $password = '1234';
    $nome = 'Elisa Pace';
    $email = 'elisa.pace@me.it';
    $password_hash = password_hash($password, PASSWORD_BCRYPT);
    
            $query = "
                SELECT id
                FROM users
                WHERE username = :username
            ";
            
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
            
            $user = $check->fetchAll(PDO::FETCH_ASSOC);
            
            if (count($user) > 0) {
                $msg = 'Username già in uso %s';
            } else {
                $query = "
                    INSERT INTO users
                    VALUES (0, :username, :password, :nome, :email)
                ";
            
                $check = $pdo->prepare($query);
                $check->bindParam(':username', $username, PDO::PARAM_STR);
                $check->bindParam(':password', $password_hash, PDO::PARAM_STR);
                $check->bindParam(':nome', $nome, PDO::PARAM_STR);
                $check->bindParam(':email', $email, PDO::PARAM_STR);
                $check->execute();
    var_dump($check, $username, $nome, $email);
    }
    ?>
    

    poi creo database.php
    incollo questo codice
    
    <?php
    $config = [
        'db_engine' => 'mysql',
        'db_host' => 'ftp.xxxx',			 //inserisco i dati
        'db_name' => 'my_arrigo',
        'db_user' => 'xxx', 				//inserisco nomeutente
        'db_password' => 'xxxx', 		//inserisco password
    ];
    
    $db_config = $config['db_engine'] . ":host=".$config['db_host'] . ";dbname=" . $config['db_name'];
    
    try {
        $pdo = new PDO($db_config, $config['db_user'], $config['db_password'], [
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
        ]);
            
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch (PDOException $e) {
        exit("Impossibile connettersi al database: " . $e->getMessage());
    }
    ?>
    
    poi in modalita in incognito vado al link e vedo pagina bianca...
  • Re: Variabile session_id riporta solo un carattere

    Non hai sbagliato effettuo il var_dump solo nel caso l'username non esiste già altrimenti se php non incontra errori restituisce pagina bianca.
    Il carattere punto viene trasformato in underscore se è la chiave di un array (non era valido in precedenza)

    Puoi sistemare dashboard.php aggiungendo tutti e tre i parametri?
    $session_user = htmlspecialchars($_SESSION['session_user'], ENT_QUOTES, 'UTF-8');
    	$session_id = htmlspecialchars($_SESSION['session_id'], ENT_QUOTES, 'UTF-8');
        $session_nome = htmlspecialchars($_SESSION['session_nome'], ENT_QUOTES, 'UTF-8');    
        $session_email = htmlspecialchars($_SESSION['session_email'], ENT_QUOTES, 'UTF-8');
    Tu crei la variabile di sessione in login.php a prima vista mi sembra tutto corretto, ci posso lavorare domani. Ciao.
  • Re: Variabile session_id riporta solo un carattere

    Ok ho modificato.

    grazie mille.

    a domani!
  • Re: Variabile session_id riporta solo un carattere

    Ciao prova stampando l'intero var_dump($_SESSION);
    Comunque penso che in login.php devi utilizzare solo l'array $user. Quindi modifica in
    $_SESSION['session_id'] = session_id();
                $_SESSION['session_user'] = $user['username'];
                $_SESSION['session_nome'] = $user['nome'];
                $_SESSION['session_email'] = $user['email'];
    Se ho indovinato poiché esisteva solamente la variabile stringa ma tu chiami array e probabile effettua il casting alla chiave 0 cioè $string = 'string'; poi printf("testo %s", $string['inesistente']);
    Da php 8 emette errore fatale mentre prima notice e trasforma $string[0] // s
Devi accedere o registrarti per scrivere nel forum
17 risposte