Innlogging, database og sessions i PHP

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009

I forbindelse med medlemsside. Så ønsker jeg å inkludere diverse informasjon fra databasen.

Eksempel:

Sideoverskriften m/ "Velkommen <navn fra database>"

relevant medlemsinfo i en kolonne en annen vei (fra databasen)

samt annen informasjon, hentet fra en database.

 

Da oppretter jeg ett dokument, i .php. Så setter jeg opp strukturen i m/HTML og CSS (div's) og inkludere php  for å hente riktig info fra databasen.

Eksempelvis:

<div id="page_heading">Velkommen <?php (hente navn fra database) ?></div>
<div id="member_info"><?php (hente medlemsinfo fra database) ?></div>
<div id="member_pic"><?php (hente medlemsbilde fra database) ?></div>

Er det noe sånt man bygger opp en side med PHP og MySQL database?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Godt tenkt

Ja, dette er godt tenkt. Du kan godt gjøre det slik, men jeg ville ikke lagret selve bildet i databasen, kun path til stedet der det ligger. F.eks. "/profilbilder/medlem-22.jpg".

Ett tips vil jeg komme med: Forsøk også å holde antall queryer til et minimum, gjerne én query. Da vil sidene dine laste raskere enn om man må kjøre et titalls spørringer mot databasen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Hovedspørring i toppen av PHP dokument?

Altså, lage en hoved spørring da, i "toppen" av siden.

Og så hente ut den aktuelle informasjonen nedover siden der det trengs mener du?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
SQL query i toppen

Jepp, akkurat. Da slipper du å lage masse queryer som du må loope gjennom osv for hver gang. Skal du lagre informasjon på spesielle brukere over flere tabeller kan du også bruke join for å hente ut data til den aktuelle brukeren ved hjelp av flere tabeller. Huff, må få laget noen videoguider i MySQL, tror jeg.

Hvis du kun skal hente ett record, så er det også unødvendig å loope gjennom. Da har du jo bare ett resultat. Ergo kan du bare bruke:

<?php
$data
= mysql_fetch_assoc($result);
?>

Og vips, nå inneholder $data arrayen det ene recordet.

Videre lenger ned på siden holder det da med HTML alene, og så bare legge inn variabler med PHP slik:

<div id="brukernavn"><?php print $data['user_name'] ?></div>

Det er jo både enklere å lese for deg og mer elegant. :)

PS: Somregel pleier man å bygge queryer med masse if, elseif og else statements nedover. Så hente innhold, og deretter printe innholdet.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Lage strukturen i PHP dokumentet

Da fikk jeg det til mener jeg på... Så, på denne måten kan jeg bygge opp strukturen som jeg ønsker, for så å hente inn den informasjonen fra databasen til det aktuelle området på siden...

men, jeg må inkludere

<?php
if(mysql_num_rows($result)==1) { print 'hva jeg vil'; }
else
'';
?>

i hver <div> for at det ikke skal stå noe der når en bruker prøver... For ellers kommer jo "Velkommen" frem, uansett om du har lykkes eller ikke i å logge inn...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Sessions

Dette er grunnen til at man bruker sessions. Man skal ikke ha tilgang til de websidene med mindre man er logget inn. Dessuten kan sessionen inneholde brukeriden til den aktuelle brukeren, slik at det er enkelt å hente ut informasjon fra databasen om den aktuelle brukeren.

Prøve sessions i PHP

Opprett to filer, "sett-session.php" og "vis-session.php".

sett-sessions.php

<?php
session_start
();
$_SESSION['user_id'] = 1301;
$_SESSION['user_name'] = 'Ola Dunk';
?>

vis-session.php

<?php
session_start
();
if(
$_SESSION) {
  print
'#' . $_SESSION['user_id'] . ' ' . $_SESSION['user_name'];
} else {
  print
'Error';
}
?>

Prøv dette:

  1. gå til vis-session.php
  2. gå til sett-sessions.php, så til vis-session.php.

Ser du poenget?

Kort om sessions i PHP

Merk at ingenting kan sendes til browseren før du har initiert:

<?php
session_start
();
?>

Du kan kun starte sessions så lenge det ikke er sendt output til nettleseren.

Her har jeg laget identiske filer og zippet dem, last opp disse. Last ned script med sessions i PHP.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Sessions scriptet

Fikk ikke noen feilmeldig da. Fikk opp det " #1301 Ola Dunk " på vis-session.php da

Den andre kom det ikke opp noe som helst...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Innlogging med sessions

Ja, ser du hvordan variablene lagres av sett-sessions.php og hentes ut av vis-session.php? Det er hele poenget, at man kan sette variabler i ett dokument, og at de er tilgjengelig i et annet.

Med andre ord kan du:

  1. La brukere logge på
  2. Sjekke brukernavn og passord
  3. Sette sessions hvis de er registrert
  4. Beskytte medlemssider for de som har satt sessions

Med andre ord kan man gjøre slik at kun innloggede har tilgang til medlemssidene.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
$_SESSION

ja, ser at man lagerer en gitt informasjon i $_SESSION

Og at man kan henter den "lagrede" infoen ut igjen via if($_SESSiON) (hvordan skjønnet jeg ikke da)

Også att hvis man ikke har klikket på sett-session.php. først, Så får man error.  Hvordan de kommuniserer skjønte jeg ikke helt.

Sjønte heller ikke hvordan jeg kan bruke disse i forbindelse med login da user_id og user_name er satt...

Prøvde å lese litt på w3schools (var for tynt til å sjønne det) og på http://no.php.net/manual/en/function.session-start.php (men ble for innviklet syns jeg)...

Kjenner du til noen annen side som forteller det noe bedre enn disse 2, med litt eksempler etc.

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Forklaring og bruk av sessions i login system

Du kan egentlig nok til å bruke disse nå, siden du ser hvordan det fungerer.

Overfladisk forklart sier session_start() egentlig bare ifra om at her er det sessions.

Sessions lagres ofte i filer på webserveren, og for at et sett med session variabler skal være tilgjengelige for en bruker settes også en cookie i nettleseren hans.

Ved å bruke session_start() i begynnelsen av scriptet vil nettleseren sende informasjon om den satte cookien i nettleseren til brukeren, og deretter vil webserveren se om det finnes noen satte session variabler (i $_SESSION arrayen).

Her er et enkelt eksempel:

<?php
// Sjekker brukernavn og pass
$sql = sprintf('
  SELECT * FROM users
    WHERE user_name = \'%s\'
      AND pass = PASSWORD(\'%s\')'
,
 
mysql_real_escape_string($_POST['user_name'])
 
mysql_real_escape_string($_POST['pass']));

$res = mysql_query($sql, $db_connection) or die(mysql_error());

// Ser om det var noen brukere
if(mysql_num_rows($res) == 1) {
 
// Starter session
 
session_start();
 
// Setter session variabler
 
$_SESSION['logged_in'] = true;

 
// Videresender bruker
 
header('Location: http://domene.com/medlemsside.php');
} else {
  print
'Feil brukernavn eller passord';
}
?>

Deretter lager man medlemsside.php som begynner med nettopp session_start()

<?php
session_start
();
if(
$_SESSION['logged_in']) {
?>

Du er logget inn.
<?php } else { ?>
Du har ikke tilgang til denne websiden.
<?php } ?>
ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Websiden med innlogging

Sånn ser jo skjemaet mitt ut idag...

<?php
if($_POST) {
require(
'/path/to/db-access.php');
 
$query = sprintf(
   
'SELECT * FROM user_table
      WHERE user_id = \'%d\
      AND member_name = \'%s\''
,
       
mysql_real_escape_string($_POST['user_id']),
       
mysql_real_escape_string($_POST['user_pass'])
  );
 
$result = mysql_query($query, $db_connection) or die(mysql_error());
 
$data = mysql_fetch_assoc($result);
} else {
  print
'<p>Du er ikke innlogget</p>';
  print
'Gå til ' . '<a href="http://www.ekbedriften.no/eke_member_area/index.html">' . 'Logg inn' . '</a>' . ' siden for å logge inn';
}
?>

<html>
<head>

Det er jo en smule anderledes.

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Bruke sessions?

Ja, da blir det jo opp til deg om du vil endre det for å ta ibruk sessions eller ei?

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Hva er anbefalt på medlemssider?

ja, altså, jeg vil gjøre det som er mest fleksibelt i fremtiden. Skal jo opp ganske mange medlemssider...

Blandt annet ønsker jeg muligheten for at de kan opprette egne brukerprofiler etc. Så da er det vel sessons() som er å anbefale?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Sessions er best for login-systemer.

Så absolutt, så absolutt. Sessions er veien å gå. Hvis folk logger inn ved hjelp av sessions, så kan de gå bort fra websiden, komme tilbake igjen og fortsatt være innlogget.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Database

men, hvordan blir det hele egentlig da?

mener, if($_POST) må jeg vel fortsatt starte med?

Og require() må jeg vel fortsatt ha med for å få tilgang til databasen?

Ser at noen betegnelser er byttet ut. so at $query = sprintf er byttet ut med $sql = sprintf

og at $result = mysql_query($query...) er byttet ut med $res = mysql_query($sql...)

Og så kommer if'en med session...

Da blir det 2 if'er etterhverandre da:

if($_POST) og if(mysql_num_rows($res)==1){...}

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Scriptet ditt

Det er jo ikke meg som skal kode systemet ditt, jeg bare hjelper deg, jeg. Målet mitt er at du skal forstå dette, ikke at du skal klippe og lime det jeg koder slik at det fungerer. Det lærer du jo nada, zip og snatt av.

Jeg bytter bare navn på variabler, for det er jo bare variabler. Håper du vet at variabler kan kalles hva man vil, hvis ikke så er du i alle fall langt fra stødig nok i PHP til å begynne med disse tingene nå.

Og, ja. Du må hente inn databasetilkoblingen ved hjelp av require(). De tingene jeg viser ovenfor er jo bare eksempler, og de inneholder bare de tingene jeg forsøker å vise deg, ikke ting du allerede kan.

Struktur på innlogging

Du må jo velge selv hvordan du vil gjøre dette, men én metode er å bruke action-attributten i <form> for å videresende til f.eks. "auth.php" som ikke skriver noe til skjermen, men bare yter følgende funksjon:

  1. Ser om brukeren har logget inn med korrekte detaljer. Hvis ja, så setter den sessions og videresender til medlemssidene.
  2. Hvis brukeren ikke har skrevet inn riktig passord, kan "auth.php" sende tilbake til innloggingssiden.

I såfall vil jo if($_POST) befinne seg i "auth.php", ikke noe annet sted. Det er heller ingenting i veien for å ha flere if etter hverandre.

<?php
$nasse
= 'Pingle';
$ole_brum = 'Søt';

if(
$nasse == 'Pingle') { print 'Nasse er pinglete!'; }
if(
$ole_brum == 'Søt') { print 'Herlige brummebassen!'; }
?>

Planlegging av script

Målet ditt er å tenke gjennom hva du gjør i de forskjellige tilfellene. Hva skal skje når?

Hvis jeg skal lage intrikate systemer, så setter jeg meg ned med et ark og en penn, så tegner jeg ruter av hvordan brukeren skal dirigeres mellom forskjellige ting.

Deretter begynner løsningen å åpenbare seg... Mulig dette er fordi jeg er av den visuelle typen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
jaja, kjenne til php

jaja, kjenne til php variabler etc. og at man kan navne dem som man ønsker og sette hvilke som helst values man ønsker og referere til de for å printe det ut, hente inn, etc.

Det er igrunnen bare det med session jeg ikke har fott til å sitte...

For, man kan jo eks. vis benytte seg av adresselinjen og bare skrive ekbedriften.no/medlemsområde/hemmeligside1.html for å gå direkte til den siden, hvis man kjenner til den, kansje. Og da regnet jeg med at man måtte bruke en form for session/funksjon som skjekket om denne brukeren faktisk hadde logget inn. Hvis ikke, så bli redirected til logginn.html eks...

 

Men må si du har vert evig tolmodig og hjelpsom da:) Ikke alle som er det...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Tålmodighet er en dyd

Det er nettopp derfor man ønsker å bruke en sessions. En sessionvariabel er jo ikke noe annereledes enn en annen variabel/array. Det eneste er at den kan defineres én gang og være tilgjengelig fra flere sider uten at man trenger å sette den på nytt.

Måten du skisserer ovenfor fungerer jo bra, så da er jo idéen der, og nå er det kun kodingen som gjenstår. :)

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
helt sant...lur idè btw, å

helt sant...

lur idè btw, å skissere opp hvordan man ønsker ting skal skje...

Skal teste det litt, så får man en oversikt ;)

med hilsen
Thomas Kile

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Fått til sessions nå

Fått til sessions nå da... Eneste jeg ikke får til, er å hente informasjon fra databasen fra de aktuelle sidene... Eneste som står i toppen hos meg nå er:

<?php
session_start
();
if(
$_SESSION['login_accepted']) {}
else {
header ('location: http://www.ekbedriften.no//eke_member_area/'); }
?>

har forsøkt å legge in:

<?php
if($_POST)
  require(...);
 
// Lage spørring
 
...
 
// Kjøre spørring
 
$query = mysql_query($collect, $db_connection) or die(mysql_error());

 
// Søker etter resultat
 
if(mysql_num_rows($query) == 1)

 
// Henter resultet til bruk på siden
 
$data = mysql_fetch_assoc($result);
?>

men funka ikke...

ønsker å kunne gjøre slik:

<div id="page_heading">
  <?php print '<h1>Velkommen</h1>' . $data['member_name']; ?>
</div>

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Skal vi se, jeg håper du vet

Skal vi se, jeg håper du vet at denne tester om session er satt på brukeren, og at han dermed er logget inn?

<?php
if($_SESSION['login_accepted']) {
 
// Brukeren har satt session og er logget inn
}
?>

Ser jo ut som om du videresender folk når de ikke har satt $_SESSION['login_accepted'], her:

<?php
else {
 
header ('location: http://www.ekbedriften.no//eke_member_area/');
}
?>

Er forøvrig bare en slash, så du har vel en typo i URLen?

PS: Skal på butikken og kjøpe noe å gnafse på nå, men er tilbake om 20-30 minutter (blir nok sittende utover natten, lol).

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Visuell oversikt over flow i loginscript

Jeg skjønner ikke hvorfor du overkompliserer, se på dette skjemaet:

Flow i login scriptet

Login script flow

Her ser du hvordan du har formet på en webside, dette formet har satt action-attributten til "auth.php" scriptet i midten. Hvis brukernavnet er riktig settes session, og brukeren videresendes til medlemssidene. Hvis brukeren ikke har skrevet riktig data settes ingen session, og vedkommende dirigeres tilbake til start.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Ja, altså, er det ikke logget
  • Ja, altså, er det ikke logget inn, så blir de redirected til login-siden for å logge seg inn.
  • Er de logget inn da, så kommer de rett inn på siden sin.

I member_validate.php så har jeg kun:

<?php
if($_POST) {
  require(
'/home2/outside_public_html/access.php');
 
$collect = sprintf('
    SELECT * FROM member_table
      WHERE member_id = \'%d\'
      AND member_name = \'%s\''
,
   
mysql_real_escape_string($_POST['member_id']),
   
mysql_real_escape_string($_POST['member_name']));
   
$query = mysql_query($collect, $db_connection) or die(mysql_error());
    if(
mysql_num_rows($query) == 1) {
       
session_start();
           
$_SESSION['login_accepted'] = true;
               
//  redirect til medlemssiden
               
header ('location: http://www.ekbedriften.no/eke_member_area/member_index.php/');
    }
   
// redirect tilbake til login-siden
   
else { header ('location: http://www.ekbedriften.no//eke_member_area/'); }
}
else print
'Du har ikke fyllt ut innloggingsfeltene tilstrekkelig';
?>

Så, trudde det var riktig sånn, men kansje jeg har missforstått noe igjen?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Scriptet ditt

På websiden din har du følgende form:

<form id="query" action="index.php" method="post" name="query"/>
...
</form>

Her bruker du jo index.php for å validere data, er det riktig da? Skal ikke action peke til scriptet som sjekker om brukeren er logget inn eller ei (member_validate.php med andre ord)?

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
der er 2 forskjellige ett for

der er 2 forskjellige

 

ett for medlemmer, og ett for å sjekke om man kan bli medlem... du kan benytte ekbedriften.no/eke_member_area/

Der er formen linket mot member_validate.php  som skal være riktig...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Scriptet dirigerer, posting fra skjema skjer

Scriptet du har der fungerer, men du dirigerer tilbake til: //eke_member_area, med to slasher. Prøv selv:

Gå til http://www.ekbedriften.no/eke_member_area/, klikk på "send forespørsel" og legg merke til URLen i adressefeltet. Den prosessen du utfører skjer her i scriptet ditt:

<?php
// redirect tilbake til login-siden
else {
 
header ('location: http://www.ekbedriften.no//eke_member_area/'); }
}
?>

Lurer du på hvorfor denne beskjeden Du har ikke fyllt ut innloggingsfeltene tilstrekkelig ikke kommer?

I såfall burde du se over scriptet ditt én gang til. Komprimert ser det slik ut:

<?php
if($_POST) {
  ... do
shit ...
} else {
  print
'Du har ikke fyllt ut innloggingsfeltene tilstrekkelig';
}
?>

Hvis brukere klikker på submit knappen, så poster de. Dette skjer uavhengig av om de har skrevet noe inn i skjemaet eller ei.

For å få opp feilmeldingen din, kan du jo prøve å gå direkte til http://www.ekbedriften.no/eke_member_area/member_validate.php for å se hva som skjer.

Har jeg forstått problemet

Har jeg forstått problemet ditt nå, eller er det noe annet som er galt?

I såfall kan du opprette en fake bruker på meg, slik at jeg kan prøve det.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
neida, dette er jeg klar

neida, dette er jeg klar over... Har lagt det opp slik bevist. Bare finne en måte som gjør at når jeg blir sendt tilbake til login-sida, så står det att man skrev feil... Men det for jeg se nærmere på en annen gang...

 

Det som er problemet mitt, er at jeg ikke får tilgang til databasen på samme måte som tidligere. Før jeg brukte session. For da hadde jeg satt opp:

$data = mysql_fetch_assoc($result);

som hentet dataen så jeg kunne bruke print $data['member_name'] inni div's for å legge opp informasjon på siden...

 

forstålig?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Jeg tror du har misforstått

Jeg tror du har misforstått scopet av variabler.

Hvis du har to script, A.php og B.php og du definerer en vanlig variabel (ikke session) i A, så er ikke variabelen tilgjengelig i B.

I scriptet ditt kjører du en query. Basert på om denne queryen leverer resultater eller ikke videresender du til et annet script, ergo er variablene du hentet ut av databasen ikke lenger tilgjengelig.

For at data fra databasen skal være tilgjengelig må du kjøre en ny spørring. Var jeg deg ville jeg gjort dette ved å plassere brukeriden til vedkommende i en session hvis vedkommende er medlem, altså i autentiseringsskriptet ditt.

Du har da noe å kjøre queryen mot når personen er logget inn.

<?php
if($_POST) {
    require(
'/home2/outside_public_html/access.php');
   
$collect = sprintf('
        SELECT * FROM member_table
            WHERE member_id = \'%d\'
            AND member_name = \'%s\''
,
       
mysql_real_escape_string($_POST['member_id']),
       
mysql_real_escape_string($_POST['member_name']));
   
$query = mysql_query($collect, $db_connection) or die(mysql_error());
    if(
mysql_num_rows($query) == 1) {
   
session_start();
   
$_SESSION['login_accepted'] = true;
   
/*
      Setter brukerID i session
    */
   
$_SESSION['member_id'] = $_POST['member_id'];
   
   
//  redirect til medlemssiden
   
header ('location: http://www.ekbedriften.no/eke_member_area/member_index.php/');
   
// redirect tilbake til login-siden
} else {
   
header ('location: http://www.ekbedriften.no//eke_member_area/'); }
} else {
    print
'Du har ikke fyllt ut innloggingsfeltene tilstrekkelig';
}
?>
ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
her ligger en illustrasjon av

Illustrasjon av mitt oppsett

Illustrasjon av funksjonalitet

Det fungerer på en en måte, dvs. at jeg får hentet frem data fra databasen. Men kun fra den første linja.

Så, uansett hvilken bruker som logger seg inn, så er det data fra den første raden i tabellen som blir printet på siden...

Jeg vet igrunne hva som er feil, men alikavel får jeg det ikke til å funke.

 

member_index.php

<?php
session_start
();
if (
$_SESSION['login_accepted']) {
  require(
'/bla/bla/access.php');
 
$select = 'SELECT * FROM member_table';
 
$query = mysql_query($select, $eke_connection);
 
$data = mysql_fetch_assoc($query);
}
?>

Her mangler jeg å definere hvilken bruker som skal hentes ut/brukes.

Ved å sette 'member_id' i $_SESSION så videreføres den gjenkjente brukeren, basert på innloggingen, til bruk på medlemsorådet. Via sessions. Har jeg forstått den riktig?

har forsøkt å legge inn $_SESSION['member_id'] på alle tenklige plasser. Men får det ikke til å funke.

> $member = $_SESSION['member_id']; for så å referere til denne i SELECT * FORM member_table WHERE member_id = '$member';

Men, får det ikke til å stemme... Kansje du kan komme med noen nøkkelord da, noen nøkkelord som har med nettop dette.

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Prøv dette

Guri Malla, så flott skjema, hehehe. :)

Hvis du formet queryen din slik:

<?php
$sql
= 'SELECT * FROM member_table WHERE member_id = \'$member\'';
?>

Så sendte du egentlig denne spørringen:

SELECT * FROM member_table WHERE member_id = '$member'

Jepp, du ser riktig, det står fortsatt $member. Grunnen er at PHP ikke tolker variabler som er innlemmet i fnutter.

Prøv dette

<?php
session_start
();
if (
$_SESSION['login_accepted']) {
  require(
'/bla/bla/access.php');
 
$select = sprintf('SELECT * FROM member_table WHERE member_id = \'%s\'',
 
mysql_real_escape_string($_SESSION['member_id']));
 
$query = mysql_query($select, $eke_connection);
 
$data = mysql_fetch_assoc($query);
}
?>

Dette skal fungere. Hvis input i $_SESSION['member_id'] allerede er sikret kan den sendes ved hjelp av en slik query:

<?php
$sql
= 'SELECT * FROM member_table WHERE member_id = \''.$_SESSION['member_id'].'\'';
?>

Slashen foran fnuttene escaper fnuttene.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Stemmer, begynte å lure litt

Stemmer, begynte å lure litt da, men tenkte ikke over det med en gang...

Men nå ble det andre boller da...

mysql_real_escape_string() var det jeg hadde glemt helt vekk... Det er jo denne som sammenligner input med databasen for å finne en rad. Sant?

Og nå, når det benyttes $_SESSION['member_id'] - som referer til $_POST['member_id'] - så henter den også her frem raden som inneholder dataen som refererer til brukeren. Så, er det noen grunn til å sette opp:

$result = mysql_num_rows($query) == 1)

Eller går det i det hele tatt?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
MySQL, PHP og variabler

Så det du ville skulle fungere fungerte nå?

Det er ikke mysql_real_escape_string() som sender argumentet. Det er bare en sikkerhetfunksjon. Vi snakket jo om både den og springf() tidligere.

Det du hadde gjort galt i din query var å referere til en variabel inne i fnutter, dette er ikke mulig, fordi PHP tolker ikke variabler i fnutter. Se på dette (kommentarene under er hva som printes ut):

<?php
$variabel
= 'Hjemmeside';

print
"Dette er en $variabel";
# Dette er en Hjemmeside

print 'Dette er en $variabel';
# Dette er en $variabel
?>

Når det gjelder å sjekke antall rader; det går, men er ikke nødvendig da medlemmet allerede er funnet i databasen ved innlogging.

Hvis session ikke er satt vil heller ikke den aktuelle brukeren ha tilgang til medlemssidene.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
sant, det var det du fortalte

sant, det var det du fortalte i videoene dine også... Det er mye  huske på...

 

Det funker nå ja... Nå får jeg frem den informasjonen som tilhører raden som den brukerID'n ligger på...

 

Så, nå tenker jeg at jeg for fortsette...

Men, er noen risiko å legge session_start(); opplegget i en egen fil, og inkludere den?...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Sending av forespørsler og omskriving av URLer

Ja, det er veldig mye å huske på, du får trøste deg med at desto flere ganger du gjør det, desto hardere sitter det. Selv bruker jeg bare fnutter, spesielt fordi man slipper å escape double quotes når man skriver HTML inne i variabler. (Man kan bruke fnutter i HTML også).

Angående sessions osv: Neida, det er ikke noe risiko å legge de tingene i en egen fil, hvis du skal hente ut informasjonen slik mange ganger så er det jo bedre å legge det i egen fil. :)

Men greia er jo at du må ha en if-condition for å se om brukeren er innlogget da. Alle medlemsfilene du skal beskytte må jo sjekke om session er satt eller ikke. Det man kan gjøre er å sende alle forespørsler til index.php, og så bruke index.php til å avgjøre hva som skal vises basert på query stringen. F.eks.

<?php
# index.php

// pid er Page ID
if($_GET['pid']) {
  switch(
$_GET['pid']) {
    case
'om-oss':
      include(
'om-oss.php');
      break;
   
    case
'profil':
      include(
'profil.php');
      break;
  }
} else {
  include(
'forsiden.php');
}
?>

Dermed kan man lage linker med query strings, f.eks. vil denne peke til profilen: domene.com/?pid=profil.

For å dra det hele ett stykke videre, kan man skrive om URLene ved hjelp av .htaccess, slik at URLene ikke har query stringen, men at query stringen likevel sendes, f.eks. ved at URLen domene.com/profil/ egentlig sender domene.com/?pid=profil.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Akkurat, tenkte at det hadde

Akkurat, tenkte at det hadde holdt med å skrive

        <?php include 'test.php'; ?>

i toppen av dokumentene jeg.

hvor test.php hadde inneholdt session_start(); og alt det der...

med hilsen
Thomas Kile

Svar på forumemnet

(If you're a human, don't change the following field)
Your first name.
Innholdet i dette feltet blir holdt privat og vil ikke bli vist offentlig.