Avatar billede gigi1 Nybegynder
24. oktober 2012 - 18:30 Der er 13 kommentarer

Hjælp til SESSION med PDO

Hej

Kunne godt bruge lidt hjælp til følgende:

- fjerne foreach da der alligevel kun vil være ét match (brugernavn)
- De ting som er valgt i tabellen skal gemmes i en SESSION så der ikke behøver at hentes fra databasen hver gang siden opdateres. I stedet for at gemme en SESSION variabel pr. kolonne værdi ville det så være smartere at lave det som en classe?

Der skulle selvfølgelig være en if sætning om SESSION er sat. Hvis den ikke er SELECT'es der. Hvis der er gør vi intet.


$username = $_SERVER['REMOTE_USER'];

try {
  $conn = new PDO('mysql:host=$host;dbname=$database', $username, password);
  $stmt = $conn->prepare('SELECT id, username, firstname, lastname, email FROM users WHERE username = :username LIMIT 1');
  $stmt->execute(array('username' => $username));
  $result = $stmt->fetchAll();
  if ( count($result) ) {
    foreach($result as $row) {
    SESSION HER
  }
         
  } else {
    echo 'Adgang nægtet.';
  }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
Avatar billede gigi1 Nybegynder
24. oktober 2012 - 19:55 #1
Ved at benytte fetch() i stedet får jeg nu det ønskede resultat.


$result = $stmt->fetch();
echo $result['username'];


Men nu virker min IF count ikke mere
Avatar billede inteeeL Nybegynder
24. oktober 2012 - 20:12 #2
fetchAll bruges til at samle alle rækker i et array.
fetch henter rækkerne på samme måde som $mysqli->fetch og mysql_fetch_.

Du skal bruge fetch, som du selv fandt frem til. Hvorfor virker din if-statement ikke? Du kan prøve at sætte dette ind i din kode og se, om du får de ønskede data: var_dump($result);
Avatar billede gigi1 Nybegynder
24. oktober 2012 - 20:19 #3
Jeg får resultater hvis jeg echo'er med: var_dump($result);

Hvis jeg angiver et brugernavn i $username som ikke findes i tabellen får jeg bare en blank side.

Ville det være godt nok hvis jeg så bare bruger:


if ($result) {

} else {

}
Avatar billede olebole Juniormester
24. oktober 2012 - 21:04 #4
<ole>

#3: En IF/ELSE er ikke en god løsning, da der kun resuteres FALSE, hvis forspørgslen mislykkes. Brug i stedet:

if ($stmt->rowCount()>0) {

} else {

}

/mvh
</bole>
Avatar billede olebole Juniormester
24. oktober 2012 - 21:07 #5
Den sætter du ind lige efter din execute - og så fetch'er du kun, hvis betingelsen er opfyldt
Avatar billede gigi1 Nybegynder
24. oktober 2012 - 21:23 #6
Super, tak.

Nu kan jeg vel godt droppe den LIMIT på 1 når jeg har fjernet FOREACH'en ?
Avatar billede olebole Juniormester
24. oktober 2012 - 22:08 #7
Nej, det ville ikke være klogt. Databasen ved jo ikke, hvormange rækker, du ønsker at finde - så den leder videre, når den har fundet den første (og eneste). Det er der ingen grund til, så lad bare LIMIT forblive i SQL'en  =)
Avatar billede gigi1 Nybegynder
24. oktober 2012 - 22:21 #8
Ahh I see.

Jeg har tilføjet ændringerne. Hvad synes du om min session løsning?


$username = $_SERVER['REMOTE_USER'];

if (empty($_SESSION['username'])) {

try {
  $conn = new PDO('mysql:host=$host;dbname=$database', $username, password);
  $stmt = $conn->prepare('SELECT id, username, firstname, lastname, email FROM users WHERE username = :username LIMIT 1');
  $stmt->execute(array('username' => $username));
 
  if ($stmt->rowCount() > 0) {
  $result = $stmt->fetch);
 
        $_SESSION['username'] = $result['username'];
        $_SESSION['firstname'] = $result['firstname'];
      $_SESSION['lastname'] = $result['lastname'];
         
  } else {
    echo 'Adgang nægtet.';
    die();
  }
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
}
}
echo  'Velkommen, . ' ' . $_SESSION['username'];
Avatar billede olebole Juniormester
24. oktober 2012 - 22:48 #9
Jo, det ser vel rigtig nok ud, men du bør foretage dig noget meget drastisk, hvis ikke der findes en række med brugernavnet. Ikke bare nøjes med en echo og die.

Hvis ikke $_SERVER['REMOTE_USER'] er tom, er det lykkedes brugeren at slippe gennem en HTTP-autentifikation. Altså er der noget rystende galt, hvis han ikke findes i databasen!

I så fald bør brugerens IP øjeblikkelig bannes - og serveren bør sende dig en sms eller i det mindste en mail, så du kan tage dine forholdsregler
Avatar billede gigi1 Nybegynder
24. oktober 2012 - 23:37 #10
Siden vil kun være tilgængelig internt.
$_SERVER['REMOTE_USER']  kigger på den domæne bruger som der er logget på Windows computeren. Jeg laver også en funktion som tjekker om det er det rigtige domæne som brugeren kommer fra. Kan det gøres mere sikkert i programmeringen ? brugeren som ikke findes i databasen kan jo ikke se det som kommer efter die();
Avatar billede olebole Juniormester
24. oktober 2012 - 23:48 #11
Nej, så er det sikkert fint. Jeg troede, sammenhængen var en anden  =)
Avatar billede gigi1 Nybegynder
25. oktober 2012 - 17:28 #12
Okay, det plejer det jo også at være =)

Kan man gøre noget smartere end die() ?

Så skulle jeg først tjekke om der ER en SESSION og så vise det beskyttede indhold og hvis der ikke var hente fra databasen og hvis brugeren ikke findes der udskrive adgangs nægtet uden die() da det var ELSE
Avatar billede gigi1 Nybegynder
06. december 2012 - 16:26 #13
Smid svar Ole :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester