Her får du hjelp til å lage hjemmeside med video. Alle verktøy og programmer vi bruker til å lage webside er gratis.
Innlogging, database og sessions i PHP
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?
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.
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.
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:
- gå til
vis-session.php
- gå til
sett-sessions.php
, så tilvis-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.
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:
- La brukere logge på
- Sjekke brukernavn og passord
- Sette sessions hvis de er registrert
- Beskytte medlemssider for de som har satt sessions
Med andre ord kan man gjøre slik at kun innloggede har tilgang til medlemssidene.
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 } ?>Ja, da blir det jo opp til deg om du vil endre det for å ta ibruk sessions eller ei?
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.
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:
- Ser om brukeren har logget inn med korrekte detaljer. Hvis ja, så setter den sessions og videresender til medlemssidene.
- 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.
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. :)
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).
Jeg skjønner ikke hvorfor du overkompliserer, se på dette skjemaet:
Flow i login scriptet

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.
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)?
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.
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';
}
?>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.
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.
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
.


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