Avatar billede mcardle Nybegynder
22. august 2006 - 18:47 Der er 34 kommentarer og
1 løsning

Hvorfor virker min if og else ikke

Hej eksperter...
Jeg har siddet og rodet med det her script jeg har skrevet, og jeg kan simpelthen ikke finde ud af, hvorfor det ikke virker.

Jeg har en anelse om det er fordi jeg har 2 while-tags inde i hinanden, men håber I kan hjælpe. Hvis det bliver nødvendigt kan I også få de andre filer.

Hilsen mcardle
Avatar billede mcardle Nybegynder
22. august 2006 - 18:48 #1
Hov, glemte lige koden ;-p

<?php

$user = $_SESSION["user"];

echo '<table>';
connect();

$query = mysql_query("SELECT * FROM rating WHERE medie='p'") OR die(mysql_error());
while($aRow = mysql_fetch_array($query)){
    echo '<tr><td><img src="'.$aRow["url"].'" style="width: 250px; border: 1px #000000 solid;" /></td>';
    echo '<td style="vertical-align: bottom;">'.$aRow["picText"].'</td>';
    echo '</tr><tr>';

    $voteQuery = mysql_query("SELECT * FROM votespics WHERE user='$user'");
    while($voteRow = mysql_fetch_array($voteQuery)){
     
      if($voteRow["link"] !== $aRow["url"]){
        echo '<td style="text-align: center;">';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=1&link='.urlencode($aRow["url"]).'">1</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=2&link='.urlencode($aRow["url"]).'">2</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=3&link='.urlencode($aRow["url"]).'">3</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=4&link='.urlencode($aRow["url"]).'">4</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=5&link='.urlencode($aRow["url"]).'">5</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=6&link='.urlencode($aRow["url"]).'">6</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=7&link='.urlencode($aRow["url"]).'">7</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=8&link='.urlencode($aRow["url"]).'">8</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=9&link='.urlencode($aRow["url"]).'">9</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=10&link='.urlencode($aRow["url"]).'">10</a>]';
        echo '</td></tr>';
      }
      else{
            echo '<td style="text-align: center;">Du stemte: '.$voteRow["vote"].' til ovenstående billede</td></tr>';
      }
    }
}
echo '</table>';

close();

?>
Avatar billede mcardle Nybegynder
22. august 2006 - 18:49 #2
Den skriver simpelthen begge dele.
Avatar billede Slettet bruger
22. august 2006 - 18:55 #3
Øh, skriver den ikke en gevaldig liste for hvert billede? (Altså hvis der er flere stemmer i listen.)
Avatar billede mcardle Nybegynder
22. august 2006 - 18:57 #4
Nej, $voteQuery = mysql_query("SELECT * FROM votespics WHERE user='$user'");

Det er kun den user der er på siden.
Avatar billede boost Nybegynder
22. august 2006 - 19:00 #5
Prøv denne:

<?php

$user = $_SESSION["user"];

echo '<table>';
connect();

$query = mysql_query("SELECT * FROM rating WHERE medie='p'") OR die(mysql_error());
while($aRow = mysql_fetch_array($query)) {
    echo '<tr><td><img src="'.$aRow["url"].'" style="width: 250px; border: 1px #000000 solid;" /></td>';
    echo '<td style="vertical-align: bottom;">'.$aRow["picText"].'</td>';
    echo '</tr><tr>';

    $voteRow= mysql_fetch_array(mysql_query("SELECT * FROM votespics WHERE user='$user'")) or die(mysql_error());
     
      if($voteRow["link"] !== $aRow["url"]){
        echo '<td style="text-align: center;">';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=1&link='.urlencode($aRow["url"]).'">1</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=2&link='.urlencode($aRow["url"]).'">2</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=3&link='.urlencode($aRow["url"]).'">3</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=4&link='.urlencode($aRow["url"]).'">4</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=5&link='.urlencode($aRow["url"]).'">5</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=6&link='.urlencode($aRow["url"]).'">6</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=7&link='.urlencode($aRow["url"]).'">7</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=8&link='.urlencode($aRow["url"]).'">8</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=9&link='.urlencode($aRow["url"]).'">9</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=10&link='.urlencode($aRow["url"]).'">10</a>]';
        echo '</td></tr>';
      } else {
            echo '<td style="text-align: center;">Du stemte: '.$voteRow["vote"].' til ovenstående billede</td></tr>';
      }
    }
echo '</table>';

close();

?>
Avatar billede mcardle Nybegynder
22. august 2006 - 19:02 #6
Den sætter og nummer 2 på hovedet, se evt. http://www.fehedojo.dk/mcardle/eks.jpg
Avatar billede mcardle Nybegynder
22. august 2006 - 19:03 #7
Den gør det kun på første billede...
Avatar billede mcardle Nybegynder
22. august 2006 - 19:05 #8
Avatar billede Slettet bruger
22. august 2006 - 19:11 #9
Jeg mente, hvis den samme bruger har afgivet flere stemmer (på forskellige billeder)
Avatar billede mcardle Nybegynder
22. august 2006 - 19:16 #10
Så var det meningen, at der skulle stå under hvert billede, at han havde stemt. Se eks.jpg  ;-)
Avatar billede boost Nybegynder
22. august 2006 - 19:35 #11
Ændre: if($voteRow["link"] !== $aRow["url"]){
Til: if($voteRow["link"] != $aRow["url"]){

Prøv og se om det giver nogen forskel..
Avatar billede Slettet bruger
22. august 2006 - 19:40 #12
Lav din query nummer to om til:

$voteRow= mysql_fetch_array(mysql_query("SELECT * FROM votespics WHERE user='$user' AND link='{$aRow['url']}'")) or die(mysql_error());
   
      if(!$voteRow){
        echo '<td style="text-align: center;">';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=1&link='.urlencode($aRow["url"]).'">1</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=2&link='.urlencode($aRow["url"]).'">2</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=3&link='.urlencode($aRow["url"]).'">3</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=4&link='.urlencode($aRow["url"]).'">4</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=5&link='.urlencode($aRow["url"]).'">5</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=6&link='.urlencode($aRow["url"]).'">6</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=7&link='.urlencode($aRow["url"]).'">7</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=8&link='.urlencode($aRow["url"]).'">8</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=9&link='.urlencode($aRow["url"]).'">9</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=10&link='.urlencode($aRow["url"]).'">10</a>]';
        echo '</td></tr>';
      } else {
            echo '<td style="text-align: center;">Du stemte: '.$voteRow["vote"].' til ovenstående billede</td></tr>';
      }
Avatar billede erikjacobsen Ekspert
22. august 2006 - 19:41 #13
Din
    SELECT * FROM votespics WHERE user='$user'
skal vel have en vis relation til det billede der vises. Gælder der så i din tabel votepics, at der kun er en række, hvis der er stemt?
Avatar billede boost Nybegynder
22. august 2006 - 19:44 #14
sandbox: Ja, selvfølgelig havde lige glemt at det er nemmest at gøre det sådan..
Avatar billede mcardle Nybegynder
22. august 2006 - 21:15 #15
Ja, men fordi den er inde i en while, så vil den jo bruge det der kommer ud på det tidspunkt. Men jeg prøver lige.
Avatar billede mcardle Nybegynder
22. august 2006 - 21:19 #16
Skal link='{$aRow['url']}' stå i tuborgklammer..?
Avatar billede erikjacobsen Ekspert
22. august 2006 - 21:20 #17
"fordi den er inde i en while" ... nej, der er noget du har misforstået. Komputere gør ikke hvad du synes, de skal gøre, men hvad du be'r dem om. ;)
De der {...} er helt ok i den sammenhæng. Prøv bare.
Avatar billede mcardle Nybegynder
22. august 2006 - 21:49 #18
Okay...
Avatar billede Slettet bruger
22. august 2006 - 21:54 #19
Ja, det var helt med vilje, at de klammer var der. Jeg satte dem, fordi jeg foretrækker at bruge '' om feltnavne i arrays alle steder.

Man kunne også have skrevet: link='$aRow[url]' men så skal man jo lige pludseligt skrive forskelligt alt efter om det er indenfor eller udenfor en streng. Derudover er der andre sjove ting, man kan gøre med variabler, som ikke kan lade sig gøre uden klammerne.
Avatar billede mcardle Nybegynder
22. august 2006 - 21:58 #20
Det virker stadig ikke for godt.

Det virker ikke, når man ikke har stemt: http://www.fehedojo.dk/mcardle/eks2.jpg

Men når man har stemt, er det fint: http://www.fehedojo.dk/images/eks3.jpg
Avatar billede mcardle Nybegynder
22. august 2006 - 21:59 #21
Okay, tak for tippet... Det har faktisk irreteret mig meget, at jeg ikke kunne sætte mine arrays i ''

;-)
Avatar billede mcardle Nybegynder
22. august 2006 - 22:01 #22
Hov, det var et forkert link.

http://www.fehedojo.dk/mcardle/eks3.jpg
Avatar billede erikjacobsen Ekspert
22. august 2006 - 22:09 #23
Vi skal vel lige se koden igen. Det er nok noget i den store sammenhæng.
Avatar billede mcardle Nybegynder
22. august 2006 - 22:11 #24
Jeg er gået tilbage til den gamle kode, men med modificeringer:

<?php

$user = $_SESSION["user"];

echo '<table>';
connect();

$query = mysql_query("SELECT * FROM rating WHERE medie='p'") OR die(mysql_error());
while($aRow = mysql_fetch_array($query)){
    echo '<tr><td><img src="'.$aRow["url"].'" style="width: 250px; border: 1px #000000 solid;" /></td>';
    echo '<td style="vertical-align: bottom;">'.$aRow["picText"].'</td>';
    echo '</tr><tr>';

    $voteQuery = mysql_query("SELECT * FROM votespics WHERE user='$user' AND link='{$aRow['url']}'");
    while($voteRow = mysql_fetch_array($voteQuery)){
     
      if($voteRow["link"] != $aRow["url"]){
        echo '<td style="text-align: center;">';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=1&link='.urlencode($aRow["url"]).'">1</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=2&link='.urlencode($aRow["url"]).'">2</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=3&link='.urlencode($aRow["url"]).'">3</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=4&link='.urlencode($aRow["url"]).'">4</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=5&link='.urlencode($aRow["url"]).'">5</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=6&link='.urlencode($aRow["url"]).'">6</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=7&link='.urlencode($aRow["url"]).'">7</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=8&link='.urlencode($aRow["url"]).'">8</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=9&link='.urlencode($aRow["url"]).'">9</a>] ';
        echo '[<a href="saveRating.php?id='.urlencode($aRow["id"]).'&rating=10&link='.urlencode($aRow["url"]).'">10</a>]';
        echo '</td></tr>';
      }
      else{
            echo '<td style="text-align: center;">Du stemte: '.$voteRow["vote"].' til ovenstående billede</td></tr>';
      }
    }
}
echo '</table>';

close();

?>
Avatar billede mcardle Nybegynder
22. august 2006 - 22:13 #25
Jeg fandt ud af det... Det er den der while, så I har advaret mod, jeg har glemt at slette...

Nu virker det...

Tak for hjælpen og smid et svar...
Avatar billede Slettet bruger
22. august 2006 - 22:17 #26
Ok, jeg prøver lige forfra - og med en metode, som din database nok bliver gladere for.

<?php

$user = $_SESSION["user"];

echo '<table>';
connect();

$query = mysql_query("SELECT r.*, v.vote AS vote FROM rating AS r LEFT OUTER JOIN votespics AS v ON v.user = '{$user}' AND r.url = v.link WHERE medie='p'") OR die(mysql_error());
while($aRow = mysql_fetch_array($query)){
  echo '<tr><td><img src="'.$aRow["url"].'" style="width: 250px; border: 1px #000000 solid;" /></td>';
  echo '<td style="vertical-align: bottom;">'.$aRow["picText"].'</td>';
  echo '</tr><tr>';

  if(!empty($voteRow['vote'])){
    echo '<td style="text-align: center;">';
    for($x=0;$x<=10;$x++){
      echo "[<a href='saveRating.php?id={$aRow['id']}&amp;rating={$x}&amp;link={$aRow['url']}'>{$x}</a>] ";
    }
  }
  else{
    echo '<td style="text-align: center;">Du stemte: '.$voteRow["vote"].' til ovenstående billede</td></tr>';
  }
}
echo '</table>';

close();

?>
Avatar billede erikjacobsen Ekspert
22. august 2006 - 22:21 #27
Ingen point til mig, tak. Problemet med den dobbelte while skal ikke bare være en advarsel, men gerne noget du lærer af. Så på med hatten, slå tommelfingrene ud.

Du havde i princippet

  while (....gennemløb af skal vi sige 2 items/billede....) {

      while (....gennemløb af skal vi sige 10 items/stemmer....) {
        if (noget) {
            gør 1
        } else {
            gør 2
        }
      }
  }

Stillet op på den her måde, håber jeg du kan se at for hvert af de 2 billeder vil der i den indre while-løkke ske 10 ting, som 9 af gangene er "gør 2", og een af gangene er "gør 1". I virkeligheden vil du kun have enten een "gør 1" eller een "gør 2"

Alt kan lade sig gøre, naturligvis, men det bliver en kende besværligt i PHP. Derfor træder programmeringsregel 367 i kraft: "Lad databasen gøre så meget arbejde som muligt" - her betydende at den kun skal hente præcis de relevante data ud. Det er også det databaser er bedst til.

;)
Avatar billede Slettet bruger
22. august 2006 - 22:21 #28
Billedets id er vel et tal, så der er inegn grund til at urlencode det.

Til gengæld var det en fejl at jeg kom til at fjerne urlencodingen af $aRow['url']

Bemærk forresten, at jeg har lavet &-tegn i din href om til &amp;
Det er med vilje. Der må faktisk kun være &-tegn i htmlkode, hvis de er en del af en tegnkode, som f.eks &amp; eller &copy;.
Avatar billede erikjacobsen Ekspert
22. august 2006 - 22:22 #29
Og sandbox har så yderligere brugt regel 367 een gang til.
Avatar billede Slettet bruger
22. august 2006 - 22:27 #30
I modsætning til Erik, boycotter jeg ikke pointsystemet, så her er et svar fra mig.

Og jeg vil anbefale, at du går over til noget, som er baseret på eller minder om mit sidste forslag. Det vil jeg tro, at du bliver glad for, når der kommer mange stemmer i systemet.
Avatar billede mcardle Nybegynder
22. august 2006 - 22:29 #31
Okay, det skal jeg huske...

sandbox -> Vil du have nogle point?
Avatar billede Slettet bruger
22. august 2006 - 22:30 #32
Og så opdagede jeg en fejl mere i mit forslag, så her er en tilrettet udgave:

<?php

$user = $_SESSION["user"];

echo '<table>';
connect();

$query = mysql_query("SELECT r.*, v.vote AS vote FROM rating AS r LEFT OUTER JOIN votespics AS v ON v.user = '{$user}' AND r.url = v.link WHERE medie='p'") OR die(mysql_error());
while($aRow = mysql_fetch_array($query)){
  echo '<tr><td><img src="'.$aRow["url"].'" style="width: 250px; border: 1px #000000 solid;" /></td>';
  echo '<td style="vertical-align: bottom;">'.$aRow["picText"].'</td>';
  echo '</tr><tr>';

  if(!empty($aRow['vote'])){
    echo '<td style="text-align: center;">';
    for($x=0;$x<=10;$x++){
      echo "[<a href='saveRating.php?id={$aRow['id']}&amp;rating={$x}&amp;link=" . urlencode($aRow['url']) . "'>{$x}</a>] ";
    }
  }
  else{
    echo '<td style="text-align: center;">Du stemte: '.$voteRow["vote"].' til ovenstående billede</td></tr>';
  }
}
echo '</table>';

close();

?>
Avatar billede mcardle Nybegynder
22. august 2006 - 22:33 #33
Nu har du glemt hele $voteRow kaldet, hehe...
Avatar billede Slettet bruger
22. august 2006 - 22:40 #34
Argh. Det var netop den fejl, jeg opdagede yderligere, at der nu slet ikke er en variabel ved navn $voteRow, da det hele ligger i $aRow, så derfor skulle der checkes på om $aRow['vote'] var tom. Jeg glemte bare, at den også bruges til udskriften af afgivne stemmer.

Der skal bare rettes til $aRow dernede også.
Avatar billede mcardle Nybegynder
22. august 2006 - 22:47 #35
Okay...
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