Goeiedag iedereen,

Ik ben de ontwerper van een online game die gebruikt maakt van sqlite.
Nu ben ik gestart met PHP om een UCP te maken.
Dit gaat tot nu toe goed en dus heb ik een simpel login formuliertje gemaakt.
In het script worden na het inloggen de goede data getoond.
Het probleem is eigenlijk dat als je weer naar de home pagina gaat waar ook de staat worden laten gezien, dat er niks word laat gezien. En ik denk dat dit komt omdat het script niet weet waar het de data vandaan moet halen.
Nu vraag ik me af, kan ik niet de gebruikersnaam in een soort tijdelijke array opslaan en vandaar ophalen?(zo werkt dat in de code waar ik de game mee ontwerp ook.) En als dit mogelijk is? Hoe doe ik dit dan?

Mocht het nodig zijn is hier de pagina login.php:

<?php
error_reporting(E_ALL);
class MyDB extends SQLite3
{
function __construct()
{
$this->open('LARPSERVER/scriptfiles/Data/database/testdatabase.db');
}
}
$db = new MyDB() or die ("Unable to open");


$sql = 'SELECT * FROM USERS WHERE MAIL="'.$_POST["MAIL"].'" AND PASSWORD="'.$_POST["PASSWORD"].'"';

$stmt = $db->query($sql);
while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
{
$email_address = $row["MAIL"];
$password = $row["PASSWORD"];
if($password==$_POST["PASSWORD"])
{

echo "<h1>Logged In</h1>";
echo "ID = ". $row['ID'] . "<br>";
echo "NAME = ". $row['NAME'] . "<br>";
echo "USERNAME = ". $row['USERNAME'] . "<br>";
echo "MAIL = ". $row['MAIL'] . "<br>";
}
}
while(!$row = $stmt->fetchArray(SQLITE3_ASSOC) )
{
header("Location: login_fail.html");
exit("Try again.");
}

$db->close();

?>
Bedankt voor jullie reacties.
@Thomas dat viel mij ook al op. Dat is wel een minpunt.

Ik heb nu deze code maar de volgende error:

Fatal error: Call to undefined function escapeString() in D:\AppServ\www\ucp\login.php on line 9

Ik denk dat ik de functie verkeerd gebruik.

code:

<?php
 error_reporting(E_ALL);
 
 $db = new MyDB() or die ("Unable to open");
 $postmd5pass = $_POST["PASSWORD"];
 $postmd5pass = md5($postmd5pass); 
 $postmail = $_POST["MAIL"]; 
 escapeString($postmd5pass);
 escapeString($postmail);
 $sql = "SELECT * FROM USERS WHERE MAIL='$postmail' AND PASSWORD='$postmd5pass'"; 

 $stmt = $db->query($sql);                       
 while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {                                                                          
      $email_address = $row["MAIL"];   
      $password = $row["PASSWORD"]; 
      $l_mail = $row["MAIL"];   
      $l_name = $row["NAME"];
      $l_username = $row["USERNAME"];
      $l_id = $row["ID"];
      if($password==$postmd5pass)
      {
         
         echo "Succesfully logged in!.<br><br><a href='index.php' class='btn btn-info'>Continue</a>";                             
         $_SESSION['loggedin_user']= $l_username;
         $_SESSION['loggedin_mail']= $l_mail;
         $_SESSION['loggedin_name']= $l_name;
         $_SESSION['loggedin_id']= $l_id;
      }
 } 
 while(!$row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {
        include"login_fail.php";  
        include"loginform.php";                        
 }
 

?>
Ik zou eens $db->escapeString(...) proberen.

Een paar tips:
- Gebruik geen md5() meer, omdat die zeer zwak is, en gebruik bij sterke voorkeur: password_hash() en password_verify()
- Het is niet nodig om op lijn 15 t/m 20 variabelen te kopiëren.
- Sla alleen een userID op in een sessie. Waarom zou je een mailadres of een naam nodig hebben?
Tevens:
- ververs de pagina met een header()
- voer een session_regenerate_id() uit als je inlogt, dit is een state change
- combineer geen serverside/clientside zooi: eerst een echo en dan dingen die je wegschrijft naar de sessie? Hoe werkt dat dan? :/
Bedankt voor de tips. Ik heb mijn code aangepast naar jullie tips.
Echt een behulpzame plek hier:)

Nu probeer ik in-game reports te laten zien en dat werkt prima.
Ik heb dan boven aan de page een stukje code die het admin level zou moeten nakijken.
Echter hier gaat wat mis:


<?php
if(isset($_SESSION['loggedin_id'])){   
 $dbget_id = $_SESSION["loggedin_id"];   
 }
 
$sql_prep = "SELECT * FROM USERS WHERE ID='$dbget_id'"; 
$stmt = $db->query($sql_prep);
$adminlevel = $row['ADMINLEVEL'];

if($adminlevel <= 1)
{
    exit( "Hello there, ". $row['NAME'] . "!<br>You are unauthorized to visit this page."); 
}


?> 


Als ik mij niet vergis betekend dit; if($adminlevel <= 1). als admin level kleiner dan 1 is.
Nu is het admin level 6 en toch laat hij me deze melding zien. Wat doe ik fout?

Edit:
deze code doet het hem wel maar er zijn bepaalde functies die bijv een admin level van 3 nodig hebben. Dat lukt niet hiermee:


if(!$adminlevel == 0)
{
    exit( "Hello there, ". $row['NAME'] . "!<br>You are unauthorized to visit this page."); 
}
Waar komt $row vandaan? Zo te zien mis je nog het fetchen van je data uit je result.
- Ariën - op 22/02/2018 13:30:05

Waar komt $row vandaan? Zo te zien mis je nog het fetchen van je data uit je result.


Inderdaad, je hebt gelijk.
Stom foutje van me.
Dit werkt:
while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
 {    
    $adminlevel = $row['ADMINLEVEL'];
    if($adminlevel <= 1)
    {
        exit( "Hello there, ". $row['NAME'] . "!<br>You are unauthorized to visit this page."); 
    }
 } 
Persoonlijk zou ik geen exit() of die() gebruiken omdat je script niet hoeft te worden afgebroken. Ook niet in het geval als iemand geen juiste rechten heeft. Handel het gewoon af met een nette foutmelding in een 'if-else'-statement.
- Ariën - op 22/02/2018 14:48:01

Persoonlijk zou ik geen exit() of die() gebruiken omdat je script niet hoeft te worden afgebroken. Ook niet in het geval als iemand geen juiste rechten heeft. Handel het gewoon af met een nette foutmelding in een 'if-else'-statement.


Dat heb ik gedaan, maar als ik geen exit() gebruik spamt hij de echo (foutmelding) 100 x over de pagina.
Dan moet je goede afhandeling met if-else inbouwen.
Desnoods kan je ook een functie/method maken die foutmeldingen in een net HTML-document toont. Exceptions zouden al heel handig zijn hiervoor.
- Ariën - op 22/02/2018 14:50:54

Dan moet je goede afhandeling met if-else inbouwen.
Desnoods kan je ook een functie/method maken die foutmeldingen in een net HTML-document toont.


sorry ik volg je even niet.
Heb je misschien een voorbeeldje van de juiste afhandeling?

Edit: had de link nog niet gezien.

Reageren