|
| Login med php MySQL Fra : Erik Ginnerskov |
Dato : 25-09-04 17:54 |
|
Hej Ng
Jeg sidder og fumler med at lave noget login via MySQL. Jeg har foreløbig
fået oprettet tabellen på serveren. Men når jeg forsøger at oprette en
bruger i tabellen, svarer php-scriptet, at jeg ikke har udfyldt alle de
felter, der skal udfyldes, hvilket jeg undres over. Der er kun to og jeg har
da skrevet noget i dem begge.
Siden til bruger-oprettelse kan ses her:
http://www.hjemmesideskolen.dk/scripts/phpmysql/nybruger.php
På siden kan man i en kodeboks se, hvordan php-scriptet til kontakt med
databasen er lavet. Jeg har også indsat en kodeboks med det script, der har
oprettet tabellen i databasen.
En supplerende bemærkning: I første kodelinje i php-scriptet har jeg
selvfølgelig indsat de rigtige data, hvor der er indsat noget sort tekst i
kodeboksen på siden.
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Ukendt (25-09-2004)
| Kommentar Fra : Ukendt |
Dato : 25-09-04 19:22 |
|
Hej.
Du kalder dine variabler fra din formular med f.eks. '$brugernavn'
Du kan evt. prøve med '$POST_[brugernavn]'
Jeg kan ikke lige helt præcist huske hvorfor, men det er noget med nogle
globale variabler og PHP.
Mvh. Leif.
| |
Erik Ginnerskov (25-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 25-09-04 21:43 |
| | |
Michael Foged (25-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 25-09-04 21:55 |
|
On Sat, 25 Sep 2004 18:53:54 +0200, Erik Ginnerskov wrote:
Dine superglobale variable hedder $_POST['xx'] og ikke $POST_['xx']
--
mvh
MicHael Foged
| |
Michael Foged (25-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 25-09-04 22:07 |
|
On Sat, 25 Sep 2004 22:54:41 +0200, Michael Foged wrote:
> On Sat, 25 Sep 2004 18:53:54 +0200, Erik Ginnerskov wrote:
>
> Dine superglobale variable hedder $_POST['xx'] og ikke $POST_['xx']
Oversat til dansk:
Dine superglobale variable skal hedde $_POST['xx'] og ikke $POST_['xx']
--
mvH
mIchael Foged
| |
Erik Ginnerskov (26-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 26-09-04 08:32 |
|
Michael Foged wrote:
>> Dine superglobale variable hedder $_POST['xx'] og ikke $POST_['xx']
>
> Oversat til dansk:
> Dine superglobale variable skal hedde $_POST['xx'] og ikke
> $POST_['xx']
Det var de vise ord, der bragte mig et stykke videre - til de næste to
problemer:
1. Ved oprettelse af en bruger returnerede scriptet en blank side.
Jeg havde forventet en melding om at 'Brugernavn og password
var ledigt og er godkendt!'.
2. Ved nyt forsøg på at oprette samme brugernavn/password
returnerede scriptet både den melding, jeg havde forventet
at få i første omgang + den nu forventede melding om, at
'Desværre, brugernavnet er optaget'.
Der er mao. en forkert rækkefølge af php-kommandoer og udskrifter til html.
Men jeg kan ikke gennemskue, hvordan det skal laves om.
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Michael Foged (26-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 26-09-04 09:23 |
|
On Sun, 26 Sep 2004 09:32:25 +0200, Erik Ginnerskov wrote:
> Michael Foged wrote:
>
>>> Dine superglobale variable hedder $_POST['xx'] og ikke $POST_['xx']
>>
>> Oversat til dansk:
>> Dine superglobale variable skal hedde $_POST['xx'] og ikke $POST_['xx']
>
> Det var de vise ord, der bragte mig et stykke videre - til de næste to
> problemer:
>
> 1. Ved oprettelse af en bruger returnerede scriptet en blank side.
> Jeg havde forventet en melding om at 'Brugernavn og password var
> ledigt og er godkendt!'.
>
> 2. Ved nyt forsøg på at oprette samme brugernavn/password
> returnerede scriptet både den melding, jeg havde forventet at få i
> første omgang + den nu forventede melding om, at 'Desværre,
> brugernavnet er optaget'.
>
> Der er mao. en forkert rækkefølge af php-kommandoer og udskrifter til
> html. Men jeg kan ikke gennemskue, hvordan det skal laves om.
Jeg har lige "omstruktureret" dit script lidt (så jeg lettere kan læse
det).
Som du vil bemærke har jeg lagt dine queries i variabler. Det er
hensigsmæssigt under fejlfinding, da det så er let at printe queryen (og
man kan se om ens variabler bliver rigtigt "oversat" (mangel på bedre
udtryk).
Derudover lavede jeg lidt identationer, så de "logiske" kodeblokke
hænger sammen, så er det lettere at se hvilke kommandoer der bliver
udført i en given if.
Punkt 1)
Når du _opretter_ en ny bruger, eksesterer han jo ikke i databasen,
d.v.s. $number==0, derfor springer den over første if, og ryger ind i
elseif'en.
Punkt 2)
Nu eksisterer brugeren, $number==1, så ryger du ind i if'en. Der
skriver du først Brugernavn of pasword var ledigt og godkendt 5 linier
længere nede (i samme if) skriver du Desværre, brugernavnet er
optaget.
<?php
<snip et par linier>
$sql="select brugernavn from users where brugernavn='$POST_[brugernavn]'";
$result = mysql_query($sql)or die(mysql_error()); $number =
mysql_num_rows($result);
if ($number > 0){
?>
<html>
<head>
<title>nybruger-ok</title>
</head>
<body>
<br>
Brugernavn og password var ledigt og er godkendt! <br>
</body>
</html>
<br>
<? print "Desværre, brugernavnet er optaget";
}
elseif ($POST_[brugernavn] && $POST_[password]) {
$sql2="insert into users (brugernavn, password) values
('$POST_[brugernavn]', '$POST_[password]')" mysql_query($sql2) or
die(mysql_error());
}
else{
print "Du skal udfylde begge felterne!!";
}
?>
--
Mvh
Michael Foged
| |
Michael Foged (26-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 26-09-04 09:45 |
|
On Sun, 26 Sep 2004 10:22:37 +0200, Michael Foged wrote:
> Brugernavn og password var ledigt og er godkendt! <br>
Denne linie flyttes
> elseif ($POST_[brugernavn] && $POST_[password]) {
> $sql2="insert into users (brugernavn, password) values
> ('$POST_[brugernavn]', '$POST_[password]')";
> mysql_query($sql2) or die(mysql_error());
Herned
> }
> else{
> print "Du skal udfylde begge felterne!!";
> }
> ?>
Vanen tro glemte jeg noget i mit indlæg
--
mvH
Michael Foged
| |
Erik Ginnerskov (26-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 26-09-04 14:18 |
|
"Michael Foged" <spamme@mogif.de> skrev i en meddelelse
> > Brugernavn og password var ledigt og er godkendt! <br>
>
> Denne linie flyttes
>
> > elseif ($POST_[brugernavn] && $POST_[password]) {
> > $sql2="insert into users (brugernavn, password) values
> > ('$POST_[brugernavn]', '$POST_[password]')";
> > mysql_query($sql2) or die(mysql_error());
>
> Herned
>
> > }
> > else{
> > print "Du skal udfylde begge felterne!!";
Afprøvet, ændrede ikke andet en nummeret på den linje, der giver fejl (samme
kode, men nu placeret højere oppe i scriptet).
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Erik Ginnerskov (26-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 26-09-04 14:11 |
|
"Michael Foged" <spamme@mogif.de> skrev i en meddelelse
> > Det var de vise ord, der bragte mig et stykke videre - til de næste to
> > problemer
> Jeg har lige "omstruktureret" dit script lidt (så jeg lettere kan læse
> det).
> <?php
> <snip et par linier>
> $sql="select brugernavn from users where brugernavn='$POST_[brugernavn]'";
> $result = mysql_query($sql)or die(mysql_error()); $number =
> mysql_num_rows($result);
> if ($number > 0){
> ?>
> <html>
> <head>
> <title>nybruger-ok</title>
> </head>
> <body>
> <br>
> Brugernavn og password var ledigt og er godkendt! <br>
> </body>
> </html>
> <br>
> <? print "Desværre, brugernavnet er optaget";
> }
> elseif ($POST_[brugernavn] && $POST_[password]) {
> $sql2="insert into users (brugernavn, password) values
> ('$POST_[brugernavn]', '$POST_[password]')" mysql_query($sql2) or
> die(mysql_error());
> }
> else{
> print "Du skal udfylde begge felterne!!";
> }
> ?>
Det har jeg nu afprøvet, det giver fejl i linjen
<citat>('$_POST[brugernavn]', '$_POST[password]')" mysql_query($sql2)
or</citat>
Fejlmeldingen lyder:
Parse error: parse error, unexpected T_STRING in
d:\home\hjemmesideskoldk\www\scripts\phpmysql\nybruger-ok.php on line 23
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Michael Foged (26-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 26-09-04 15:08 |
|
On Sun, 26 Sep 2004 15:10:43 +0200, Erik Ginnerskov wrote:
> Det har jeg nu afprøvet, det giver fejl i linjen
>
> <citat>('$_POST[brugernavn]', '$_POST[password]')" mysql_query($sql2)
> or</citat>
Her fik jeg indsneget en fejl, der mangler et ";" efter
variabeldeklarationen:
$sql2="INSERT INTO users (brugernavn, password) VALUES
('$POST_[brugernavn]', '$POST_[password]')"; mysql_query()....
beklager forvirringen.
ps
Det er også en god skik at skrive SQL reserverede ord med stort i queryen
--
mvh
Michael
| |
Erik Ginnerskov (26-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 26-09-04 15:42 |
|
Michael Foged wrote:
>> <citat>('$_POST[brugernavn]', '$_POST[password]')" mysql_query($sql2)
>> or</citat>
>
> Her fik jeg indsneget en fejl, der mangler et ";" efter
> variabeldeklarationen:
>
> $sql2="INSERT INTO users (brugernavn, password) VALUES
> ('$POST_[brugernavn]', '$POST_[password]')"; mysql_query()....
Rettet i php-scriptet - og i den viste kode. Nu får jeg denne fejlmelding:
Parse error: parse error, unexpected T_ELSE in
d:\home\hjemmesideskoldk\www\scripts\phpmysql\nybruger-ok.php on line 25
Det er den sidste 'else' i scriptet, den ikke havde regnet med - der.
I øvrigt undrer jeg mig over, at du i går skrev, at jeg skulle skrive
variablerne sådan: $_POST[brugernavn], hvorefter du i dag konsekvent selv
skriver $POST_[brugernavn]
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Michael Foged (26-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 26-09-04 16:31 |
|
On Sun, 26 Sep 2004 16:41:54 +0200, Erik Ginnerskov wrote:
> Det er den sidste 'else' i scriptet, den ikke havde regnet med - der.
Du udfører en echo "<html>........" mellem de to
elseif(){} og else{} blokke, det må man (vistnok) ikke.
> I øvrigt undrer jeg mig over, at du i går skrev, at jeg skulle skrive
> variablerne sådan: $_POST[brugernavn], hvorefter du i dag konsekvent
> selv skriver $POST_[brugernavn]
Det var mig der her lavede en klippe/klistre fra et forkert sted. Det
korrekte er: $_POST[], $_GET[] osv.
jeg kommer med endnu et _utestet_ forsøg (men jeg har været lidt mere
grudig)
<?php
mysql_connect("brugernavn", "password"); mysql_select_db("databasenavn");
$sql="SELECT brugernavn FROM users WHERE brugernavn='$_POST[brugernavn]'";
$result=mysql_query($sql)or die(mysql_error());
$number=mysql_num_rows($result);
if($number > 0){
print "<br>Desværre, brugernavnet er optaget";
}
elseif($_POST['brugernavn'] && $_POST['password']){
$sql2="INSERT INTO users (brugernavn, password)
VALUES('$_POST[brugernavn]', '$_POST[password]')"; mysql_query($sql2) or
die(mysql_error());
echo "<html><head><title>nybruger-ok</title></head><body>";
echo "<p>Brugernavn og password var ledigt og er godkendt! </p>";
echo "</body></html>";
}
else{
echo "Du skal udfylde begge felterne";
}
?>
Håber det gik bedre denne gang, men ingen garanti, ellers er du velkommen
til at sende en mail, adressen virker. Det er nemmere end at hoppe ind på
hjemmesideskolen, klippe/klistre over i en editor, klippe klistre over i
news-klienten, og så rette til.
--
mvh
Michael Foged
| |
Erik Ginnerskov (26-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 26-09-04 21:00 |
|
"Michael Foged" <spamme@mogif.de> skrev i en meddelelse
> Det var mig der her lavede en klippe/klistre fra et forkert sted. Det
> korrekte er: $_POST[], $_GET[] osv.
Sådan havde jeg også hele dagen i dag ændret det til. ;)
> jeg kommer med endnu et _utestet_ forsøg (men jeg har været lidt mere
> grudig)
Det var tilsyneladende det, der skulle til. Nu får jeg i hvert fald de
retursvar, jeg forventer, afhængig af om jeg
1. Forsøger at genoprette et eksisterende login
2. 'Glemmer' at udfylde begge felter
3. Opretter en ny bruger.
Så kommer den næste hurdle: Login virker ikke - dvs. man kan vade lige ind
helt ukontrolleret.
På http://www.hjemmesideskolen.dk/scripts/phpmysql/tjek.php har jeg vist de
scripts, der skulle tjekke brugernavn og password fra login-formularen op
mod databasen.
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Michael Foged (27-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 27-09-04 07:03 |
|
On Sun, 26 Sep 2004 21:59:55 +0200, Erik Ginnerskov wrote:
> Så kommer den næste hurdle: Login virker ikke - dvs. man kan vade lige
> ind helt ukontrolleret.
>
> På http://www.hjemmesideskolen.dk/scripts/phpmysql/tjek.php har jeg
> vist de scripts, der skulle tjekke brugernavn og password fra
> login-formularen op mod databasen.
Har du tjekket indholdet af dine variable? Prøv at printe dem ud.
Du slår op i databasen for at finde passwordet. Men du spørger
aldrig om der var nogen rækker, der tilfredsstillede din query.
Jeg ikke sikker men mener at $HTTP_POST_VARS[] er et gammelt udtryk for
$_POST[].
--
mvh
Michael Foged
| |
Erik Ginnerskov (27-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 27-09-04 19:27 |
|
Michael Foged wrote:
> Har du tjekket indholdet af dine variable? Prøv at printe dem ud.
>
> Du slår op i databasen for at finde passwordet. Men du spørger
> aldrig om der var nogen rækker, der tilfredsstillede din query.
>
> Jeg ikke sikker men mener at $HTTP_POST_VARS[] er et gammelt udtryk
> for $_POST[].
Undskyld, men jeg er helt blank. Jeg aner ikke, hvad du mener.
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Michael Foged (27-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 27-09-04 21:27 |
|
On Mon, 27 Sep 2004 20:27:29 +0200, Erik Ginnerskov wrote:
> Michael Foged wrote:
>
>>
>>
>> Jeg ikke sikker men mener at $HTTP_POST_VARS[] er et gammelt udtryk
>> for $_POST[].
>
> Undskyld, men jeg er helt blank. Jeg aner ikke, hvad du mener.
Ingen grund til at undskylde, det er mig der ikke forklarer godt mig nok,
(jeg er selv i en indlæringsprocess).
>> Har du tjekket indholdet af dine variable? Prøv at printe dem ud.
En af de fejl jeg _tit_ rendte/render ind i, var/er at tro en
variabel havde/har en anden værdi end den rent faktsisk havde/har.
Derfor printer/echo'er jeg mine variabler ud umiddelbart inden det
udtryk der ikke gør hvad jeg vil ha (men hvad jeg beder om)'.
Jeg går ud fra at password kommer som en _POST variabel (d.v.s. sendt som
et input felt fra en form med method=post)
Altså, du indsætter en echo før din if:
<?php
echo "db_pass: $row[password] post_pass: $_POST[password]";
exit();
if($row[password] == $_POST[password]){
<snip kode>
}
?>
Jeg printer også _alle_ mine sql queries hvori der er involveret
php-variable.
--
mvh
Michael Foged
| |
Erik Ginnerskov (29-09-2004)
| Kommentar Fra : Erik Ginnerskov |
Dato : 29-09-04 14:51 |
|
Michael Foged wrote:
> Ingen grund til at undskylde, det er mig der ikke forklarer godt mig
> nok, (jeg er selv i en indlæringsprocess).
> Altså, du indsætter en echo før din if:
>
> <?php
> echo "db_pass: $row[password] post_pass: $_POST[password]";
> exit();
> if($row[password] == $_POST[password]){
> <snip kode>
> }
>>
Jet tror, jeg vil angribe sagen fra en helt anden vinkel: I stedet for at
lægge siden ind i et php-script, der tjekker, om siden må vises, vil jeg
lægge et php-script ind i siden til at tjekke, om det beskyttede må vises
eller om en fejlmeddelelse i stedet skal sendes.
Jeg vender tilbage, når jeg er klar med det og er kørt fast der - hvilket
jeg helt sikkert vil gøre (køre fast). ;)
--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk - http://html-faq.dk
http://ginnerskov.frac.dk
| |
Michael Foged (29-09-2004)
| Kommentar Fra : Michael Foged |
Dato : 29-09-04 15:52 |
|
On Wed, 29 Sep 2004 15:50:39 +0200, Erik Ginnerskov wrote:
> Jet tror, jeg vil angribe sagen fra en helt anden vinkel: I stedet for at
> lægge siden ind i et php-script, der tjekker, om siden må vises, vil jeg
> lægge et php-script ind i siden til at tjekke, om det beskyttede må vises
> eller om en fejlmeddelelse i stedet skal sendes.
Jeg ved ikke hvad der er smartest. De eneste authentication scripts jeg
har set beskytter hele (den aktuelle) siden.
> Jeg vender tilbage, når jeg er klar med det og er kørt fast der -
> hvilket jeg helt sikkert vil gøre (køre fast). ;)
Og så måske lige se lidt på sikkerhed. Jeg har selv lige lært noget
nyt, og skynder mig at give hintet videre:
mysql_real_escape_string(), læs eventuelt tråden "Validering af rettede
data 2" her i gruppen, og den tråd jeg selv startede i dag om
mysql_real_escape_string() om det emne i dag.
I bund og grund handler det om at, man ikke bare udenvidere bør anvende
brugerindtastede data i en query (forespørgsel), da ondsindede brugere
kan tiltvinge sig adgang.
Genrelt er det altid en god ide at validere bruger input, inden man
anvender det.
--
mvh
Michael Foged
| |
|
|