Avatar billede langkiller Nybegynder
30. oktober 2010 - 19:28 Der er 22 kommentarer og
1 løsning

if elseif og else i en while løkke ?

Har et problem med en while løkke der skal udskrive en række forskellige beskeder alt afhængig af hvilken type besked det er..

har opstillet min kode således:
Og det er altså ikke den rigtige kode, men blot en forenklet version..

while ($show_wall = mysql_fetch_array($actions))
{

if ($type == "type1")
{
print "bla bla bla type 1";
}

elseif ($type == "type2")
{
print "bla bla bla type 2";
}

else
{
print "error";
}

}

Problemet er at når løkken skal udskrive flere end en enkel type af "besked/post" så laver den alle "posts" til den samme type..

f.eks. hvis der skal udskrives en type 1 og en type 2 så udskriver den begge beskeder, men sætter alle beskeder op som en slags type.. Vil gerne gøre det muligt at udskrive forskellige typer i samme while løkke,,

Håber i kan forstå min noget kringlede forklaring..

Har også forsøgt mig at lave det om til en Switch funktion, men den ville kun lade while løkken vise en post ad gangen og først vise den næste i rækken når den første var slettet
Avatar billede danco Nybegynder
30. oktober 2010 - 19:32 #1
For mig at se skulle der ikke været nogle problemer i at gøre det på den måde som du gør det her. Det ville umiddelbart også være min første tanke at løse problematikken på samme måde.

Når det er sagt så kan vi næppe komme med konkrete ændringer eftersom det ikke er den korrete kode du har indsat. Jeg vil måske foreslå dig at ligge det ind dog med "tom" logik i if statements.
På den måde kan vi lettere finde din fejl.

Samtidig skal vi naturligvis have datatypen af vide for den kolonne der skal hentes fra i databasen.
Avatar billede The_Buzz Novice
30. oktober 2010 - 19:44 #2
Er enig med danco - den du har lagt op der burde virke efter hensigten.

Du kan dog i din while løkke unset din $type. Problemet JEG tror der kan være er at du har en løkke hvor du har glemt == og istedet har et enkelt =

Hvorfor den falder tilbage på en else?
30. oktober 2010 - 19:46 #3
Nej, ikke forstaaet.  For det foerste, hvor kommer $type fra?  Er type et felt i den/de tabeller du forespoerger i $actions?  Skulle koden saa snarere have vaeret:

while($show_wall = mysql_fetch_array($actions))
{
  $type = $show_all['type']
  if($type=="type1")
  ...

}

Hvad mener du saa med at loekken somme tider skal udskrive flere end en enkel type af besked/post?  Hver raekke af $actions kan vel kun levere en enkelt vaerdi af type?  Hvis det ikke er tilfaeldet saa maa du forklare mere om din tabel struktur og om $actions forespoergslen.  Giv et eksempel paa hvordan du vil have din  udskrevne side til at se ud efter loekken er koert igennem og et eksempel paa hvordan den ser ud naar den ikke goer som du vil.
Avatar billede langkiller Nybegynder
30. oktober 2010 - 19:47 #4
Okay here goes :P
Håber ikke det er for langt, men nu er alle detaljer i hvert fald med..

Der benyttes kun 2 slags datatyper i denne forbindelse, hvilket er INT og VARCHAR.


    if ($mes_type == "status")
    {

        print "

        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"93%\">
        <tr>
        <td valign=\"middle\" cols=\"2\"><font face=\"tahoma\" size=\"2\">

   
            <b>Update by";
              if ($profile_type == "private")
              { print " ".$user_info["firstname"]." ".$user_info["lastname"]." "; }
              elseif ($profile_type == "company")
              { print " ".$user_info["companyname"]." "; }
              else
              { print "error"; }
            print "</b>

            <br>
            ".$show_wall["message"]."
            </font>
        </td>
        </tr>

        <tr>
        <td height=\"4\" cols=\"2\"></td>
        </tr>

        <tr>
        <td id=\"spacer\" valign=\"bottom\" align=\"left\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">
          $time_ago
        </td>

        <td id=\"spacer\" valign=\"bottom\" align=\"right\" width=\"200\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">";

            if ($id == $_SESSION["user_id"])
            {
            print "<a href=\"send_actions.php?ac=rmv&id=$id&mid=".$show_wall["mes_id"]."\">Remove</a>";
            }
            else
            {
            print "&nbsp;";
            } print "</font>   
       
        </td>
        </tr>

        <tr>
        <td height=\"30\" cols=\"2\">&nbsp;</td>
        </tr>
        </table>";



    }
    elseif ($mes_type == "normal")
    {
      print "

        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"93%\">
        <tr>
        <td valign=\"middle\" cols=\"2\"><font face=\"tahoma\" size=\"2\">";

              if ($profile_type == "private")
              { print " ".$user_info["firstname"]." ".$user_info["lastname"]." "; }
              elseif ($profile_type == "company")
              { print " ".$user_info["companyname"]." "; }
              else
              { print "error"; }
            print "</b>

            <br>
            ".$show_wall["message"]."
            </font>
        </td>
        </tr>

        <tr>
        <td height=\"4\" cols=\"2\"></td>
        </tr>

        <tr>
        <td id=\"spacer\" valign=\"bottom\" align=\"left\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">
          $time_ago
        </td>

        <td id=\"spacer\" valign=\"bottom\" align=\"right\" width=\"200\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">";

            if ($id == $_SESSION["user_id"])
            {
            print "<a href=\"profile.php?id=".$show_wall["from_user"]."\">Reply</a> - <a href=\"send_actions.php?ac=rmv&id=$id&mid=".$show_wall["mes_id"]."\">Remove</a>";
            }

            else
            {
            print "<a href=\"profile.php?id=".$show_wall["from_user"]."\">".$user_info["firstname"]."".$user_info["companyname"]."'s profile</a>";
            } print "</font>

        </td>
        </tr>

        <tr>
        <td height=\"30\" cols=\"2\">&nbsp;</td>
        </tr>
        </table>";


    }
Avatar billede langkiller Nybegynder
30. oktober 2010 - 19:53 #5
Hvis du mener $mes_id så indeholder den:
$mes_type_sql = mysql_query("SELECT type FROM actions WHERE to_user = $id");
$mes_type = mysql_result($mes_type_sql,0);

Hvilket definere om det er status besked eller normal.
30. oktober 2010 - 20:59 #6
Ok, saa der er to variable, $mes_id med de mulige vaerdier 'status' og 'normal', og $profile_type med de mulige vaerdier 'private' og 'company'.  Tabellen skal udfyldes forskelligt for hver af de fire mulige kombinationer.

$mes_id kommer fra feltet 'type' i tabellen 'actions'.  I din $mes_type_sql query soeger du kun efter en enkelt raekke.

Tre spoergsmaal:  (1)  Hvor kommer vaerdierne for $profile_type saa fra?  (2) Du har saaledes ikke nogen loekke fordi du kun soeger efter en raekke (skoent du snakkede om en loekke i dit oprindelige indlaeg) er det korrekt?  (3)  Hvad er saa problemet?  Hvad faar du udskrevet som du ikke vil have og hvad vil du have i stedet?
Avatar billede majbom Novice
30. oktober 2010 - 22:45 #7
kan du ikke smide hele din while ind, så det er nemmere at overskue?
Avatar billede majbom Novice
30. oktober 2010 - 22:46 #8
evt brug pastebin.com og smid linket hér
Avatar billede langkiller Nybegynder
31. oktober 2010 - 18:09 #9
Sorry det gik lidt hurtigt da jeg postede koden så while løkken kom ikke med samt variable erklæringerne.

Her er det samlede script med det hele:


$id = $_GET["id"];
$actions = mysql_query("SELECT * FROM actions WHERE to_user = $id ORDER BY mes_id DESC") or die(mysql_error());


while ($show_wall = mysql_fetch_array($actions))
{

// Besked typen fx status besked
$mes_type_sql = mysql_query("SELECT type FROM actions WHERE to_user = $id");
$mes_type = mysql_result($mes_type_sql,0);
       
// Profil typen company eller private
$profile_type_sql = mysql_query("SELECT profiletype FROM users WHERE id=".$show_wall["from_user"]."");
$profile_type = mysql_result($profile_type_sql,0);

$time_ago = time() - $timestamp;


    if ($mes_type == "status")
    {

        print "

        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"93%\">
        <tr>
        <td valign=\"middle\" cols=\"2\"><font face=\"tahoma\" size=\"2\">

   
            <b>Update by";
              if ($profile_type == "private")
              { print " ".$user_info["firstname"]." ".$user_info["lastname"]." "; }
              elseif ($profile_type == "company")
              { print " ".$user_info["companyname"]." "; }
              else
              { print "error"; }
            print "</b>

            <br>
            ".$show_wall["message"]."
            </font>
        </td>
        </tr>

        <tr>
        <td height=\"4\" cols=\"2\"></td>
        </tr>

        <tr>
        <td id=\"spacer\" valign=\"bottom\" align=\"left\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">
          $time_ago
        </td>

        <td id=\"spacer\" valign=\"bottom\" align=\"right\" width=\"200\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">";

            if ($id == $_SESSION["user_id"])
            {
            print "<a href=\"send_actions.php?ac=rmv&id=$id&mid=".$show_wall["mes_id"]."\">Remove</a>";
            }
            else
            {
            print "&nbsp;";
            } print "</font>   
       
        </td>
        </tr>

        <tr>
        <td height=\"30\" cols=\"2\">&nbsp;</td>
        </tr>
        </table>";



    }
    elseif ($mes_type == "normal")
    {
      print "

        <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"93%\">
        <tr>
        <td valign=\"middle\" cols=\"2\"><font face=\"tahoma\" size=\"2\">";

              if ($profile_type == "private")
              { print " ".$user_info["firstname"]." ".$user_info["lastname"]." "; }
              elseif ($profile_type == "company")
              { print " ".$user_info["companyname"]." "; }
              else
              { print "error"; }
            print "</b>

            <br>
            ".$show_wall["message"]."
            </font>
        </td>
        </tr>

        <tr>
        <td height=\"4\" cols=\"2\"></td>
        </tr>

        <tr>
        <td id=\"spacer\" valign=\"bottom\" align=\"left\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">
          $time_ago
        </td>

        <td id=\"spacer\" valign=\"bottom\" align=\"right\" width=\"200\"><font face=\"tahoma\" size=\"2\" color=\"#777777\">";

            if ($id == $_SESSION["user_id"])
            {
            print "<a href=\"profile.php?id=".$show_wall["from_user"]."\">Reply</a> - <a href=\"send_actions.php?ac=rmv&id=$id&mid=".$show_wall["mes_id"]."\">Remove</a>";
            }

            else
            {
            print "<a href=\"profile.php?id=".$show_wall["from_user"]."\">".$user_info["firstname"]."".$user_info["companyname"]."'s profile</a>";
            } print "</font>

        </td>
        </tr>

        <tr>
        <td height=\"30\" cols=\"2\">&nbsp;</td>
        </tr>
        </table>";


    }

}



Det skulle vidst være det hele :s

Kan lige prøve at lægge det på pastebin som du siger splazz, hvis det kan gøre det lettere at overskue og læse..
Avatar billede langkiller Nybegynder
31. oktober 2010 - 18:14 #10
http://pastebin.com/nXuitf9k
har lagt koden derind .. det ser en smule mere overskueligt ud der
Avatar billede majbom Novice
31. oktober 2010 - 19:04 #11
hmm, umiddelbart forstår jeg ikke hvorfor du laver det første sql-kald i din while - du har allerede hentet data'en i dit $actions-kald

og det andet sql-kald i din while, vil du kunne lave sammen med dit $actions-kald vha JOIN: http://dev.mysql.com/doc/refman/5.0/en/join.html

det er så ikke helt her problemet ligger (selvom ovenstående ville løse det :) ), men når du henter mes_type er det samme kald som dit $actions-kald og du får derfor samme resultat hver gang - man kunne forestille sig at du skulle bruge noget andet end $id i din WHERE-del...
Avatar billede langkiller Nybegynder
31. oktober 2010 - 19:20 #12
Det virker umiddelbart som det skal nu, efter at have erstattet:

if ($mes_type == "status")

med:

if ($show_wall['from_user'] == "status")


Og så også fjernet $mes_type sql-kaldet som du sagde.
Men hvorfor skal jeg bruge JOIN ? og hvor og hvordan? :P

Jeg siger i hvert fald tak for hjælpen Splazz . smid et svar.
Avatar billede majbom Novice
31. oktober 2010 - 19:39 #13
$actions = mysql_query("SELECT actions.*, users.profiletype FROM actions INNER JOIN users ON users.id=actions.from_user WHERE actions.to_user = $id ORDER BY actions.mes_id DESC") or die(mysql_error());

skulle kunne gøre det...
31. oktober 2010 - 19:50 #14
....og dog maa der vaere mere kode end du viser, for i din tabel goer du brug af $timestamp og $use_info['firstname/lastname/companyname'].  Og jeg har endnu ikke forstaaet hvad problemet er.

Men du forekommer mig at bruge en alt for indviklet kode.  Maaske ville en forenklet kode afhjaelpe problemet.

Du synes at goere brug af disse to tabeller med (mindst) de foelgende felter:

actions
mes_id, to_user, from_user, mes_id, message, timestamp

users
id, profiletype, firstname, lastname, companyname

Saa vil du for en bestemt user have udskrevet oplysninger om alle de messages hvor den user er to_user, inklusiv oplysninger om from_user.

Jeg vil gaette paa at en join query som denne ville vaere det mest enkle:

<?
$id = $_GET["id"];
$actions = mysql_query("SELECT * FROM actions a JOIN users u ON a.from_user = u.id WHERE to_user = $id")or die(mysql_error());

//
og saa fortsaette med din loekke:
//
while($rows = mysql_fetch_array($actions)
{
  $mestype = $rows['type'];
  $profiletype = $rows['profiletype'];
  $message = $rows['message'];
  $time;stamp = $rows['timestamp'];
  $time_ago = time() - $timestamp
  $firstname = $rows['firstname'];
  $lastname = $rows['lastname'];
  $companyname = $rows['companyname'];
  //
  og saa vil du for hvert message have udskrevet, afhaengig af profiletype, enten for- og efternavn eller firmanavn for from_user, message, time_ago og saa en link der afhaenger af om message-typen er status eller normal.  I det foelgende forslag i fortsaettelse af while loekken skipper jeg al din formattering

  //
  if($profiletype == 'private') echo "$firstname = $lastname <br/>";
  else if($profiletype == 'company') echo "$companyname <br/>";
  else echo "error <br/>";
  echo $message;
  echo $time_ago;
  if($mestype = 'status') echo [det link du vil have for status messages];
  else if ($mestype = 'normal') echo [det relevante link];
  else echo [det relevante link]'
}
?>

Har jeg misforstaaet hvad du, i essensen, vil opnaa?  Hvad faar du saa forkert med din nuvaerende kode?
31. oktober 2010 - 19:51 #15
splazz, der var du hurtigere end jeg.  Vi synes at sige stort set det samme.
Avatar billede langkiller Nybegynder
31. oktober 2010 - 20:53 #16
Har aldrig brugt JOIN før.. Jeg vil prøve at læse om det og se om jeg kan forenkle min kode. mange tak for jeres input !
31. oktober 2010 - 21:05 #17
Nej det taenkte jeg nok (at du ikke har brugt JOIN).  Jeg har set og undret mig over andre af dine koder. Jeg ved ikke hvordan jeg skulle kunne overleve uden JOIN.  Jeg skulle i det mindste have invalidepension.

Jeg har selv haft stor glaede af w3school's tutorials, for eksempel on join http://www.w3schools.com/sql/sql_join.asp
Avatar billede langkiller Nybegynder
31. oktober 2010 - 21:14 #18
tak for det, den vil jeg lige kigge nærmere på..

er der andre fordele ved at bruge join end at gøre koden mere enkel at læse?

Den kan vel køre scriptet hurtigere når man benytter en enklere løsning og ikke så mange linjer kodning?
31. oktober 2010 - 21:22 #19
Jeg synes den stoerste fordel ved JOIN er at den goer koden nemmere at formulere korrekt.  Nogle gange har jeg i en forespoergsel brug for felter der er fordelt over seks-syv tabeller eller mere, og saa ville man meget hurtigt fare vildt med din metode.  Giv dig selv en uges tid med at studere tutorials og proeve det af, saa taenker jeg nok at du vil se paa det paa samme maade.
Avatar billede langkiller Nybegynder
31. oktober 2010 - 21:27 #20
Det vil jeg gøre :) tak for vejledningen
Avatar billede majbom Novice
01. november 2010 - 09:38 #21
i dit tilfælde her slipper du for 1 databasekald for hver række du har i dit $actions-udtræk - så du sparer jo også en del db-kald

og som der nævnes bliver det meget mere overskueligt og dermed nemmere at arbejde med

og tak for points :)
Avatar billede langkiller Nybegynder
01. november 2010 - 20:52 #22
Det kan jeg helt sikkert følge dig i ..
Bare lidt ærgeligt at jeg har lavet så meget kodning uden JOIN.. Også en hel del udover den jeg lige har postet her (til det samme projekt). Men på den anden side giver det jo en masse erfaring i at lære at forenkle sin kode..

Det var da så lidt ;)
Avatar billede majbom Novice
02. november 2010 - 19:56 #23
man skal også tænke på om det kan svare sig tidsmæssigt at gå tilbage og ændre i sin kode, hver gang man lærer noget nyt :)
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