Oprettet ons. d. 24. oktober 2012 kl. 18:30:43

gigi1
gigi1 (865 point. Point ude: 325)

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();
}

Skrevet ons. d. 24. oktober 2012 kl. 19:55:00| #1

gigi1
gigi1 (865 point)
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

Skrevet ons. d. 24. oktober 2012 kl. 20:12:39| #2

inteeeL
inteeeL (5.831 point)
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);

Skrevet ons. d. 24. oktober 2012 kl. 20:19:34| #3

gigi1
gigi1 (865 point)
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 {

}

Skrevet ons. d. 24. oktober 2012 kl. 21:04:49| #4

olebole
olebole (216.733 point)
<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>

Skrevet ons. d. 24. oktober 2012 kl. 21:07:12| #5

olebole
olebole (216.733 point)
Den sætter du ind lige efter din execute - og så fetch'er du kun, hvis betingelsen er opfyldt

Skrevet ons. d. 24. oktober 2012 kl. 21:23:37| #6

gigi1
gigi1 (865 point)
Super, tak.

Nu kan jeg vel godt droppe den LIMIT på 1 når jeg har fjernet FOREACH'en ?

Skrevet ons. d. 24. oktober 2012 kl. 22:08:36| #7

olebole
olebole (216.733 point)
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  =)

Skrevet ons. d. 24. oktober 2012 kl. 22:21:16| #8

gigi1
gigi1 (865 point)
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'];

Skrevet ons. d. 24. oktober 2012 kl. 22:48:13| #9

olebole
olebole (216.733 point)
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

Skrevet ons. d. 24. oktober 2012 kl. 23:37:14| #10

gigi1
gigi1 (865 point)
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();

Skrevet ons. d. 24. oktober 2012 kl. 23:48:17| #11

olebole
olebole (216.733 point)
Nej, så er det sikkert fint. Jeg troede, sammenhængen var en anden  =)

Skrevet tor. d. 25. oktober 2012 kl. 17:28:16| #12

gigi1
gigi1 (865 point)
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

Skrevet tor. d. 06. december 2012 kl. 16:26:09| #13

gigi1
gigi1 (865 point)
Smid svar Ole :-)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Hjælp til database kolonne

Oprettet den 22. maj 2013 kl. 17.44
StotheT giver 30 point for svar | Giv et svar »

opret tabel og insert

Oprettet den 22. maj 2013 kl. 14.10
agent_qa giver 60 point for svar | Giv et svar »

WordPress husker stadig gamle stier, efter skift af URL

Oprettet den 22. maj 2013 kl. 14.08
w13 giver 70 point for svar | Giv et svar »

Seneste guides

Slettet
Håndtering af tekstoversættelse i...
Parameteriseret tekstformatering i C#
C++ Historie og Programmering - Del 1







Tips & Tricks fra PC World

Teaser billede

Her er seks Google Labs-funktioner, som du skal slå til med det samme

Gmail Labs giver dig adgang til en masse smarte funktioner, som Googles ingeniører leger med i øjeblikket.


Anmeldelser fra PC World

Teaser billede

Test: Samsung Galaxy S4 er et hit - trods gøglertricks

Kan Samsung beholde førertrøjen i det store Android-race? Galaxy S4 er smækfyldt med innovative funktioner, men også med en del gøgl. Er det for meget? Få vores dom over Samsungs nye topmodel.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du få 1 terabyte gratis plads hos Flickr

Yahoo har relanceret sin fototjeneste Flickr med 1 terabyte gratis plads til brugernes billeder og videoer.


Nyheder fra Computerworld

Teaser billede

Galleri: Her er de vigtigste programmører

Computerhistorien har fra hulkort til JavaScript været drevet frem af mange forskellige typer programmører. Se de vigtigste typer her. Er du en af dem?


IT Kurser
Samarbejdspartnere

Udgiver · © 2013 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger