Gå til innhold

if else problematikk


Anbefalte innlegg

Jeg har laget et script som skal hente ut informasjon fra en database og linke dette på en side. Linkene skal være klikkbare for å hente ut enda mer informasjon angående ønsket tema.

 

Jeg har, med hjelp, lokalisert feilen. Feilen ligger i den ene "if'en" min:

if ($Filnavn == $row[id])

 

Problemet mitt er at etter denne "IF'en" kommer det en else som skal printe ut en 404-side, men pga. $row[id] så blir 404-siden printet uansett:

 

 

Noen som har en løsning uten å rote alt for mye med koden? Jeg holder fortsatt på å lære meg PHP, så jeg prøver å lage det enkelt og forståelig for meg selv.

 

Hele koden:

 

<?php
   include "config/sql_config.php";

   $Filnavn = $_GET["id"];

   $result = mysql_query("SELECT * FROM guide order by ID")
           or die(mysql_error());
   while ($row = mysql_fetch_array($result))
   {
       if (!$Filnavn)
       {
           echo "<div class='content'><a href='?page=classic&id=$row[id]'>$row[title]</a></div>";
       }
       else
       {
           if ($Filnavn == $row[id])
           {
               echo "<div class='content'><b>$row[title]</b></a></div>";
               echo "<div class='content'>$row[text]</div>";
               echo "debug";
           }
           else
           {
               include "include/404.php";
               echo "debug2";
           }
       }
   }
   ?>

 

 

Lenke til kommentar
Videoannonse
Annonse

Altså, problemet er at den slår til på både if og else?

 

else
       {
           if ($Filnavn == $row[id])
           {
               echo "<div class='content'><b>$row[title]</b></a></div>
";
               echo "<div class='content'>$row[text]</div>";
               echo "debug";
           }
           else
           {
               include "include/404.php";
               echo "debug2";
           }
       }
   }

 

EDIT: Er det bare en verdi i databasen forresten?

Endret av Nickless
Lenke til kommentar

jeg tror du vil ha row["id"] istedet.. Eller definere id

 

Som nevnt:

 

   while ($row = mysql_fetch_array($result))
   {
       if (!$Filnavn)
       {
           echo "<div class='content'><a href='?page=classic&id=$row[id]'>$row[title]</a>
</div>";
       }
       else
       {
           $value = $row['id'];
           if ($Filnavn == $value)
           {
               echo "<div class='content'><b>$row[title]</b></a></div>
";
               echo "<div class='content'>$row[text]</div>";
               echo "debug";
           }
           else
           {
               include "include/404.php";
               echo "debug2";
           }
       }
   }

 

 

Hmm, hva er Filnavn hvis du printer den ut, og hva er row[id]?

Endret av Nickless
Lenke til kommentar

Hmm, hva er Filnavn hvis du printer den ut, og hva er row[id]?

 

Begge er lik hverandre, de henter ut samme verdi.

 

 

Databasen inneholder bare 1 verdi, eller flere?

 

Den inneholder to verdier.

 

Den første verdien har id 1, neste har id 20020.

Lenke til kommentar

Kanskje det hjelper om jeg viser hvordan siden er bygd opp:

 

Dette er den første IFen, her printer den ut alle verdiene i databasen og gjør dem klikkbare ved hjelp av $filnavn = $_GET["id"];

 

 

Trykker jeg på verdi 1 så kommer jeg hit:

 

Her printer den ut if og else.

 

Ja, $row[id] er lik filnavn begge gangene.

Lenke til kommentar
Den første verdien har id 1, neste har id 20020.

 

Ja, $row[id] er lik filnavn begge gangene.

 

DOES NOT COMPUTE

 

Jeg skjønner at feilen ligger der, jeg skrev det i den første posten.

 

Det jeg ikke skjønner er hvordan jeg kan fikse problemet.

 

Jeg trenger filnavn = $_GET["id"] for å lage lenkene og jeg trenger $row[id] for å hente ut innholdet som skal ligge under lenkene.

 

Hvis $_GET["id"] er lik $row[id] så henter den ut $row[text], hvis ikke skal den gå til 404.

Endret av Bjohansen
Lenke til kommentar

            $value = $row['id'];
           echo "<p style='border: 2px dotted #f00;float: left; margin: 5px;'><b>DEBUG!</b><br/>Filnavn er : $Filnavn<br/>ID er : $value</p>";
           if ($Filnavn == $value)

 

Hva er debug value der? Hvis jeg har forstått koden riktig, vil DEBUG komme opp to ganger, ene med filnavn og id likt, andre med filnavn og id ulikt.

 

Edit: Hvis min forståelse er riktig: Siden det er to verdier i databasen, vil if logikken kjøre to ganger, med to forskjellige row's. Ene gangen vil filnavn variablen ha samme verdi som row id'en, andre gangen ikke. Så at både if og else koden kjører er helt logisk. Det jeg tror du bør tenke på er hva som skal skje når de ikke passer. Siden det er forventet at det er rows den ikke passer med, så tror jeg ikke 404 er riktig respons.

Endret av Terrasque
Lenke til kommentar

Du bør tenke på hva som skjer i else delen, og om den er nødvendig å ha.

 

Du kan også endre SQL queryen til å bare få raden du trenger, hvis du ikke skal bruke de andre:

 

$escapedid = mysql_real_escape_string($Filnavn);
$result = mysql_query("SELECT * FROM guide WHERE id = $escapedid")

Lenke til kommentar

Du bør tenke på hva som skjer i else delen, og om den er nødvendig å ha.

 

Du kan også endre SQL queryen til å bare få raden du trenger, hvis du ikke skal bruke de andre:

 

$escapedid = mysql_real_escape_string($Filnavn);
$result = mysql_query("SELECT * FROM guide WHERE id = $escapedid")

 

Jeg vet at else ikke er nødvendig, men den er kjekk å ha dersom man prøver å gå til en id som ikke finnes.

 

Jeg henter ut mer enn bare ID.

if1:

echo "<div class='content'><a href='?page=classic&id=$row[id]'>$row[title]</a></div>";

 

if2:

echo "<div class='content'><b>$row[title]</b></a></div>";
               echo "<div class='content'>$row[text]</div>";
               echo "debug <br />";
               echo "Filnavn: $Filnavn ... Row id:$row[id]";

 

Jeg henter ut all info i tabellen, men printer det ut i forskjellig if.

Endret av Bjohansen
Lenke til kommentar

Dersom $Filnavn er satt ønsker du kun at data fra en rad i databasetabellen skal skrives, hvis ikke skal alle radene listes opp? I så fall må du restrukturere litt.

 

Prøv å bytte ut $result slik som dette, se om det da fungerer 'as intented', så kan vi heller eventuelt ta det derfra.

$result = mysql_query("SELECT * FROM `guide` ".(($Filnavn)?' WHERE `id`=' . intval($Filnavn) . ' ':'') . "ORDER BY `id`;") or die(mysql_error());

Lenke til kommentar

Prøv å bytte ut $result slik som dette, se om det da fungerer 'as intented', så kan vi heller eventuelt ta det derfra.

$result = mysql_query("SELECT * FROM `guide` ".(($Filnavn)?' WHERE `id`=' . intval($Filnavn) . ' ':'') . "ORDER BY `id`;") or die(mysql_error());

 

Den koden gjør akkurat samme nytten som å fjerne:

else
{
include "include/404.php";
echo "debug";
}

 

404-siden vises ikke ved bruk av den koden.

 

Edit: Men den kjører ikke gjennom loopen to ganger, så det er positivt.

Endret av Bjohansen
Lenke til kommentar

Den skal fremdeles vise 404-siden din dersom du kjører en ID som ikke finnes i databasen. Det den derimot ikke gjør er å vise en instans av 404-siden din for hver rad i databasen som for øyeblikket ikke har $Filnavn som ID. Det trodde jeg også var nettopp det du ville oppnå?

Lenke til kommentar

Den skal fremdeles vise 404-siden din dersom du kjører en ID som ikke finnes i databasen. Det den derimot ikke gjør er å vise en instans av 404-siden din for hver rad i databasen som for øyeblikket ikke har $Filnavn som ID. Det trodde jeg også var nettopp det du ville oppnå?

 

Du har forstått det riktig. Det den derimot ikke gjør akkurat nå er å vise 404-siden dersom jeg kjører en ID som ikke finnes i databasen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...