/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
2 spørgsmål om sesions
Fra : Nederbasse


Dato : 09-05-05 10:42

Hej

Jeg er ved at lave et noget login som bruger sessions og vil gerne have
echo'et min session variabel
jeg vil gerne have personid som session variabel, denne værdi skal hentes
fra en Mysql db.
Personid skal bruger over flere sider
min login check side:

$result = mysql_query("SELECT id, username, password FROM bruger WHERE
username =
'".$_POST['brugernavn']."' AND password = '".$_POST['password']."'") or die
(mysql_error());
if ($antal_raekker=mysql_num_rows($result)>0){
$_SESSION['logget_ind']=1;
$_SESSION['id'] = $result["id"];
header ("Location: forside.php");

og forside hvor heg gerne vil se om id bliver hentet:
echo $_SESSION['id'];
problemet er at der ikke bliver skrevet noget

Andet spørgsmål:
Brugerne skal svare på nogle spørgsmål over en 4-5 sider og til sidst skal
svarebe sættes ind i datebasen.
Skal der laves en session for hver svar eller hvordan laves dette nemmest ?

LarsN



 
 
Zilla (09-05-2005)
Kommentar
Fra : Zilla


Dato : 09-05-05 11:01

Nederbasse wrote:
[snip]
> $result = mysql_query("SELECT id, username, password FROM bruger WHERE
> username =
> '".$_POST['brugernavn']."' AND password = '".$_POST['password']."'") or die
> (mysql_error());

For det første så er der en ret alvorlig fejl i ovenstående. Her kan
brugeren nemlig lave såkaldte sql injection attacks. Hvis du ikke ved
hvad det er så google det. Løsningen er at køre $_POST[]-variablerne en
tur gennem mysql_escape_string(). Se her: www.php.net/mysql_escape_string

> if ($antal_raekker=mysql_num_rows($result)>0){
> $_SESSION['logget_ind']=1;
> $_SESSION['id'] = $result["id"];
> header ("Location: forside.php");
>
> og forside hvor heg gerne vil se om id bliver hentet:
> echo $_SESSION['id'];
> problemet er at der ikke bliver skrevet noget

For det andet: Har du husket at starte sessions på begge sider med
session_start()? Hvis ikke er det højst sandsynligt det der er i vejen.

> Andet spørgsmål:
> Brugerne skal svare på nogle spørgsmål over en 4-5 sider og til sidst skal
> svarebe sættes ind i datebasen.
> Skal der laves en session for hver svar eller hvordan laves dette nemmest ?

Du kan indsætte variablerne fra de tidligere sider som skjulte inputs:
echo "<input type='hidden' name='spørgsmål1' value='" .
$_POST[spørgsmål1] . '">
osv. Hvis disse spørgsmål skal gemmes i databasen så skal du også køre
dem igennem mysql_escape_string().

Zilla.

Nederbasse (09-05-2005)
Kommentar
Fra : Nederbasse


Dato : 09-05-05 14:54

SNIP
>
> For det andet: Har du husket at starte sessions på begge sider med
> session_start()? Hvis ikke er det højst sandsynligt det der er i vejen.
>
>
Der er session_start() på alle sider

LarsN



Peter Brodersen (09-05-2005)
Kommentar
Fra : Peter Brodersen


Dato : 09-05-05 15:51

On Mon, 09 May 2005 12:00:58 +0200, Zilla <mail.is.not@an.option>
wrote:

>For det første så er der en ret alvorlig fejl i ovenstående. Her kan
>brugeren nemlig lave såkaldte sql injection attacks. Hvis du ikke ved
>hvad det er så google det. Løsningen er at køre $_POST[]-variablerne en
>tur gennem mysql_escape_string(). Se her: www.php.net/mysql_escape_string

Til gengæld taler sandsynligheden også for at hvis han ikke ved, hvad
det er, så er der tale om en default php-opsætning, hvor der bruges
magic_quotes_gpc.

--
- Peter Brodersen

Zilla (10-05-2005)
Kommentar
Fra : Zilla


Dato : 10-05-05 20:03

Peter Brodersen wrote:
[snip]
> Til gengæld taler sandsynligheden også for at hvis han ikke ved, hvad
> det er, så er der tale om en default php-opsætning, hvor der bruges
> magic_quotes_gpc.

Det er rigtigt, men det er godt at vide dette, så man gør det rigtigt.
Når det er sagt så kan det give nogle uventede resultater ved at bruge
mysql_escape_string() når magic quotes er slået til. Her kan man nemlig
komme ud for at en streng som allerede er "escaped" pga. magic quotes
bliver "escaped" endnu en gang. Eks.:

Streng som brugeren skriver ind: Hans' fødselsdag

Streng "escaped" fordi magic quotes er slået til: Hans\' fødselsdag

Streng efter en tur gennem mysql_escape_string(): Hans\\\' fødselsdag

Mysql vil så se bort fra to af backslash'erne så resultatet i databasen
bliver: Hans\' fødselsdag hvor man egentlig ville have haft: Hans'
fødselsdag

Hvis magic quotes er slået til bliver man derfor enten nødt til at lade
være med at bruge mysql_escape_string() og håbe på at udbyderen ikke
ændrer på opsætningen eller køre alle variabler der skal i databasen
gennem både stripslashes() og mysql_escape_string().

Links til stripslashes() og info om magic quotes:
www.php.net/stripslashes
www.php.net/magic_quotes

Zilla.

Peter Brodersen (10-05-2005)
Kommentar
Fra : Peter Brodersen


Dato : 10-05-05 21:03

On Tue, 10 May 2005 21:02:39 +0200, Zilla <mail.is.not@an.option>
wrote:

>Det er rigtigt, men det er godt at vide dette, så man gør det rigtigt.
>Når det er sagt så kan det give nogle uventede resultater ved at bruge
>mysql_escape_string() når magic quotes er slået til. Her kan man nemlig
>komme ud for at en streng som allerede er "escaped" pga. magic quotes
>bliver "escaped" endnu en gang. Eks.:

Under alle omstændigheder er der ingen grund til at bruge
mysql_escape_string() i stedet for mysql_real_escape_string(), der
også tager højde for tegnsæt. Forestil dig et to-byte-tegnsæt, hvor et
tegn fx er Å' - altså bytesekvensen [Å'] udgør ét tegn.

Her vil mysql_escape_string() så konvertere det til Å\' - altså [Å\]
som første tegn, og så vil ' pludselig blive skubbet ud og blive en
strengseparator - og netop udgøre en sikkerhedsrisiko.

Det kræver dog rigtigt nok at man bruger et specielt tegnsæt.
Problemstillingen vil ikke forekomme ved UTF-8, idet begge/alle tegn i
en bytesekvens vil være highbits (og ' eller " vil så ikke forekomme
dér).

>Hvis magic quotes er slået til bliver man derfor enten nødt til at lade
>være med at bruge mysql_escape_string() og håbe på at udbyderen ikke
>ændrer på opsætningen eller køre alle variabler der skal i databasen
>gennem både stripslashes() og mysql_escape_string().

Jeg kan kun anbefale at bruge et api i stil med PEAR DB - og så evt.
indlede projekter, der tjekker på hælde $_REQUEST og venner igennem
stripslashes, fx:
if (get_magic_quotes_gpc()) {
   $_REQUEST = array_map('stripslashes',$_REQUEST);
}
(duer dog ikke for arrays)

Det er i første omgang noget klamp at skulle klippeklistre queries
sammen.

--
- Peter Brodersen

Dan Storm (09-05-2005)
Kommentar
Fra : Dan Storm


Dato : 09-05-05 15:44

Hvis du nu keder dig, så har jeg en lille quick guide til sessions her:
http://err0r.dk/docs.php?fetchdoc=1

Der ligger også et forslag til hvordan du kan benytte MySQL til
brugersystem sammen med sessions.

Men ellers, så er den måde du henter ID'et på også forkert... Der skal stå:
$_SESSION['id'] = mysql_result($result, 0, 'id');

--
Dan Storm

http://err0r.dk
storm@err0r.dk

PGP Public key på http://err0r.dk/pubring.pkr

>>> husk på; en ekspert er en person der har begået alle fejl mulige
inden for et bestemt område

Nederbasse (11-05-2005)
Kommentar
Fra : Nederbasse


Dato : 11-05-05 07:27


"Dan Storm" <shadyz@_REMOVETHIS_err0r.dk> skrev i en meddelelse
news:427f7715$0$192$edfadb0f@dread11.news.tele.dk...
> Hvis du nu keder dig, så har jeg en lille quick guide til sessions her:
> http://err0r.dk/docs.php?fetchdoc=1
>
> Der ligger også et forslag til hvordan du kan benytte MySQL til
> brugersystem sammen med sessions.
>
> Men ellers, så er den måde du henter ID'et på også forkert... Der skal
stå:
> $_SESSION['id'] = mysql_result($result, 0, 'id');
>
> --
> Dan Storm
>
> http://err0r.dk
> storm@err0r.dk
>

Okay jeg kan forstå $_SESSION['id'] = mysql_result($result men hvor kommer
0, fra ?

LarsN



Dan Storm (11-05-2005)
Kommentar
Fra : Dan Storm


Dato : 11-05-05 10:20

syntaksen er mysql_result( resource result, int row [, mixed field])

Idet at din mysql forespørgsel ligger i variablen $result, er dette
selvsagt vores 'resource result'.

int row er så den række du vil hente dit resultat fra. Da du faktisk kun
får 1 række ud af forespørgslen (da der jo kun er en bruger der benytter
denne) så har den ene række nummeret 0. Hvis du havde to rækker så ville
den første række have nummeret 0, og den anden række nummer 1. Og resten
er vel selvsagt.

mixed field er kun nødvendigt når du henter mere end et felt i din
forespørgsel (f.eks "SELECT * FROM table" eller SELECT id, name FROM
TABLE"). Hvis din forespørgsel havde været "SELECT id FROM table" ville
det være nok at skrive mysql_result($result, 0)

Men da du henter flere felter er det nødvendigt at benytte sig af mixed
field.

Altså, mysql_result(sql_query, row_number, field_name) =>
mysql_result($result, 0, 'id')

Håber det er godt nok! :)

--
Dan Storm

http://err0r.dk
storm@err0r.dk

PGP Public key på http://err0r.dk/pubring.pkr

>>> husk på; en ekspert er en person der har begået alle fejl mulige
inden for et bestemt område

Nederbasse (11-05-2005)
Kommentar
Fra : Nederbasse


Dato : 11-05-05 11:12


"Dan Storm" <shadyz@_REMOVETHIS_err0r.dk> skrev i en meddelelse
news:4281ce0e$0$177$edfadb0f@dread11.news.tele.dk...
> syntaksen er mysql_result( resource result, int row [, mixed field])
>
> Idet at din mysql forespørgsel ligger i variablen $result, er dette
> selvsagt vores 'resource result'.
>
> int row er så den række du vil hente dit resultat fra. Da du faktisk kun
> får 1 række ud af forespørgslen (da der jo kun er en bruger der benytter
> denne) så har den ene række nummeret 0. Hvis du havde to rækker så ville
> den første række have nummeret 0, og den anden række nummer 1. Og resten
> er vel selvsagt.
>
> mixed field er kun nødvendigt når du henter mere end et felt i din
> forespørgsel (f.eks "SELECT * FROM table" eller SELECT id, name FROM
> TABLE"). Hvis din forespørgsel havde været "SELECT id FROM table" ville
> det være nok at skrive mysql_result($result, 0)
>
> Men da du henter flere felter er det nødvendigt at benytte sig af mixed
> field.
>
> Altså, mysql_result(sql_query, row_number, field_name) =>
> mysql_result($result, 0, 'id')
>
> Håber det er godt nok! :)
>
> --
> Dan Storm
>
> http://err0r.dk
> storm@err0r.dk
>
>

Det begynder at dæmre
God guide du har om sessions (og sød knægt)

LaesN



Dan Storm (11-05-2005)
Kommentar
Fra : Dan Storm


Dato : 11-05-05 11:56

Takker! ;)
--
Dan Storm

http://err0r.dk
storm@err0r.dk

PGP Public key på http://err0r.dk/pubring.pkr

>>> husk på; en ekspert er en person der har begået alle fejl mulige
inden for et bestemt område

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408941
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste