22. juli 2004 - 08:36Der er
77 kommentarer og 1 løsning
Basic PHP programering
Hej folkens
Jeg er begyndet på at lære PHP, og tror at jeg har forstået meget af det, men en ting jeg ikke rigtig kan forstå er at hvis jeg vil lave en side som man skal logge ind for at se. (databasen er MySQL) Skal det så bestå af to sider, en der kan hedder login.php, og en php fil som indeholder oplydsninger om databasen. navn brugernavn password. Eller skal det hele stå i en fil?
login_tjek.php --------------------- <?PHP //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM tbl_users WHERE username = '$_POST[username]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($
login_tjek.php --------------------- <?PHP //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM tbl_users WHERE username = '$_POST[username]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = "$_POST['ok']; header("location: in.php"); } else { echo "du er ikke logget ind"; } } ?>
databasen ser sådanne her ud: CREATE TABLE `ds_members` ( `ID` int(11) NOT NULL auto_increment, `r_navn` text NOT NULL, `n_navn` text NOT NULL, `e-mail` text NOT NULL, `msn` text NOT NULL, `aller` date NOT NULL default '0000-00-00', `placering` text NOT NULL, `password` varchar(40) NOT NULL default '', PRIMARY KEY (`ID`), UNIQUE KEY `ID` (`ID`) ) TYPE=MyISAM AUTO_INCREMENT=2 ;
ok nu har i tabt mig. Jeg er totalt n00b til det her. filen ser sådanne her ud: <?PHP include("forbindelse.php"); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE username = '$_POST[n_navn]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_SESSION['navn'] header("location: in.php"); } else { echo "du er ikke logget ind"; } } ?>
Prøv lige med: <?PHP include("forbindelse.php"); session_start(); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE username = '$_POST[n_navn]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_POST['username']; header("location: in.php"); } else { echo "du er ikke logget ind"; } } ?>
<?PHP session_start(); // <-- den her skal i toppen af ale dine filer med sessions include("forbindelse.php"); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE username = '$_POST[n_navn]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_SESSION['navn'] header("location: in.php"); } else { echo "du er ikke logget ind"; } } ?>
Så kommer denne her fejl. Jeg har slettet brugernavn og pssword.
$db=mysql_connect("localhost", "XXXXXX", "XXXXXX"); mysql_select_db("skovsted_net", $db); mysql_close(); Warning: Cannot send session cookie - headers already sent by (output started at /customers/skovsted.net/skovsted.net/httpd.www/forbindelse.php:8) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 3
Warning: Cannot send session cache limiter - headers already sent (output started at /customers/skovsted.net/skovsted.net/httpd.www/forbindelse.php:8) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 3
Warning: Access denied for user: 'skovsted.net@localhost' (Using password: NO) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7
Warning: MySQL Connection Failed: Access denied for user: 'skovsted.net@localhost' (Using password: NO) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7
Warning: MySQL: A link to the server could not be established in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7 Access denied for user: 'skovsted.net@localhost' (Using password: NO)
login_tjek.php -------------- <?PHP session_start(); include("forbindelse.php"); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE username = '$_POST[n_navn]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_SESSION['navn'] header("location: in.php"); } else { echo "du er ikke logget ind"; } } ?> ----------------------------------
CREATE TABLE ds_members ( ID int(11) NOT NULL auto_increment, r_navn text NOT NULL, n_navn text NOT NULL, e-mail text NOT NULL, msn text NOT NULL, alder date NOT NULL default '0000-00-00', placering text NOT NULL, password varchar(40) NOT NULL default '', PRIMARY KEY (ID), UNIQUE KEY ID (ID) ) TYPE=MyISAM;
<?PHP session_start(); include("forbindelse.php"); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE username = '$_POST[n_navn]' AND password = '$_POST[password]'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_POST['n_navn']; header("location: in.php"); } else { echo "du er ikke logget ind"; } } ?> ---------------------------------------------------------------------------- in.php
Prøv at rette din login_tjek.php til: <?PHP session_start(); include("forbindelse.php"); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE n_name = '" . $_POST['n_navn'] . "' AND password = '" . $_POST['password'] . "'") or die(mysql_error()); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_POST['n_navn']; header("Location: in.php"); } else { header("Location: login.php"); } } ?>
session_start(); $db=mysql_connect("localhost", "XXXXXXX", "XXXXXX"); mysql_select_db("brugernavn", $db); mysql_close(); Warning: Access denied for user: 'skovsted.net@localhost' (Using password: NO) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7
Warning: MySQL Connection Failed: Access denied for user: 'skovsted.net@localhost' (Using password: NO) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7
Warning: MySQL: A link to the server could not be established in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7 Access denied for user: 'skovsted.net@localhost' (Using password: NO)
Warning: Access denied for user: 'skovsted.net@localhost' (Using password: NO) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 7
betyder, at du ikke logger rigtigt på din database. Selvom dit password er et tal, skal der "" udenom. Prøv at rette det i din forbindelse.php
mysql_close($db); Warning: Cannot add header information - headers already sent by (output started at /customers/skovsted.net/skovsted.net/httpd.www/forbindelse.php:7) in /customers/skovsted.net/skovsted.net/httpd.www/login_tjek.php on line 14
forbindelse.php: linie 7 = mysql_close($db); den må ikke være i forbindelse.php, da den lukke for forbindelsen til databasen, hvis den står mellem <?php og ?>. Så slet den NU. Når den ikke står mellem <?php og ?> bliver det outputtet som alm. html, og så kan du ikke anvende header() bagefter.
Det ser ud som om at når jeg i login_tjek.php har indtastet et korrekt brugernavn og password, at den ikke gemmer min session når den skal videre til in.php
$antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; <---Det lader ikke til at den bliver OK $_SESSION['navn'] = $_POST['n_navn']; header("location: in.php");
Hvis jeg i in.php fjerner ! foran $_SESSION['login'] == "OK")...siger den hejsa ...
Tyder det ikke på at den ikke gemmer min session? Jeg er nybegynder til sessions, så det kan være en indstilling i php.ini måske?
Jeg har instillet error afsnittet i php.ini til bare at vise fatale fejl: E_ERROR. Hvis den står til E_ALL, kommer der noget med header(location:in.php) fejl, og jeg har læst mig til at så snart der er sendt output er det for sent at komme med en header kommando
Den her får jeg hvis jeg taster et korrekt navn ind. Jeg har session_start() stående som det første i alle filer.
Notice: A session had already been started - ignoring session_start() in c:\inetpub\wwwroot\forbindelse.php on line 2
Warning: Cannot modify header information - headers already sent by (output started at c:\inetpub\wwwroot\forbindelse.php:2) in c:\inetpub\wwwroot\login_tjek.php on line 14
<?PHP session_start(); include("forbindelse.php"); //Tjekker om brugeren har trykket på knappen if(isset($_POST['login'])) { //Queryen som skal finde brugeren i databasen $res = mysql_query("SELECT * FROM ds_members WHERE n_navn = '$_POST[n_navn]' AND password = '$_POST[password]'"); //Her findes antallet af poster som svarer til queryen(kun en) $antal = mysql_num_rows($res); //Hvis antal er = 1 if($antal == 1) { $_SESSION['login'] = "OK"; $_SESSION['navn'] = $_POST['n_navn']; header("location: in.php"); } else { echo "Forkert kundenummer eller adgangskode"; } } ?> ------------- in.php
Notice: Undefined index: login in c:\inetpub\wwwroot\in.php on line 4
Warning: Cannot modify header information - headers already sent by (output started at c:\inetpub\wwwroot\in.php:4) in c:\inetpub\wwwroot\in.php on line 5
Samme resultat: den mangler stadig den login variabel, uden den kan maskinen jo ikke se om den er sat til OK.
Hvis jeg sender det SID med som jeg omtalte før, står SID'et på adresselinjen, også efter jeg har lukket browseren ned, knapper op for en ny og begynder at skrive localhost. Så kan en anden bruger jo bare (hvis det nu var en offentlig computer) vælge den adresse med SID'et og logge på som bruger nr. 1...
Det med at den smider sessionen væk læste jeg på http://dk.php.net/session_start Så vidt jeg kan forstå er der ikke en enkel vej at beholde den session ved header:location -->
prøv at skrive print_r($_SESSION); lige under session_start() i din in.php (evt. udkommenter resten - så udskriver den nemlig alle session til skærmen - i et array).
En session hører til det browservindue du har åbent når du sætter den - den vil eksistere i dette vindue med mindre du sletter sessionsne eller lukker dette vindue. Derfor er sessions smart ved login scripts - det kan nemlig ikke umiddelbart misbruges hvis bare browser vinduet er blevet lukket
Indtil videre har jeg bare testet på localhost, hvor jeg har været nødt til at sende SID med. Nu her til morgen lagde jeg det op på min egen hjemmeside og her er det ikke nødvendigt at sende SID med, det virker upåklageligt som du har argumenteret for hele tiden. Hvad der får min localhost til at fucke up ved jeg ikke. Kan det være en indstilling i php.ini, eller noget lignende? Jeg har samme version af php på både webhotel og lokalt, version 4.3.11
Jeg kan oprette et spørgsmål, hvis du vil ha points?
Du skal jo huske at når du retter i din php.ini så skal du genstarte din server bagefter - måske er det det? Men ja det er garanteret din php.ini der laver ged idet
Hej igen arm, sørme nok om ikke det er begyndt at drille igen.
Jeg har lagt mine filer over på en 2000 server med IIS 5, php, mySQL og skal komme efter dig.
Når jeg så vil teste mit mit login, laver den 2 sessions-filer når jeg indtaster et rigtigt password. Hvorfor nu det? Hvis jeg taster et forkert laver den bare een, som jeg mener er rigtigt. Har du nogen forklaring?
Jeg havde ingen session_start() på min login.php, som egentligt bare er HTML, men den gjorde altså en forskel. Det er bare underligt at det virker på min testmaskine og på mit webhotel uden den sessionstart i den fil. Så kan jeg endeligt komme videre med udviklingen :)
Synes godt om
Ny brugerNybegynder
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.