30. oktober 2010 - 19:28Der 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
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.
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:
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.
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.
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?
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);
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...
$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());
....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:
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?
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 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.
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..
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 :)
Synes godt om
Ny brugerNybegynder
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.