session di accesso distrutta dopo l'aggiornamento

Ho creato uno script di accesso con qualche aiuto di Google, ma il problema è che each volta che aggiorno la pagina viene disconnesso e reindirizzato alla pagina di accesso. Quindi fondamentalmente voglio che un utente abbia effettuato l'accesso dopo aver inserito i suoi dettagli e non si sia disconnesso dopo un singolo aggiornamento. il mio codice è:

<?php if(!isset($_SESSION)){ session_start(); } $username = mysqli_real_escape_string($con, $_POST['username']); $password = mysqli_real_escape_string($con, $_POST['password']); if ($username && $password) { $result = mysqli_query($con, "SELECT * FROM admin WHERE username='$username' "); $numrows = mysqli_num_rows($result); if($numrows !=0) { while($row = mysqli_fetch_assoc($result)) { $dbusername = $row["username"]; $dbpassword = $row["password"]; } if($username==$dbusername && $password==$dbpassword) { $_SESSION['username'] = $dbusername; } else echo "Incorrect Password"; } else header("location: login.php"); } else header("location: login.php"); ?> 

mysqli_real_escape_string() RICHIEDE di avere una connessione triggers / stabilita al DB. Dato che stai facendo la chiamata a m_r_e_s() PRIMA di connetterti, devi semplicemente recuperare FALSE boolean per indicare il fallimento. Quindi stai rovinando i tuoi valori "quotati".

I falsi valori booleani inseriti in una string vengono convertiti in stringhe vuote, quindi le query iniziano ad apparire simili

 SELECT ... WHERE username='' ^---see the boolean false in there? 

La sequenza del codice dovrebbe essere:

 session_start(); connect_to_db(); prepare_variables(); do_query(); 

E dal momento che stai usando mysqli, perché stai comunque sfuggendo manualmente alle variables? Potresti semplicemente usare una dichiarazione preparata + segnaposto e bypassare completamente il problema.

PUNTO DI APPRENDIMENTO N. 1: SESSIONI

Ecco alcuni punti di apprendimento per te riguardo alle sessioni e su come usarle in modo efficiente ed efficace. Si noti che il problema con il proprio codice è che si sta chiedendo se è stata impostata una session prima di call l'inizio della session, quindi $ _SESSION superglobale non è disponibile e quindi l'istruzione logica restituisce sempre false, tranne quando si chiama inizio session in accesso, where si non dovrei mai call l'inizio della session comunque. Chiama la session di avvio 1 volta in un file di configuration (assicurati di includere questo file in tutte le "viste / pagine", quindi puoi verificare se una session è impostata come normale. Leggi questo codice con molta attenzione e cerca di capire tutto ciò che sta facendo in modo da poter sfruttare la potenza offerta dalle sessioni di php.

aggiungi a login.php

 //upon successful validation of login. //create an object to store basic user information in. $user = (object) ['username'=>$username,'hash_password'=>$password,'group'=>$usergroup,'site_secret'=>$secret];//your user object $_SESSION['user'] = $user;//store the object in the users session. 

aggiungi al tuo config.php o qualsiasi file incluso in tutte le pagine

 GLOBAL const static $secret = (string)'someUltraSecretStringThatIsDifficultToGuess';//your site wide secret.(you should probably add this to your config file instead of the login. session_start(); //you have to call session start or you don't have access to $_SESSION superglobal, //regardless of a user being logged in or logged out they have a session. //as a programmer it is your job to figure out how to store data in the session if(isset($_SESSION['user']) && is_object($_SESSION['user']) && $_SESSION['user']->site_secret == $secret) { $loggedInUser = $_SESSION['user'];//if an authenticaed user session is set and is an object and contains our site secret, we assign the $loggedInUser variable to it. so we can call this variable instead of calling the session ad nauseum in our code. } 

ora nei tuoi file per verificare se un utente è loggato

 if($loggedInUser !== null && is_object($loggedInUser) && $loggedInUser->site_secret = $secret) { //user is logged in. no reason to even call the database at this point, unless there is extra information you need. //if said information is going to be accessed on multiple pages, its probably wise to include it in the object when you create it during the login process. don't store overly sensitive //information in the object in any circumstance. things like credit card numbers, plain text passwords, security questions are big no nos. } 

ora se hai bisogno di call questo object dall'interno della function ci sono due modi

 //pass by reference function foo($loggedInUser) { //your object is available here because you passed by reference! //you can check if a user is loggedIn from within functions now without a single call to the database! } //pass with global language feature. function bar() { global $loggedInUser; //object is available here through usage of global directive. nifty eh? } 

altre considerazioni

considerare l'aggiunta di una properties; segreta in tutto il sito all'object loggedInUser e verificare la presenza di questo segreto per identificare una session valida. è ansible creare una variabile denominata $ loggedInUser se un utente non ha effettuato l'accesso passando una richiesta get malformata. le probabilità sono che l'attaccante non sarà in grado di indovinare il tuo sito segreto però. un esempio di questo segreto in tutto il sito è mostrato nel primo esempio.

PUNTO DI APPRENDIMENTO N. 2: Un corso intensivo su Mysqli orientato agli oggetti

creando l'object di connessione.

 $mysqli = new mysqli("db-host","db-username","db-password","db-name"); 

impostazione del set di caratteri

 //since your object is already created, you can now set a property on the object $mysqli->set_charset("utf8");//set it to whatever the collation of your database is. //side note: you should user utf_unicode_ci in your database and utf8 in php. 

eseguire una query

 $query = $mysqli->query("SELECT column1,column2,column3 FROM table1 WHERE 1 LIMIT 30"); //getting number of rows $num_rows = $query->num_rows;//your mysqli object has morphed into $query at this point. //working with the result set if($num_rows > 0) { while($row = $query->fetch_assoc()) { echo '<li>'.$row["column1"].' | '.$row["column2"].' | '.$row["column3"].'</li>'; } $query->close();//optionally close the query object NOTE: the $mysqli object is still open $query->free();//optionally free the result set } //when you are done with your $mysqli object close the connection $mysqli->close(); 

istruzioni preparate: un'alternativa ai valori di escape manualmente

 $stmt = $mysqli->prepare("SELECT column1,column2,column3 FROM table1 WHERE column4 = ? column5 = ? and column6 = ?");//prepare our query. //now we need to assign our variables to the question marks in the statement above in the correct order. // s represents string, d represents double and i represents an integer. $stmt->bind_param('sdi',$column4,$column5,$column6);//for illustrative purposes i name the variables the same as the column they correspond to so you can understand. //now that we have bound our parameters to our statement wehave to execute it. if it doens't execute there is an error in our query or binding parameters if($stmt->execute()) { //now we have two ways we can work with this result set. i am only going to show you what i consider the best way, `bind_result(). $stmt->bind_result($column1,$column2,$column3);//binds in the same order of our columns. if($stmt->num_rows > 0) { //great, our query returned a result! lets work with this data now while($stmt->fetch()) { echo '<li>'.$column1.' | '.$column2.' | '.$column3.'</li>';//we prent each row of our result. easy peasy } $stmt->close();//no need to free the result, as it is not stored by default. } //if there were no results, no need to close stmt as it was automatically closed by default. }