Avatar billede 1kjartan Nybegynder
09. februar 2009 - 23:47 Der er 25 kommentarer og
1 løsning

Begrænse adgang til database

Jeg har lavet et stykke programering hvor jeg hiver nogle informationer man selv har tilføjet til en database ud af databasen.
Mit problem er at ALLE informationer bliver vist, ikke kun dem som den bruger man er logget ind som har tilføjet.
Hvordan sætter jeg en begrænsning på så man kun ser egne tilføjelser til databasen?
Det skal lige siges jeg har bedt databasen huske hvilke brugere der tilføjer hvad, så det burde være lige til (hvis man ikke var nybegynder)
Avatar billede 1kjartan Nybegynder
09. februar 2009 - 23:50 #1
Hvis det skulle have betydning er koden jeg bruger til at trække informationerne ud nedenfor:

<?
include "dbConfig.php";

echo "<b>Dag</b><br>";
$res = mysql_query("SELECT dag FROM aftale");
while ($row = mysql_fetch_array($res))
{print $row['dag'] . "<br />";}

echo "<b>Måned</b><br>";
$res = mysql_query("SELECT month FROM aftale");
while ($row = mysql_fetch_array($res))
{print $row['month'] . "<br />";}

echo "<b>År</b><br>";
$res = mysql_query("SELECT year FROM aftale");
while ($row = mysql_fetch_array($res))
{print $row['year'] . "<br />";}

echo "<b>Beskrivelse</b><br>";
$res = mysql_query("SELECT text FROM aftale");
while ($row = mysql_fetch_array($res))
{print $row['text'] . "<br />";}
?>
Avatar billede psychopixi Nybegynder
10. februar 2009 - 00:12 #2
Følgende burde virke. Jeg går i eksemplet ud fra at brugernavnet står i tabellen 'bruger':
<?php
include "dbConfig.php";
$user = "DEN BRUGER DER ER LOGGET IND";
$res = mysql_query("SELECT * FROM aftale WHERE bruger = '$user'");
while ($row = mysql_fetch_array($res)){
    echo "<b>Dag</b><br/>" . $row['dag'] . "<br/>";
    echo "<b>Måned</b><br/>" . $row['month'] . "<br/>";
    echo "<b>År</b><br/>" . $row['year'] . "<br/>";
    echo "<b>Beskrivelse</b><br/>" . $row['text'] . "<br/>";
}
?>
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 08:57 #3
Alt jeg får vist nu er bare en blank side, også når jeg lægger det ind på members.php siden hvor man er logget ind. Og den bruger jeg er logget ind med har selvfølgelig tilføjet noget.

Alt jeg ændrede var denne linje:
$res = mysql_query("SELECT * FROM aftale WHERE bruger = '$user'");

Til dette:
$res = mysql_query("SELECT * FROM aftale WHERE user = '$user'");

Da min tabel hedder user, burde det ikke være rigtigt?

Hvis jeg kun skriver:
<?php
include "dbConfig.php";
$res = mysql_query("SELECT * FROM aftale");
while ($row = mysql_fetch_array($res)){
    echo "<b>Dag</b><br/>" . $row['dag'] . "<br/>";
    echo "<b>Måned</b><br/>" . $row['month'] . "<br/>";
    echo "<b>År</b><br/>" . $row['year'] . "<br/>";
    echo "<b>Beskrivelse</b><br/>" . $row['text'] . "<br/>";
}
?>
Viser den igen samtlige aftaler, så går ud fra det bare er en lille fejl?
Avatar billede psychopixi Nybegynder
10. februar 2009 - 10:40 #4
Hvilken variabel indeholder navnet på den bruger der er logget ind?
Det må vel være gemt i en session variabel?
Avatar billede dkfire Nybegynder
10. februar 2009 - 11:11 #5
Hvordan ser din tabel "aftale" ud ?
Indeholder feltet user din brugers navn ?
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 11:16 #6
Jeg tror ikke jeg rigtig forstår hvad du mener..
Når man er logget ind er ens bruger-id vist sådan:
echo "<p><b>User ID:</b> " . $_SESSION["valid_id"];

Hvis du henviser til hvordan jeg gemmer brugernavnet i databasen ser min database således ud:
id     int(11)    Nej             auto_increment       
dag     int(11)    Ja     NULL        
month     char(3)    Ja     NULL        
year     int(4)    Ja     NULL        
text     text    Ja     NULL        
user     int(255)    Ja     NULL

(undskyld hvis det står lidt forskudt)
Avatar billede michael_stim Ekspert
10. februar 2009 - 11:23 #7
$res = mysql_query("SELECT * FROM aftale WHERE `user` = '". $user ."'");

//Prøv den.
Avatar billede dkfire Nybegynder
10. februar 2009 - 12:40 #8
Nok nærmere:
$res = mysql_query("SELECT * FROM aftale WHERE `user` = ". $_SESSION['vaild_id']);

Da user er et tal og går du fra det tal er et id nummer på brugeren.

Og så skal vi vist lige have noget klaret. En database er en samling tabeller. En tabel er en samling rækker og kolonner.

Din database indeholder bl.a. tabellen aftale.
Din tabel aftale består af kolonnerne/felterne (samt deres typer):
id    int(11)    Nej            auto_increment     
dag    int(11)    Ja    NULL       
month    char(3)    Ja    NULL       
year    int(4)    Ja    NULL       
text    text    Ja    NULL       
user    int(255)    Ja    NULL
Avatar billede michael_stim Ekspert
10. februar 2009 - 13:19 #9
Det tager MySQL nu ikke så tungt. Men ja, skal det være korrekt, er det uden ' ' i o m det er number.
Avatar billede michael_stim Ekspert
10. februar 2009 - 13:20 #10
Men hvad er int(255)? (user)
Avatar billede stagedk Nybegynder
10. februar 2009 - 18:08 #11
den fejl du laver er at du beder databasen om at vælge Alle celler i din tabel da du har skrevet flg:


mysql_query("SELECT * FROM users");
du beder derfor ikke databasen om kun at vælge en celle, men derimod alle entries i tabellen.

mysql_query("SELECT * FROM users where user = $user");
her beder du om at databasen kunder sender informationer ud fra tabellen hvor brugernavnet indgår i user feltet :).
håber det var nok forklaring
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 20:57 #12
Tja jeg er vist ved at blive besværlig..
Med michael_stim's metode viser den igen intet, og med de efterfølgende 2 siger den fejl i linje 109. Linje 109 ser sådan ud:
while ($row = mysql_fetch_array($res))

Michael_stim:
int(255) er (som jeg fik det forklaret)der hvor brugernummeret på den der har tilføjet noget til databasen bliver husket, det skulle bruges nar jeg nu skal hente informationerne ud. 255 er det antal af brugere den højst kan huske.
Avatar billede psychopixi Nybegynder
10. februar 2009 - 21:41 #13
#12
Lige en note til din egen forklaring: int(256) betyder et heltal med op til 256 tegn hvis den er unsigned og 255 tegn hvis den er signed. (hvorvidt det er indstillet om det kan lade sig gøre at have negative tal)
Avatar billede dkfire Nybegynder
10. februar 2009 - 21:50 #14
Du bliver nød til at vise os HELE din kode for at vi kan hjælpe dig. Du har ikke 109 linjer i det som du har vist.

En anden ting er at du har misforstået tallet i parentes.
Tallet angiver max bredden af det tal som du har tænkt dig at gemme i feltet. Du har her valgt at sætte bredden til 255 karakterer.
For et int felt kan du gemme en værdi op til 4294967295, lige meget hvad du sætter tallet i parentesen til.
For at få lidt mere viden, så kig her:
http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

Og den skarpe hjerne vil bemærke at der ikke er 255 karakterer i den værdi som int kan indeholde .
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 22:03 #15
Så må jeg jo vise jer hele koden (:

<?php
session_start();
if (!$_SESSION["valid_user"])

{echo "<script language='javascript'>window.location = 'login.php?op=thanks'</script>";}

echo "<p><b>User ID:</b> " . $_SESSION["valid_id"];
echo "<p><b>Username:</b> " . $_SESSION["valid_user"];
echo "<p><b>Logged in:</b> " . (Date("l d/m, Y"));
?>
<br><br> 

<?php
# PHP Calendar (version 2.3), written by Keith Devens
# http://keithdevens.com/software/php_calendar
#  see example at http://keithdevens.com/weblog
# License: http://keithdevens.com/software/license

function generate_calendar($year, $month, $days = array(), $day_name_length = 3, $month_href = NULL, $first_day = 0, $pn = array()){
    $first_of_month = gmmktime(0,0,0,$month,1,$year);
    #remember that mktime will automatically correct if invalid dates are entered
    # for instance, mktime(0,0,0,12,32,1997) will be the date for Jan 1, 1998
    # this provides a built in "rounding" feature to generate_calendar()

    $day_names = array(); #generate all the day names according to the current locale
    for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400) #January 4, 1970 was a Sunday
        $day_names[$n] = ucfirst(gmstrftime('%A',$t)); #%A means full textual day name

    list($month, $year, $month_name, $weekday) = explode(',',gmstrftime('%m,%Y,%B,%w',$first_of_month));
    $weekday = ($weekday + 7 - $first_day) % 7; #adjust for $first_day
    $title  = htmlentities(ucfirst($month_name)).' '.$year;  #note that some locales don't capitalize month and day names

    #Begin calendar. Uses a real <caption>. See http://diveintomark.org/archives/2002/07/03
    @list($p, $pl) = each($pn); @list($n, $nl) = each($pn); #previous and next links, if applicable
    if($p) $p = '<span class="calendar-prev">'.($pl ? '<a href="'.htmlspecialchars($pl).'">'.$p.'</a>' : $p).'</span> ';
    if($n) $n = ' <span class="calendar-next">'.($nl ? '<a href="'.htmlspecialchars($nl).'">'.$n.'</a>' : $n).'</span>';
    $calendar = '<table class="calendar">'."\n".
        '<caption class="calendar-month">'.$p.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).$n."</caption>\n<tr>";

    if($day_name_length){ #if the day names should be shown ($day_name_length > 0)
        #if day_name_length is >3, the full name of the day will be printed
        foreach($day_names as $d)
            $calendar .= '<th abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';
        $calendar .= "</tr>\n<tr>";
    }

    if($weekday > 0) $calendar .= '<td colspan="'.$weekday.'"> </td>'; #initial 'empty' days
    for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++){
        if($weekday == 7){
            $weekday  = 0; #start a new week
            $calendar .= "</tr>\n<tr>";
        }
        if(isset($days[$day]) and is_array($days[$day])){
            @list($link, $classes, $content) = $days[$day];
            if(is_null($content))  $content  = $day;
            $calendar .= '<td'.($classes ? ' class="'.htmlspecialchars($classes).'">' : '>').
                ($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
        }
        else $calendar .= "<td>$day</td>";
    }
    if($weekday != 7) $calendar .= '<td colspan="'.(7-$weekday).'"> </td>'; #remaining "empty" days

    return $calendar."</tr>\n</table>\n";
}

$month = (isset($_GET['m']) && is_numeric($_GET['m']) && $_GET['m'] > 0 && $_GET['m'] < 13) ? intval($_GET['m']) : date('n');
$year  = (isset($_GET['y']) && is_numeric($_GET['y'])) ? intval($_GET['y']) : date('Y');

if($month == 12){
    $next_month = 1;
    $next_year  = $year + 1;
}else{
    $next_month = $month + 1;
    $next_year  = $year;
}

if($month == 1){
    $prev_month = 12;
    $prev_year  = $year - 1;
}else{
    $prev_month = $month - 1;
    $prev_year  = $year;
}

$pn = array('«'=>'?m='.$prev_month.'&y='.$prev_year, '»'=>'?m='.$next_month.'&y='.$next_year);

setlocale(LC_TIME, 'da','dan','da_DK','da_DK.ISO8859-1','danish');
echo generate_calendar($year, $month, NULL, 3, NULL, 0, $pn);
?>
<br>

<?
echo "<p>Klik <a href=\"aftale.php\">her</a> for at lave en aftale</p>";
echo "<p>Klik <a href=\"logout.php\">her</a> for at logge ud</p>";
?>

<?
include "dbConfig.php";
$user = "DEN BRUGER DER ER LOGGET IND";
$res = mysql_query("SELECT * FROM aftale WHERE `user` = ". $_SESSION['vaild_id']);
while ($row = mysql_fetch_array($res))
{    echo "<b>Dag</b><br/>" . $row['dag'] . "<br/>";
    echo "<b>Måned</b><br/>" . $row['month'] . "<br/>";
    echo "<b>År</b><br/>" . $row['year'] . "<br/>";
    echo "<b>Beskrivelse</b><br/>" . $row['text'] . "<br/>";
}
?>

Nu har i fået hele members.php siden. Der er som i kan se en kalender på den, og det er til sidst jeg vil vise de aftaler der er tilføjet.
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 22:07 #16
jeg fjernede forresten et par linjer da jeg kopierede det ind, så fejlen ligger ifølge min browser i linje 101 nu
Avatar billede dkfire Nybegynder
10. februar 2009 - 22:12 #17
Prøv at tilføje:
$res = mysql_query("SELECT * FROM aftale WHERE `user` = ". $_SESSION['vaild_id']) or die(mysql_error());
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 22:15 #18
Nu får jeg følgende besked:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Avatar billede dkfire Nybegynder
10. februar 2009 - 22:25 #19
Jamen så er der jo noget galt med den sql.
Indeholder $_SESSION['valid_id'] noget ??
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 22:27 #20
jeg tror ikke jeg forstår dig helt, hvis jeg gør indeholder den et tal som er brugerens bruger-id?
Avatar billede dkfire Nybegynder
10. februar 2009 - 22:34 #21
Prøv at rette :
$res = mysql_query("SELECT * FROM aftale WHERE `user` = ". $_SESSION['vaild_id']) or die(mysql_error());

til
echo "User ID: ".$_SESSION['valid_id'];
$sql = "SELECT * FROM aftale WHERE `user` = ". $_SESSION['vaild_id'];
echo "Sql: ".$sql;
$res = mysql_query($sql) or die(mysql_error());
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 22:41 #22
det giver følgende meddelelse:
User ID: 6Sql: SELECT * FROM aftale WHERE `user` = You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Avatar billede dkfire Nybegynder
10. februar 2009 - 22:42 #23
Arggh jeg kan heller ikke stave, min fejl.

$sql = "SELECT * FROM aftale WHERE `user` = ". $_SESSION['valid_id'];
Avatar billede 1kjartan Nybegynder
10. februar 2009 - 22:54 #24
Hvor er det fantastisk :D
Den skriver nu kun de aftaler fra den bruger man er logget ind som!
dkfire:
Smid et svar, så giver jeg point og lukker :)

Tusind tak for hjælpen og interessen fra jer (og læsestof til at lære mere)
Avatar billede dkfire Nybegynder
11. februar 2009 - 09:05 #25
Og et svar fra mig.
Det er ikke sådan når i og l kan ligne meget hinanden. ;-)
Avatar billede 1kjartan Nybegynder
11. februar 2009 - 12:23 #26
Haha og det sjove er jeg først selv kan se fejlen i det nu, gloede på det 20 minutter i går fordi jeg syns der stod det samme ;)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester