Vinnaren i pepparkakshustävlingen!
2020-12-15, 07:07
  #1
Medlem
Ontogeness avatar
Jag har ett .php-dokument som egentligen nästan bara innehåller HTML och sen har jag ytterligare ett .php-dokument med kod som exekveras när användaren klickar på en knapp.

Kod:
<?php
    session_start
();
?>

<!DOCTYPE html>

<html lang="en">

<head>
    <title>Flimmer Forum</title>
    <meta charset="UTF-8">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Open+Sans&family=Texturina&display=swap" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
    <header>
        <h1>Flimmer <span>Forum</span></h1>
        <nav>
            <ul>
            <?php
            
if(isset($_SESSION['username'])) {
                echo 
'<li><a href="profile.php">Profile</a></li>';
                echo 
'<li><a href="includes/logout.inc.php">Log Out</a></li>';
            }

            else {
                echo 
'<li><a href="login.php">Log In</a></li>';
                echo 
'<li><a href="register.php">Register</a></li>';
            }
            
?>
            </ul>
        </nav>
    </header>
    <div class="profilecontainer">
        <div class="profilename">
            <?php
            
echo '<p>' $_SESSION['username'] . '</p>';
            
?>
        </div>
        <div class="profilepicture">
            <img src="img/flimmer/default_user.png" width="125" height="125" alt="profilepicture">
        </div>
        <div class="profilesettings">
            <a href="uploadprofilepic.php">Upload profile picture</a>
        </div>
        <form action="includes/uploadprofilepic.inc.php" method="post" enctype="multipart/form-data">
            <input type="file" name="file" class="fileupload"><br>
            <button type="submit" name="submit" class="fileuploadbutton">Upload</button>
        </form>
    </div>
</body>

</html>

Kod:
<?php

session_start
();
echo 
session_id();

if(isset(
$_POST['submit'])) {

    
session_start();
    echo 
session_id();

    
$file $_FILES['file'];

    
$filename $_FILES['file']['name'];
    
$filetype $_FILES['file']['type'];
    
$filesize $_FILES['file']['size'];
    
$temp_location $_FILES['file']['tmp_name'];
    
$error $_FILES['file']['error'];

    
$fileExt explode('.'$filename);
    
$actualFileExt strtolower(end($fileExt));

    
$allowedFiles = array('jpg''jpeg''png');

    if(
in_array($actualFileExt$allowedFiles)) {

        if(
$error === 0) {

            if(
$filesize 500000) {

                
$newFileName uniqid(''true) . '.' $actualFileExt;
                
$fileDestination '../img/profilepics/' $newFileName;
                
move_uploaded_file($temp_location$fileDestination);

                
header('Location: ../uploadprofilepic.php?success=upload_success');
                exit();

            }
        }

        else {
            
header('Location: ../uploadprofilepic.php?error=unknown_error');
            exit();
        }
    }

    else {
        
header('Location: ../uploadprofilepic.php?error=incorrect_file_format');
        exit();
    }
}

Som ni ser i det andra dokumentet så kör jag session_start() och i testsyfte så försöker jag köra en echo på session_id() vilket inte fungerar, och jag har heller inte tillgång till $_SESSION['username']/$_SESSION['id'] som t.ex. fungerar i det förstnämnda dokumentet.

Jag håller på att bygga en funktion där användare i en databas kan ladda upp profilbilder och då måste den uppladdade bilden visas enbart för den användaren, således behöver jag ha tillgång till antingen id eller användarnamn då dessa är kolumner i min databas som sedan kan länkas samman med ett id som genereras för varje uppladdad bild. Om id:t för en bild är "123" så kommer jag sedan ha en if-sats eller liknande som kommer vara något i stil med "om användaren har id 1 så ska bild "123" visas.

Hur kommer det sig att jag i detta dokument inte har tillgång till några session-variabler trots det att en session är startad? Kan det bero på att det andra .php-dokumentet finns i en annan mapp?
Citera
2020-12-15, 07:41
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Ontogenes
Jag har ett .php-dokument som egentligen nästan bara innehåller HTML och sen har jag ytterligare ett .php-dokument med kod som exekveras när användaren klickar på en knapp.

Kod:
<?php
    session_start
();
?>

<!DOCTYPE html>

<html lang="en">

<head>
    <title>Flimmer Forum</title>
    <meta charset="UTF-8">
    <link rel="preconnect" href="https://fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css2?family=Open+Sans&family=Texturina&display=swap" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
    <header>
        <h1>Flimmer <span>Forum</span></h1>
        <nav>
            <ul>
            <?php
            
if(isset($_SESSION['username'])) {
                echo 
'<li><a href="profile.php">Profile</a></li>';
                echo 
'<li><a href="includes/logout.inc.php">Log Out</a></li>';
            }

            else {
                echo 
'<li><a href="login.php">Log In</a></li>';
                echo 
'<li><a href="register.php">Register</a></li>';
            }
            
?>
            </ul>
        </nav>
    </header>
    <div class="profilecontainer">
        <div class="profilename">
            <?php
            
echo '<p>' $_SESSION['username'] . '</p>';
            
?>
        </div>
        <div class="profilepicture">
            <img src="img/flimmer/default_user.png" width="125" height="125" alt="profilepicture">
        </div>
        <div class="profilesettings">
            <a href="uploadprofilepic.php">Upload profile picture</a>
        </div>
        <form action="includes/uploadprofilepic.inc.php" method="post" enctype="multipart/form-data">
            <input type="file" name="file" class="fileupload"><br>
            <button type="submit" name="submit" class="fileuploadbutton">Upload</button>
        </form>
    </div>
</body>

</html>

Kod:
<?php

session_start
();
echo 
session_id();

if(isset(
$_POST['submit'])) {

    
session_start();
    echo 
session_id();

    
$file $_FILES['file'];

    
$filename $_FILES['file']['name'];
    
$filetype $_FILES['file']['type'];
    
$filesize $_FILES['file']['size'];
    
$temp_location $_FILES['file']['tmp_name'];
    
$error $_FILES['file']['error'];

    
$fileExt explode('.'$filename);
    
$actualFileExt strtolower(end($fileExt));

    
$allowedFiles = array('jpg''jpeg''png');

    if(
in_array($actualFileExt$allowedFiles)) {

        if(
$error === 0) {

            if(
$filesize 500000) {

                
$newFileName uniqid(''true) . '.' $actualFileExt;
                
$fileDestination '../img/profilepics/' $newFileName;
                
move_uploaded_file($temp_location$fileDestination);

                
header('Location: ../uploadprofilepic.php?success=upload_success');
                exit();

            }
        }

        else {
            
header('Location: ../uploadprofilepic.php?error=unknown_error');
            exit();
        }
    }

    else {
        
header('Location: ../uploadprofilepic.php?error=incorrect_file_format');
        exit();
    }
}

Som ni ser i det andra dokumentet så kör jag session_start() och i testsyfte så försöker jag köra en echo på session_id() vilket inte fungerar, och jag har heller inte tillgång till $_SESSION['username']/$_SESSION['id'] som t.ex. fungerar i det förstnämnda dokumentet.

Jag håller på att bygga en funktion där användare i en databas kan ladda upp profilbilder och då måste den uppladdade bilden visas enbart för den användaren, således behöver jag ha tillgång till antingen id eller användarnamn då dessa är kolumner i min databas som sedan kan länkas samman med ett id som genereras för varje uppladdad bild. Om id:t för en bild är "123" så kommer jag sedan ha en if-sats eller liknande som kommer vara något i stil med "om användaren har id 1 så ska bild "123" visas.

Hur kommer det sig att jag i detta dokument inte har tillgång till några session-variabler trots det att en session är startad? Kan det bero på att det andra .php-dokumentet finns i en annan mapp?
Du har 2 session_start i ditt andra dokument, varför? Misstänker att din andra session_start kommer skriva över din föregående.

session_start behöver du köra en gång innan du använder dina sessionsvariabler, antingen när du sätter dem eller när du ska läsa av dem, men de måste som bekant ske innan nån utdata till klienten skickats.

Så, i ditt andra dokument föreslår jag att du gör dig av med en av dina session_start och eventuellt bara använder den som finns i din post-if.
Citera
2020-12-15, 07:54
  #3
Medlem
Ontogeness avatar
Citat:
Ursprungligen postat av Proton
Du har 2 session_start i ditt andra dokument, varför? Misstänker att din andra session_start kommer skriva över din föregående.

session_start behöver du köra en gång innan du använder dina sessionsvariabler, antingen när du sätter dem eller när du ska läsa av dem, men de måste som bekant ske innan nån utdata till klienten skickats.

Så, i ditt andra dokument föreslår jag att du gör dig av med en av dina session_start och eventuellt bara använder den som finns i din post-if.

Oj, hade inte märkt det.

Nu har jag enbart en session_start() i min if-sats och testade även att köra en echo session_id() samt en echo $_SESSION['username'], men det fungerar tyvärr inte. Saken är den att mina sessions-variabler fungerar i samtliga dokument som finns i root-mappen, men det andra dokumentet jag postade finns i en separat includes-mapp, och dessa .php-dokument verkar inte ha någon åtkomst till sessions-variablerna. Det känns lite som att jag är utanför dess scope så att säga...

Jag har även testat att skriva ett separat dokument för sessions-starten och sedan köra require/include i "uploadprofilepic.inc.php" (det andra dokumentet) men det vill sig inte heller :/
Citera
2020-12-15, 13:11
  #4
Medlem
Citat:
Ursprungligen postat av Ontogenes
Nu har jag enbart en session_start() i min if-sats och testade även att köra en echo session_id() samt en echo $_SESSION['username'], men det fungerar tyvärr inte.
Eventuellt så kan det vara bättre att använda var_dump() (eller liknande, eftersom det är PHP så finns det som vanligt överlappningar ) istället för echo, eftersom echo typomvandlar saker till strängar och det fungerar kanske inte alltid som man väntade sig:
Kod:
php > var_dump((string) false);
string(0) ""
php > var_dump((string) true);
string(1) "1"
Om du tittar på PHP: session_id - Manual så ser du att den kan returnera både en tom sträng och false(som båda ger samma utskrift med echo).

Citat:
Ursprungligen postat av Ontogenes
Saken är den att mina sessions-variabler fungerar i samtliga dokument som finns i root-mappen, men det andra dokumentet jag postade finns i en separat includes-mapp, och dessa .php-dokument verkar inte ha någon åtkomst till sessions-variablerna. Det känns lite som att jag är utanför dess scope så att säga...
"Scope" för sessionen har ingenting med mappstrukturen på servern att göra, utan det handlar bara om att sessionen ska vara startad och vilket sessions-ID som användarens webläsare skickat in i headern. Sen så finns det data som finns sparat för det sessions-ID:t - om något finns sparat - i superglobalen $_SESSION.

Edit:
Kod:
var_dump(session_start());
var_dump(session_id());
$_SESSION['test'] = 'test';
var_dump(session_start());
var_dump(session_id());
var_dump($_SESSION); 
..ger..
Kod:
bool(true)
string(26) "7g725muki33en46k4i3uqktfa7"
Notice:  session_start(): A session had already been started - ignoring in ... on line 4
bool(true)
string(26) "7g725muki33en46k4i3uqktfa7"
array(1) { ["test"]=> string(4) "test" }
Så flera session_start() borde inte förstöra. Men det är såklart bättre att ha en ordnad sessions-hantering, jag har inte sett många tillfällen då man inte gör det i början av filen.
__________________
Senast redigerad av Koenigsegg 2020-12-15 kl. 13:29.
Citera
2020-12-18, 21:50
  #5
Medlem
Ontogeness avatar
Citat:
Ursprungligen postat av Koenigsegg
Eventuellt så kan det vara bättre att använda var_dump() (eller liknande, eftersom det är PHP så finns det som vanligt överlappningar ) istället för echo, eftersom echo typomvandlar saker till strängar och det fungerar kanske inte alltid som man väntade sig:
Kod:
php > var_dump((string) false);
string(0) ""
php > var_dump((string) true);
string(1) "1"
Om du tittar på PHP: session_id - Manual så ser du att den kan returnera både en tom sträng och false(som båda ger samma utskrift med echo).


"Scope" för sessionen har ingenting med mappstrukturen på servern att göra, utan det handlar bara om att sessionen ska vara startad och vilket sessions-ID som användarens webläsare skickat in i headern. Sen så finns det data som finns sparat för det sessions-ID:t - om något finns sparat - i superglobalen $_SESSION.

Edit:
Kod:
var_dump(session_start());
var_dump(session_id());
$_SESSION['test'] = 'test';
var_dump(session_start());
var_dump(session_id());
var_dump($_SESSION); 
..ger..
Kod:
bool(true)
string(26) "7g725muki33en46k4i3uqktfa7"
Notice:  session_start(): A session had already been started - ignoring in ... on line 4
bool(true)
string(26) "7g725muki33en46k4i3uqktfa7"
array(1) { ["test"]=> string(4) "test" }
Så flera session_start() borde inte förstöra. Men det är såklart bättre att ha en ordnad sessions-hantering, jag har inte sett många tillfällen då man inte gör det i början av filen.

Bra svar, jag ska definitivt läsa igenom allt detta lite senare men ville bara uppdatera med att jag kommit fram till någonting intressant!

Så mitt dokument uploadprofilepic.inc.php (den kod som körs vid uppladdning av profilbild) ser som bekant ut såhär:

Kod:
<?php

session_start
();

if(isset(
$_POST['submit'])) {

    
$file $_FILES['file'];

    
$filename $_FILES['file']['name'];
    
$filetype $_FILES['file']['type'];
    
$filesize $_FILES['file']['size'];
    
$temp_location $_FILES['file']['tmp_name'];
    
$error $_FILES['file']['error'];

    
$fileExt explode('.'$filename);
    
$actualFileExt strtolower(end($fileExt));

    
$allowedFiles = array('jpg''jpeg''png');

    if(
in_array($actualFileExt$allowedFiles)) {

        if(
$error === 0) {

            if(
$filesize 500000) {

                
$newFileName uniqid(''true) . '.' $actualFileExt;
                
$fileDestination '../img/profilepics/' $newFileName;
                
move_uploaded_file($temp_location$fileDestination);

                
header('Location: ../uploadprofilepic.php?success=upload_success');
                exit();

            }
        }

        else {
            
header('Location: ../uploadprofilepic.php?error=unknown_error');
            exit();
        }
    }

    else {
        
header('Location: ../uploadprofilepic.php?error=incorrect_file_format');
        exit();
    }
}

Jag testade att kommentera ut all kod som körs och köra en echo $_SESSION['username'] på följande vis:

Kod:
<?php

session_start
();

if(isset(
$_POST['submit'])) {

    echo 
$_SESSION['username'];

    
/*

    $file = $_FILES['file'];

    $filename = $_FILES['file']['name'];
    $filetype = $_FILES['file']['type'];
    $filesize = $_FILES['file']['size'];
    $temp_location = $_FILES['file']['tmp_name'];
    $error = $_FILES['file']['error'];

    $fileExt = explode('.', $filename);
    $actualFileExt = strtolower(end($fileExt));

    $allowedFiles = array('jpg', 'jpeg', 'png');

    if(in_array($actualFileExt, $allowedFiles)) {

        if($error === 0) {

            if($filesize < 500000) {

                $newFileName = uniqid('', true) . '.' . $actualFileExt;
                $fileDestination = '../img/profilepics/' . $newFileName;
                move_uploaded_file($temp_location, $fileDestination);

                header('Location: ../uploadprofilepic.php?success=upload_success');
                exit();

            }
        }

        else {
            header('Location: ../uploadprofilepic.php?error=unknown_error');
            exit();
        }
    }

    else {
        header('Location: ../uploadprofilepic.php?error=incorrect_file_format');
        exit();
    }

    */
}

Och då skrivs användarnamnet kopplat till min session ut, så det visar sig ändå att jag hade tillgång till mina session-variabler men bara det att jag inte kunde eller gjorde någonting fel när jag försökte skriva ut dem bara, så slarvfel I guess

Nu till steg två, att inkludera ytterligare kod i uppladdnings-scriptet som lägger till id:t som genereras av uniqid()-funktionen i en kolumn som finns för varje användare i databasen. Den är satt som null per default, men om id:t för bilden som laddas upp är "123" så ska detta alltså in i den kolumnen för den användaren. Har du någon aning om hur jag bör gå tillväga med detta? Är det nödvändigt att använda sig av prepared statements för en sådan sak eller är det bara att köra ett helt vanligt SQL-query?

Jag har egentligen bara använt mig utav prepared statements tidigare så har ingen bra koll på hur man trycker in data i databaser utan detta tillvägagångssätt, får väl läsa på lite I guess
Citera
2020-12-18, 22:33
  #6
Medlem
Ontogeness avatar
Mitt första problem är nu löst, nu till det andra problemet.

Jag har en databas för samtliga användare på en hemsida, och jag behöver egentligen hjälp med att skriva ett SQL-query som lägger in ett uniqid-genererat id i en kolumn för den användare som är inloggad. Så, variabeln $newFileName ska sättas in i kolumnen profilepicture där kolumnen username = $_SESSION['username'].

Bild på databasen för referens:

https://gyazo.com/0003779a209a069da7f2b5df516bba44

Här är min kod:

Kod:
<?php

session_start
();

if(isset(
$_POST['submit'])) {

    
$file $_FILES['file'];

    
$filename $_FILES['file']['name'];
    
$filetype $_FILES['file']['type'];
    
$filesize $_FILES['file']['size'];
    
$temp_location $_FILES['file']['tmp_name'];
    
$error $_FILES['file']['error'];

    
$fileExt explode('.'$filename);
    
$actualFileExt strtolower(end($fileExt));

    
$allowedFiles = array('jpg''jpeg''png');

    if(
in_array($actualFileExt$allowedFiles)) {

        if(
$error === 0) {

            if(
$filesize 500000) {

                
$newFileName uniqid(''true) . '.' $actualFileExt;
                
$fileDestination '../img/profilepics/' $newFileName;
                
move_uploaded_file($temp_location$fileDestination);

                
header('Location: ../uploadprofilepic.php?success=upload_success');
                exit();

            }
        }

        else {
            
header('Location: ../uploadprofilepic.php?error=unknown_error');
            exit();
        }
    }

    else {
        
header('Location: ../uploadprofilepic.php?error=incorrect_file_format');
        exit();
    }
    
}

Är det nödvändigt att använda sig utav prepared statements för en sådan här sak? Annars tänker jag mig att man skulle kunna skriva ett SQL-statement i stil med någonting sånt här:

Kod:
$sql "INSERT INTO users (profilepicture) VALUES ($newFileName) WHERE username=$_SESSION['username'];"

Jag vet dock inte hur det fungerar med PHP-variabler i ett SQL-statement.

Tankar?
Citera
2020-12-19, 14:52
  #7
Medlem
Citat:
Ursprungligen postat av Ontogenes
Kod:
$sql "INSERT INTO users (profilepicture) VALUES ($newFileName) WHERE username=$_SESSION['username'];"

Tankar?
INSERT...WHERE o_0? Är du säker på att du inte menar UPDATE?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback