[PHP] Behöver hjälp med allt detta "if".

Permalänk
Medlem

[PHP] Behöver hjälp med allt detta "if".

Hej

Ska skapa en meny som fungerar som tre funktioner

<li> MEDLEMSPORTALEN <ul> <?php if(isset($_SESSION["username"])) { $username = $_SESSION['username']; $info_ = mysql_query("SELECT status FROM medlemmar WHERE username='$username'"); $information = mysql_fetch_assoc($info_); $admin = "{$information['status']}"; } if($admin == "headhunter") { echo "<li><font color='#FFFFFF'>" . $username . "</font></li>"; echo "<li><a href='index.php?id=login'>HANTERA MEDLEMMAR</a></li>"; echo "<li><a href='index.php?id=skapa_nyhet'>HANTERA NYHETER</a></li>"; echo "<li><a href='index.php?id=logout'>LOGGA UT</a></li>"; } else if($admin == "medlem") { echo "<li><font color='#FFFFFF'>" . $username . "</font></li>"; echo "<li><a href='index.php?id=logout'>LOGGA UT</a></li>"; } ?> <?php if(!isset($_SESSION["username"])) { echo "<li><a href='index.php?id=login'>LOGGA IN</a></li>"; echo "<li><a href='index.php?id=registrera'>REGISTRERA DIG</a></li>"; } ?> </ul> </li>

Det jag vill är
Om man inte är inloggad ska bara detta synas
LOGGA IN
REGISTRERA DIG

Om man är inloggad som headhunter ska detta synas
ANVÄNDARNAMN
HANTERA MEDLEMMAR
HANTERA NYHETER
LOGGA UT

Om man är inloggad som medlem ska bara detta synas
ANVÄNDARNAMN
LOGGA UT

Databasens medlemmar är som
id
username
password
profilbild
namn
epost
telefonnummer
status (headhunter, medlem)

Det fungerar bra men att inte vara inloggad visar

Notice
Undefined variable: admin in
index.php
on line 59

Line 59 är

if($admin == "headhunter") {

Men kan man rensa upp koden lite så man inte behöver dubbla som exempel logga ut.
Eller bara fixa så error inte syns när man INTE är inloggad
Kan ju fuska att skriva error_reporting(0);

Tack för svar

**Edit: löste det med error! Ovanför if($admin... skulle jag tabort } och slänga den längst ner i koden. Men nu till min andra fråga.

Permalänk

Vad är din andra fråga?

Visa signatur

Chassi: Fractal Design Define R4 SSD: Kingston SSDNow V300 120GB HDD: 1 TB 7200 RPM Moderkort: Asus Z87-A CPU: Intel Core i7 4770k 3,5GHz RAM: Kingston HyperX Beast 16GB DDR3 2400MHz GPU: Sapphire Radeon HD7950 Boost 3GB PSU: Cooler Master GX Lite 600W Tangentbord: Logitech Gaming Keyboard G110 Mus: Logitech G500 Webbkamera: Logitech HD Webcam C310 Mikrofon: Logitech USB Microphone Hörlurar: SteelSeries Siberia V2 Hörlurar: Pioneer HDJ-1500

Permalänk
Hedersmedlem

Börja med att fixa indentering så att man ser hur kodens logik är uppbyggd. En vettig editor gör detta automatiskt, exempelvis:

<li> MEDLEMSPORTALEN <ul> <?php if (isset($_SESSION["username"])) { $username = $_SESSION['username']; $info_ = mysql_query("SELECT status FROM medlemmar WHERE username='$username'"); $information = mysql_fetch_assoc($info_); $admin = "{$information['status']}"; } if ($admin == "headhunter") { echo "<li><font color='#FFFFFF'>" . $username . "</font></li>"; echo "<li><a href='index.php?id=login'>HANTERA MEDLEMMAR</a></li>"; echo "<li><a href='index.php?id=skapa_nyhet'>HANTERA NYHETER</a></li>"; echo "<li><a href='index.php?id=logout'>LOGGA UT</a></li>"; } else if ($admin == "medlem") { echo "<li><font color='#FFFFFF'>" . $username . "</font></li>"; echo "<li><a href='index.php?id=logout'>LOGGA UT</a></li>"; } ?> <?php if (!isset($_SESSION["username"])) { echo "<li><a href='index.php?id=login'>LOGGA IN</a></li>"; echo "<li><a href='index.php?id=registrera'>REGISTRERA DIG</a></li>"; } ?> </ul> </li>

Skrivet av downup:

if(isset($_SESSION["username"])) { $username = $_SESSION['username'];

Inget fel, men det finns ingen anledning att blanda apostrofer och citationstecken för att ange vektorindex. Välj en konvention och håll dig till den. Att följa en viss konvention gör att man enklare och snabbare kan få en överblick över koden, vilket minimerar fel.

Skrivet av downup:

$info_ = mysql_query("SELECT status FROM medlemmar WHERE username='$username'");

Använd `mysqli` och prepared statements. Finns mängder med information och guider om detta på nätet. Så som det står ovan så har du troligen ett direkt och trivialt exploaterbart säkerhetshål i koden. Även om du inte tänker dig att dina användare är elaka så är det en dålig vana, och det ligger konstant botar som söker efter liknande hål och hamrar på alla sidor som är tillgängliga på det publika nätet.

Skrivet av downup:

$admin = "{$information['status']}";

Bekymret med klammerparenteser är rätt onödigt här. Enklare är att skippa både dessa paranteser och citationstecknen och bara skriva:

$admin = $information['status'];

vilket är ekvivalent, förutom att PHP nu kan tilldela vänsterledet värdet i högerledet direkt i stället för att behöva tolka högerledet som en sträng som tillåter interpolering, direkt träffa på en variabel och interpolera den, och sedan tilldela denna till vänsterledet.

Men det är egentligen än mer onödigt om du använder "prepared statements" då du kan binda en variabel direkt till ett resultat av en databasfråga i stället för att bolla runt den i koden till ingen vinning.

Skrivet av downup:

echo "<li><font color='#FFFFFF'>" . $username . "</font></li>";

Skapa en CSS-klass med namn `username`, definiera `color: white;` och applicera den på listelementet i stället för att hårdkoda färg, och skippa med all fördel `<font>`-taggen; dvs skriv ut HTML likt:

<li class="username">Användarnamn</li>

där `username`-klassen i CSS definieras likt

.username { color: white; }

Så som du skrivit din `echo`-sats så behöver du inte gå ur citationstecknen för att inkludera en variabel, så det du skriver är ekvivalent med

echo "<li><font color='#FFFFFF'>$username</font></li>";

Det är egentligen ett otyg att skriva ut HTML-kod direkt som argument till `echo` på detta sätt. Bättre är generellt att lämna PHP-läge och skriva "ren" HTML, där variabler flikas in som små PHP-snuttar:

<?php if ($admin == "headhunter") { ?> <li class="username"><?=$username?></li> <li><a href="index.php?id=login">HANTERA MEDLEMMAR</a></li> <li><a href="index.php?id=skapa_nyhet">HANTERA NYHETER</a></li> <li><a href="index.php?id=logout">LOGGA UT</a></li> <?php } ?>

där `<?=$username?>` är en "snabbsyntax" för `<?php echo $username; ?>` som är trevlig att använda i detta syfte.

Som en sidonotis så behöver man i praktiken inte skriva `</li>` i HTML när det följs av exempelvis `<li>` eller `</ul>`, vilket städar upp koden lite, men det är ett stilval (utläggning om valbara sluttaggar här).

Detta är dock fortfarande inte riktigt bra, för du skriver ut `$username` utan att se till att det faktiskt bara är vanlig text i variabeln. En busig användare skulle kunna döpa sig till `<h1>HULKEN!</h1>` eller allmänt förstöra sidans layout, och en elak användare skulle kunna döpa sig till JavaScript-kod som anropar externa resurser som då skulle kunna snoka fram uppgifter om exempelvis andra användare på sidan. Tumregel, som det väldigt sällan finns anledning att frångå: allt som skrivs ut ska behandlas med `htmlspecialchars()`. Skriv alltså snarare

<li class="username"><?=htmlspecialchars($username)?></li>

Tycker man det blir för bökigt att skriva så är ett "trick" att skapa en funktion likt

function h(str) { return htmlspecialchars(str); }

så kan du sedan skriva

<li class="username"><?=h($username)?></li>

men det sparar inte speciellt mycket tid i längden. Återigen så kommer en vettig editor hjälpa dig att skriva PHP snabbare och mer korrekt.

Skrivet av downup:

if ($admin == "headhunter") { … } else if ($admin == "medlem") { … }

Felet kommer av att du försöker använda `$admin` oavsett om du satt denna variabel eller inte. Antingen kan du låta denna kontroll ligga innanför det block där du sätter `$admin`, eller så kan du testa med `if (isset($admin))` innan du använder variabeln. Jag ser att du valde att lösa det på det första sättet.

När du vill testa en enstaka variabel (`$admin` i detta fall) mot flera värden så används ofta tydligast en `switch`-sats (tidigare utläggning i ämnet på forumet).

I detta fall så är du ju dock egentligen inte intresserad av de som har status "Medlem" så som logiken är skriven, så du kan helt enkelt lägga till en `if`-sats för att kolla om användaren är en "headhunter" och i så fall skriva ut länkarna för "Hantera medlemmar" och "Hantera nyheter".

<li> MEDLEMSPORTALEN <ul> <?php if (isset($_SESSION["username"])) { …Skriv om med `mysqli`, sätt `$admin`… ?> <li class="username"><?=htmlspecialchars($username)?> <?php if ($admin == "headhunter") { ?> <li><a href="index.php?id=login">HANTERA MEDLEMMAR</a> <li><a href="index.php?id=skapa_nyhet">HANTERA NYHETER</a> <?php } ?> <li><a href="index.php?id=logout">LOGGA UT</a>

Därefter, i stället för att först kolla om `$_SESSION["username"]` är satt och i så fall utföra ett block, och sedan direkt efter kolla igen om denna variabel inte är satt och i så fall köra ett block, så kan du ju använda en vanlig `else`-sats. Fortsätt då ovanstående kodstycke med:

<?php } else { ?> <li><a href="index.php?id=login">LOGGA IN</a> <li><a href="index.php?id=registrera">REGISTRERA DIG</a> <?php } ?> </ul> </li>

…på ett ungefär, väldigt otestat (klass 1-varning för syntaxfel).

Därutöver så skulle du kunna ha nytta av att veta skillnaden mellan `==` och `===` i PHP (skillnaden kan lätt förbluffa) och när det senare föredras. Ifall sidan du är på är `index.php` så behöver du inte ange den i länkmålet, utan det räcker med `href="?id=registrera"`. `id` låter för övrigt som ett lite märkligt namn där, då det inte är ett ID-nummer, men det är ett rent stilval. `$admin` är också ett lite märkligt variabelnamn, då det låter som något som skulle vara `true` eller `false`.

Det är ofta fördelaktigt att sköta alla databasfrågor högst upp i filen, innan du börjar skriva ut HTML. Det ger mycket renare layout om man separerar sådan logik från rena HTML-utskrifter. PHP kan se rätt vettigt ut som ett templatingspråk om man följer en del sådana konventioner, men gör man inte det blir det fruktansvärt lätt otydligt definierad spagetti av alltihop .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.