webForumDet fria alternativet

Kolla att man inloggad innan nerladdning

PHP

22 svar · 1 110 visningar · startad av Nina

Medlem sedan feb. 200358 inlägg
Frågan#1

Har lyckats få ihop en medlemsdatabas med inloggning, registrering osv, nu skulle jag vilja använda det ihop med min kodning för mina zipfiler.
Alltså har då en productlist.php där alla zipfiler visas, klickar man på download så kommer man via en download.php rätt zipfil, använder mig av header (Location $downloadlink); funktion.

Det jag nu skulle vilja är att innan man kommer till rätt zipfil så ska det ckecka av att man är inloggad då jag vill enbart att medlemmar ska ha tillgång till denna mapp.

har försökt använda mig av dne här kod snutten

<?php
session_start();

if (!(isset($username) || isset($siteuser))) // user not login, redirect to login page
{
Header("Location: login.html");
}

else { // add item

// either use cookie or database to store item.

}
?>

ihop med min download.php kod men den fattar inte om jag är inloggad eller inte utan kommer alltid åt zip filen eller så kommer jag enbart till inloggnings sidan

Tacksam för tips
/Nina

Medlem sedan juni 20006 031 inlägg
#2

Förmodar att du använder session för att ha koll på inloggad, och att den är satt tidigare. (session_user byter du till den session som är satt)

<?php
session_start();

// Kolla om medlemmen är inloggad.
if (!isset($_SESSION['session_user'])){ 
  header("Location: login.html"); 
  exit; 
}

// Här kommer koden om inloggad....
?>
Medlem sedan feb. 200358 inlägg
#3

I inloggnings filen så står det såhär

   
$query = "SELECT username, memberpass from members 
where username='$username' and memberpass='$enc_pass' ";

$result= mysql_query($query) or die
("Could not execute query : $query." . mysql_error());

if (mysql_num_rows($result) != "0") // username and pass match, authenticate user
{
session_register($username); // session register the username
setcookie ("siteuser",$username,time()+604800); // set cookie containing username 
Header("Location: product.php");

} 

else { // user is not authenticated
echo "Error! Username and password does not match or no such user.";
}

ska jag byta det till

session_register

i download.php
sen har jag loginsucces.php och checkuser.php filer

Medlem sedan aug. 20002 975 inlägg
#4

Du kan göra så här på sidor du vill skydda med din inloggning:

<?php // <-- Översta raden längs till vänster

session_start();

if ( !isset($_SESSION['username']) ) // user not login, redirect to login page
{
   header("Location: login.html");
   exit;
}

// Här kan du lägga in det du vill ha skyddat med din inloggning

?>
<!-- Och för den delen även här :) -->
Medlem sedan feb. 200358 inlägg
#5

Jag börjar tro jag har fel nånstans på koden eller så har jag huvudet i sanden för jag kan alltås inte få det att fungera :(

det här är koden på själva download.php den som skickar en till rätt zip fil

$dbname = 'xxxxx';   // the name of the database 
$dbhost = 'localhost';   // 99% chances you won't need to change this value 
$dbusername = 'xxxxx'; // your MySQL username 
$dbpassword = 'xxxxx';    

$connection=mysql_connect($dbhost, $dbusername, $dbpassword) or die(mysql_error()); 
$dbase=mysql_select_db($dbname) or die(mysql_error()); 

$q="SELECT * from graphics where graphics_id='$id'"; 
$result= mysql_query($q, $connection) or die 
("Could not execute query : $q." . mysql_error()); 

while ($row = mysql_fetch_array($result)) 
{ 
$id=$row["graphics_id"]; 
$name=$row["graphics_name"]; 
$cat_id=$row["category_id"]; 
$designer=$row["designer"]; 
$email=$row["email"]; 
$date=$row["date"]; 
$image=$row["image"]; 
$dsc = $row["description"]; 
$viewlink=$row["viewlink"]; 
$downloadlink=$row["downloadlink"]; 
$views = $row["views"]; 
$downloads = $row["downloads"]; 

header('Location:' .$downloadlink); 

$q="update graphics set downloads=downloads+1 where graphics_id='$id'"; 
$result2= mysql_query($q, $connection) or die 
("Could not execute query 2 : $q." . mysql_error());

Det är alltså den jag vill ska skyddas från icke medlemmar.
När jag in allt ihop så kom jag ingen vart från sidan där jag klickade på download länken.

Medlem sedan aug. 20002 975 inlägg
#6
<?php // <-- Översta raden längs till vänster

// Följande två rader är för felsökning och kan tas bort när allt fungerar
error_reporting(E_ALL);
ini_set("display_errors", "1");

session_start();

if ( !isset($_SESSION['username']) ) // user not login, redirect to login page
{
   header("Location: login.html");
   exit;
}

$dbname = 'xxxxx';   // the name of the database 
$dbhost = 'localhost';   // 99% chances you won't need to change this value 
$dbusername = 'xxxxx'; // your MySQL username 
$dbpassword = 'xxxxx';    

$connection=mysql_connect($dbhost, $dbusername, $dbpassword) or die(mysql_error()); 
$dbase=mysql_select_db($dbname) or die(mysql_error()); 

$q="SELECT * from graphics where graphics_id='$id'"; 
$result= mysql_query($q, $connection) or die 
("Could not execute query : $q." . mysql_error()); 

while ($row = mysql_fetch_array($result)) 
{

// Och så vidare

Ligger login.html i samma katalog som download.php ?
Inkluderar du download.php i någon annan fil ?

Medlem sedan feb. 200358 inlägg
#7

Nä, login ligger i en egen mapp tillsammans med resten av medlems koderna, login, register m.m Kom på att dom kanske ska ligga i samma mapp?
download.php är inte includerat i någon annan fil mer än att den är en länk från productlist.php till download.php vilket innehåller koden ovan

Medlem sedan aug. 20002 975 inlägg
#8

Du kan gott ha en egen mapp för inloggning m.m.
Du behöver bara dirigera headern till rätt mapp.

header("Location: /mapp/login.html");

Kör sen koden jag gav dig. Antingen kommer du in på sidan, då är du inloggad, eller så skickas du till login.php, då är du inte inloggad, eller så får du ett eller flera felmeddelande, då har du något fel på sessionshanteringen på servern, eller så har du en PHP-version som är äldre än 4.1.0.

Medlem sedan feb. 200358 inlägg
#9

Kommer enbart in till login sidan helatiden nu, så antagligen registrerar den inte att jag är inloggad, även om jag kommer in till loginsucces.php
Jag har PHP Version 4.3.4

Medlem sedan aug. 20002 975 inlägg
#10

Har du session_start() överst på inloggningssidan ?

Testar du på en lokal maskin, eller testar du på ett webbhotell ?

Vill du för en test se om sessionsvariabler är satta så lägg följande rader på sidan efter inloggning:

echo "<pre";
print_r($_SESSION);
echo "</pre";

Dessa rader ska ligga någonstans efter session_start().

Medlem sedan feb. 200358 inlägg
#11

Jag kör på webbhotell. Alla sidor som är kopplat till productlist.php har och medlemmar att göra startar med
<?php
session_start();

Hrmm menar du på en sidan man kommer till direkt efter inloggningen? För det gjorde ingen skillnad

Vet inte om det har något med saken att göra men tabellerna heter olika men ligger i samma databas, alltså zipfilerna ligger i tabellen graphics medans medlemmar ligger i tabellen members.

Medlem sedan aug. 20002 975 inlägg
#12

Skrev visst lite fel i kontrollkoden :)

Dessa rader som läggs in efter session_start någonstans

echo "<pre>";
print_r($_SESSION);
echo "</pre>";

ska skriva ut eventuella sessionsvariabler. Finns inga sessionsvariabler satta så skrivs det ut följande:

Array
(
)

Det var en test för att se om det satts några sessionsvariabler vid inloggningen.
Det är nämligen kontroll av om denna sessionsvariabel finns, som avgör om man kan ladda ner eller skickas till login.

Vad jag först ville kolla upp var om några sessionsvariabler överhuvud taget sattes vid inloggningen.

I vissa versioner av IIS går det inte att sätta en sessionscookie i samma skript som man senare använder en header("Location: "), och då kommer istället en ny session att skapas på nästa sida med session_start, en session som inte har med dina sessionsvariabler.

Medlem sedan feb. 200358 inlägg
#13

Oki, ska testa igen då :)

Medlem sedan feb. 200358 inlägg
#14

Hrmm fick det här som svar

Array
(
[laponja] =>
)

Warning: Cannot modify header information - headers already sent by (output started at /home/nina73/public_html/web/graphics/itemdown.php:4) in /home/nina73/public_html/web/graphics/itemdown.php on line 35

Fattade inte mycket av det här

Medlem sedan aug. 20002 975 inlägg
#15

Nina skrev:

Hrmm fick det här som svar

Array
(
[laponja] =>
)

Warning: Cannot modify header information - headers already sent by (output started at /home/nina73/public_html/web/graphics/itemdown.php:4) in /home/nina73/public_html/web/graphics/itemdown.php on line 35

Fattade inte mycket av det här

Men det säger mig en del :)

Vid inloggningen, ändra:

session_register($username);

till

session_register('username');

Sen det andra headerfelet orsakas av vår felsökningskod. Tar du bort felsökningskoden med print_r() så ska det nog fungera.

Medlem sedan feb. 200358 inlägg
#16

Jippiieee, tack snälla du är guld värd, det fungerar *dansar på bordet*
Tack snälla!

Medlem sedan feb. 200358 inlägg
#17

Nu är jag här igen med samma error på registrerings sidan, det felet kom efter att jag la in skicka mailkod

Warning: Cannot modify header information -
headers already sent by
(output started
at /home/public_html/web/members/register.php:77) in /home/public_html/web/members/register.php on line 79

Kan inte hitta felet
Här är register.php koden

$connection=mysql_connect($dbhost, $dbusername, $dbpassword) or die(mysql_error()); 
$dbase=mysql_select_db($dbname) or die(mysql_error()); 

// start tutorial code, check form for valid inputs.

// Check that user entered all required fields.
if (empty($memberpass) || empty($memberpass2) || empty($username) 
|| empty($email) || empty($profil))
{
// Cause script to exit with the following error message.
die ("Error! All fields are required. Please try again!"); 
} 

// Check that the 2 passwords match
if ($memberpass != $memberpass2)
{
die ("Error! Passwords do not match. Please try again.");
}

// Check that email is of correct format. ie. [email]user@domain.com[/email] format
if(!eregi('^([._a-z0-9-]+[._a-z0-9-]*)@(([a-z0-9-]+\.)*
([a-z0-9-]+)(\.[a-z]{2,3})?)$', $email)) 
{
die ("Error! $email does not look like valid email address.");
}

// Check that username is within limits (ie, 1< username < 50)
// strlen is a php function to calculate the length of a string.
If (strlen($username)<2 |
| strlen($username) >50 )
{
die ("Error! Username must be between 1 to 50 characters.");
}
// Check that password are within limits. (ie. 6 < memberpass < 10)
if (strlen($memberpass)<6 
|| strlen($memberpass) >10 )
{
die ("Error! password must be between 6 to 10 characters.");
} 

// Now that we have checked the input, its time to process them.

// First, encrypt password with hash function.

$enc_pass = md5($memberpass);

$query = "INSERT into members (member_id,username,email,memberpass,url, profil) 
VALUES ('','$username','$email','$enc_pass','$url','$profil')";
$result= mysql_query($query) or die
("Could not execute query : $query." . mysql_error());

if ($result)
{
$member_id = mysql_insert_id(); 
 // Let's mail the user! 
 $subject = "Your Membership at MyWebsite!"; 
$message = "Dear $username 
Thank you for registering at our website, 
[url]http://www.xxxx.com[/url] ! 
You are two steps away from logging in and accessing our exclusive members area. 
To activate your membership, 
please click here: 
[url]http://www.xxxx.com/activate.php?id=
[/url]$userid&code=$db_password 
Once you activate your memebership, you will be able to login 
with the following information: 
Username: $username 
Password: $memberpass 
Thanks! 
The Webmaster 
This is an automated response, please do not reply!";  
mail($email, $subject, $message,  
"From: MyDomain Webmaster< [email]xxx@xxxx.com[/email]>\n 
X-Mailer: PHP/" . phpversion()); 
echo 'Your membership information has been mailed to your email address! 
Please check it and follow the directions!';    
session_register('username'); // session register the username
setcookie ("siteuser",$username,time()+604800); // set cookie containing username 
echo "Tack för att du registerade dig."; // you can also login member directly.
echo "<p>Click <a href=memberprofile.php>here</a> Alla medlemmar.</p>";
} 
?>
Medlem sedan aug. 20002 975 inlägg
#18
echo 'Your membership information has been mailed to your email address! 
Please check it and follow the directions!';    
session_register('username'); // session register the username
setcookie ("siteuser",$username,time()+604800); // set cookie containing username

setcookie är en header, och som alla headers måste den sättas innan något annat skickas till webbläsaren.
Alltså före en header får du inte ha någon HTML-kod, ingen echo eller print, inte ens ett mellanslag eller radbrytning utanför PHP-taggarna. Detta gäller även för filer du inkluderar före en header.

Andra headers är t.ex session_start() eller header().

Lösningen i det här fallet är att flytta ner din echo-sats till efter setcookie().

Medlem sedan feb. 200358 inlägg
#19

Hrmm så enkelt. Tack så jätte mycket det fungerar alldeles utmärkt och skickar mail och allt *S*
Några bra förslag på böcker för en nybörjare att börja med?

Medlem sedan aug. 20002 975 inlägg
#20

Tyvärr vågar jag inte rekommendera någon bok, då jag inte har något som hels begrepp av hur de står sig inbördes.

Det jag kan säga är att du ska köpa en bok som är reviderad sista 1-1½ året någonting.
Äldre böcker kan leda dig på avvägar i exempel.

Du ska däremot få en länk som du kan ha nytta av om du kör Windows.
Det är PHP-manualen inklusive användarnoteringarna, i chm-format, som du kan ha lokalt på din maskin. Speciellt användarnoteringarna är guld värda.

Länken: http://weblabor.hu/php-doc-chm/

264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)