[PHP] If en Elseif werken niet.

Pagina: 1
Acties:

Onderwerpen


  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Ik ws hier een poosje terug al om een begin aan een random link script te zoeken, ik ben nu ondertussen al aan het deel toe die elke dag random een link uit de database moet gaan halen en deze in een tabel samen met de datum zet.

De script zal dus eerst kijken of er al een link in de tabel staat samen met de datum van vandaag zoja dan laat hij deze zien... Bestaat deze niet dan zal hij een link uit de tabel me t links halen en deze in de tweede tabel zetten met een datum eraan vast.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$date = date('Y-m-d');
$p = "j";
$g = "j";


$result = mysql_query("SELECT * FROM $table2 ORDER BY date ASC", $mysqlconnect);
        $num_rows = mysql_num_rows($result);

        if($num_rows >= 1)
            {
                while($row = mysql_fetch_row($result))
                {
                    if($row[0] == $date)
                        {
                        echo "Day exists";
                        print ("$row[1]");
                        $p = "n"; 
                        }
                    elseif($p == $g)
                        {
                        print("Day doesn't exist");
                        //print("Program will now randomly select link and put it into database");
                        $randselect = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 0,2")or die(mysql_error());
                        $list = mysql_fetch_object($randselect);
                        $link = $list->link;
                        $randselect2 = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 1")or die(mysql_error());
                        $list2 = mysql_fetch_object($randselect2);
                        $link2 = $list2->link;
                        $query = mysql_query("INSERT INTO $table2 (date,link) VALUES ('$date','$link2')");
                        print("$link2");
                        $p = "n";
                        }               
                }
            }
        elseif($p == $g)
            {
                //print("Day doesn't exist");
                //print("Program will now randomly select link and put it into database");
                $randselect = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 0,2")or die(mysql_error());
                $list = mysql_fetch_object($randselect);
                $link = $list->link;
                $randselect2 = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 1")or die(mysql_error());
                $list2 = mysql_fetch_object($randselect2);
                $link2 = $list2->link;
                $query = mysql_query("INSERT INTO $table2 (date,link) VALUES ('$date','$link2')");
                print("$link2");
            }


Het probleem is dus dat als er een link samen met de goede datum in de tabel staat hij deze laat zien en alsnog een random link uit de linksdatabse haalt en deze in de tweede tabel zet. ik krijg dus twee links als output...

zoiets krijg ik dus steeds:
code:
1
Day doesn't existhttp://www.masdetesse.comDay existshttp://home.pacbell.net/diana_do/knowjack.htm


of kijk hier om een output te zien: http://soulas457.homeip.net/1s2/lofd/dayselect.php

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-09 08:50

gorgi_19

Kruimeltjes zijn weer op :9

.

[ Voor 186% gewijzigd door gorgi_19 op 19-02-2004 10:36 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • seweso
  • Registratie: Augustus 2003
  • Laatst online: 04-04-2018

seweso

de mouw is uit de aap

Je code ziet er rommelig uit. En hele lappen code die exact hetzelfde zijn is al helemaal erg.

Tip: denk in deelproblemen. Dus kijk eerst of het willekeurig toevoegen van links werkt en begin daarna met het opvragen ervan. Als je het interessant vind: dat heet bottom-up programmeren, iets wat niet veel programmeurs doen volgens mij.

seweso's blog


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

Waarschijnlijk zitten er meer records in je result set?

oogjes open, snaveltjes dicht


  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Ik denk dat ik mijn probleem niet duidelijk heb uitgelegd:

Als hij
code:
1
if($row[0] == $date)
vind dan voert hij de commando's die daarna volgen uit maar dan is het dus de boedeling dat hij de commando's die
code:
1
elseif($p == $g)
volgen niet uitvoert

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 08:16

Hu9o

Schokkend

doe dan:

if($row[0] != $date)

Dan wordt de code niet bij de if uitgevoerd maar wordt er eventueel bepaald of er een ander stuk uitgevoerd moet worden (else of elseif)


edit:

of bedoel je dat de code van de elseif alleen uitgevoerd moet worden als de if niet gedaan is?? Dan is het dus gewoon else ipv elseif.

[ Voor 31% gewijzigd door Hu9o op 19-02-2004 13:04 ]

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • EnnaN
  • Registratie: September 2002
  • Laatst online: 12-09 11:42

EnnaN

Toys in the attic

jamaar dat doettie ook niet toch? volgens mij (sorry, ben niet helemaal wakker, maar goed) loopt ie eerst je string door, vind ie geen day, dus tweede gedeelte (de esleif), maar bij de 2e eenheid uit je recordset vind ie er WEL 1, dus doetie het eerste gedeelte (en braaf het tweede niet)

sig


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:39
elseif wordt idd alleen uitgevoerd als de if niet gedaan is. Daarom staat er ook else voor :P Is een uitbreiding op de else, zodat je meerdere elsen kan hebben. Als je wilt dat ze allebei gecontrolleerd worden moet je er gewoon twee losse if's van maken.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 18-09 16:24

mulder

ik spuug op het trottoir

Joepho schreef op 19 februari 2004 @ 12:57:
Ik denk dat ik mijn probleem niet duidelijk heb uitgelegd:

Als hij
code:
1
if($row[0] == $date)
vind dan voert hij de commando's die daarna volgen uit maar dan is het dus de boedeling dat hij de commando's die
code:
1
elseif($p == $g)
volgen niet uitvoert
Die while, kun je daar niet eens tellertje zetten en kijken hoe vaak deze word opgehoogd?

oogjes open, snaveltjes dicht


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Blijkbaar doorloopt ie je while 2 keer, de eerste keer $row[0] != $date en $p == $g, maar de 2e keer $row[0] == $date

en het is me onduidelijk waarom je je variabelen de hele tijd tussen quotes zet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 05-08 13:55
Joepho schreef op 19 februari 2004 @ 12:57:
Ik denk dat ik mijn probleem niet duidelijk heb uitgelegd:

Als hij
code:
1
if($row[0] == $date)
vind dan voert hij de commando's die daarna volgen uit maar dan is het dus de boedeling dat hij de commando's die
code:
1
elseif($p == $g)
volgen niet uitvoert
code:
1
2
3
4
5
6
7
8
9
if($row[0] == $date)
{ 
   ...
  $firstActionPerformed = true;
}
elseif ($p == $g && !$firstActionPerformed)
{
  ...
}


En wat gebruik je duidelijke var-namen zeg ;)

[ Voor 28% gewijzigd door Sn3akz op 19-02-2004 15:54 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm ja dat doet dus precies hetzelfde, aangezien het gedeelte in de elseif alleen wordt geevalueerd als het gedeelte in de daarvoorstaande if false was. Je kunt er dus al vanuit gaan dat $row[0] != $date

.edit: en nu heb je je post geedit :Y) maar dan nog gaat het fout. In de eerste iteratie van de while wordt namelijk het gedeelte in de elseif uitgevoerd, en in de 2e iteratie het gedeelte in de if. Het zetten van die variabele heeft dus weinig nut.

trouwens, iemand enig idee waarom het keyword "elseif" uberhaupt bestaat? Het lijkt me een beetje nutteloos namelijk :)

[ Voor 60% gewijzigd door .oisyn op 19-02-2004 15:35 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 05-08 13:55
Ja, sorry bed8 me :)

Om heel eerlijk te zijn heb ik niet de hele code gelezen, maar gereageerd op het bericht wat ik quote. Dan los je het probleem wel op nameljik. Ik heb nooit geen while lus gezien ;)

Over het bestaan ervan:
Zie het meer als een alternatief switch statement. Dit is namelijk geen goede manier van elseif gebruiken

code:
1
2
3
4
5
6
7
8
9
10
11
12
if ($i > 10)
{
  ...
}
elseif($i > 5)
{
   ...
}
else
{
   ...
}


Dat is een goede manier, maar nogmaals: dit is mooier op te lossen met een switch statement

[ Voor 33% gewijzigd door Sn3akz op 19-02-2004 15:49 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja maar het is nutteloos, want het kan ook gewoon met keywords die al bestaan, namelijk else en if

code:
1
2
3
4
5
6
7
8
9
if (bla)
{
}
else if (bla)
{
}
else
{
}


is exact hetzelfde :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 05-08 13:55
Precies...
code:
1
else if

is hetzelfde als
code:
1
elseif

Net zoals
code:
1
if(statement){...}

precies hetzelfde doet als
code:
1
2
3
4
if (statement)
{
   ...
}

Alternatieve schrijfwijze zeg maar..

Nu weer back ontopic? ;)

[ Voor 3% gewijzigd door Sn3akz op 19-02-2004 15:57 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm ja, en als je nu even bij gaat lezen over compiler development dan snap je wat ik bedoel ;)

Het introduceren voor een nieuw keyword voor hetzelfde moet je niet willen en is onzin. Het voegt namelijk totaal niets toe, maar je moet wel je lexical analyser en parser uitbreiden om het te ondersteunen. Echt weer typisch php om zoiets te doen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Don Facundo schreef op 19 februari 2004 @ 13:36:
[...]


Die while, kun je daar niet eens tellertje zetten en kijken hoe vaak deze word opgehoogd?
Hey bedankt ik heb dat ff geprobeerd en het lijkt nu idd te werken!!!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$date = date('Y-m-d');
//echo "$day $month $year";
//echo "<P> $date";
$teller = 0;



$result = mysql_query("SELECT * FROM $table2 ORDER BY date ASC", $mysqlconnect);
        $num_rows = mysql_num_rows($result);

        if($num_rows >= 1)
            {
                while($row = mysql_fetch_row($result))
                {
                $teller = $teller+1;
                    if($row[0] == $date)
                        {
                        //echo "Day exists";
                        print ("$row[1]");
                        }
                    elseif($teller == $num_rows)
                        {
                        //print("Day doesn't exist");
                        //print("Program will now randomly select link and put it into database");
                        $randselect = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 0,2")or die(mysql_error());
                        $list = mysql_fetch_object($randselect);
                        $link = $list->link;
                        $randselect2 = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 1")or die(mysql_error());
                        $list2 = mysql_fetch_object($randselect2);
                        $link2 = $list2->link;
                        $query = mysql_query("INSERT INTO $table2 (date,link) VALUES ('$date','$link2')");
                        print("$link2");
                        
                        }               
                }
            }
        else
            {
                //print("Day doesn't exist");
                //print("Program will now randomly select link and put it into database");
                $randselect = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 0,2")or die(mysql_error());
                $list = mysql_fetch_object($randselect);
                $link = $list->link;
                $randselect2 = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 1")or die(mysql_error());
                $list2 = mysql_fetch_object($randselect2);
                $link2 = $list2->link;
                $query = mysql_query("INSERT INTO $table2 (date,link) VALUES ('$date','$link2')");
                print("$link2");
            }

  • Sn3akz
  • Registratie: November 2000
  • Laatst online: 05-08 13:55
.oisyn schreef op 19 februari 2004 @ 16:36:
Uhm ja, en als je nu even bij gaat lezen over compiler development dan snap je wat ik bedoel ;)

Het introduceren voor een nieuw keyword voor hetzelfde moet je niet willen en is onzin. Het voegt namelijk totaal niets toe, maar je moet wel je lexical analyser en parser uitbreiden om het te ondersteunen. Echt weer typisch php om zoiets te doen
offtopic:
Ik snap je standpunt en geef je helemaal gelijk. Ik d8 dat je puur over het spatie-gebruik struikelde. Wist ik veel dat je op compiler-dev niveau ging zitten :)


@ TS:

Fijn dat het nu werk, maar het blijft een ranzige oplossing. 2 keer dezelfde code. Je zou het minimaal in een functie kunnen mikken.. Of een beetje creatiever met die if lus :)

Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Ja ik zou wel met funcites willen werken (net zoals ik altijd in Qbasic deed) maar k heb nog niet helemaal begrepen hoe dat in PHP moet dus als iemand mij een klein voorbeeldje zou kunnen geven?

Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
euh .. ik ga er vanuit dat je http://nl.php.net/manual/en/functions.php al hebt gelezen?

Je zou zoiets kunnen maken als (even uit de losse hand):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function selectRandomLink ($date) {
        //print("Day doesn't exist");
        //print("Program will now randomly select link and put it into database");
        $randselect = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 0,2")or die(mysql_error());
        $list = mysql_fetch_object($randselect);
        $link = $list->link;
        $randselect2 = mysql_query("SELECT * FROM $table WHERE admin=1 ORDER BY RAND() LIMIT 1")or die(mysql_error());
        $list2 = mysql_fetch_object($randselect2);
        $link2 = $list2->link;
        $query = mysql_query("INSERT INTO $table2 (date,link) VALUES ('$date','$link2')");
        return $link2;
}


Ik begrijp trouwens niet waarom je regel 4 tot en met 6 wil opnemen in je code, zo op het eerste gezicht doe je er helemaal niets mee ..

Anyway, je kan de functie aanroepen zoals hieronder:
PHP:
1
2
3
elseif($teller == $num_rows) {
        echo selectRandomLink($date);
}


Zelfde principe natuurlijk voor je andere else :)

Succes

Acties:
  • 0 Henk 'm!

  • Joepho
  • Registratie: April 2002
  • Laatst online: 02-01-2023

Joepho

Le mec de la pomme (Newton)

Topicstarter
Ok bedankt ... ik zal ff uitleggen waarom regel 4 to enmet 6 erin zitten: de eertse order by rand() is voor de een of de andere reden nooit random dus heb ik op http://nl.php.net/manual/en/functions.php gevonden dat ik dat op kon lossen door een order by rand() te doen die ik niet gebruik en dan de echte order by rand() en dan is die dus wel random...

Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
Ah ok, dat wist ik niet :)

Hoop dat je nu wat verder kan iig ;)

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Mischien is het trouwens ook handig om wat kennis op te doen van booleans....
$p = "j" en $p="n" worden dan $p = true en $p = false ;)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
elseif en else if zijn syntactisch niet gelijk, maar ze krijgen wel dezelfde uitkomst.

Quote van php.net:
There may be several elseifs within the same if statement. The first elseif expression (if any) that evaluates to TRUE would be executed. In PHP, you can also write 'else if' (in two words) and the behavior would be identical to the one of 'elseif' (in a single word). The syntactic meaning is slightly different (if you're familiar with C, this is the same behavior) but the bottom line is that both would result in exactly the same behavior.
Voor de mensen die het verschil niet zien:
een hoop elseif's zijn allemaal alternatieven voor de eerste if, terwijl else if los steeds een alternatief wordt voor de if uit de vorige else if.

Hier een indented voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (bla) 
{
  bla
}
else 
{
  if (bla)
  {
    bla
  }
  else
  {
    bla
  }


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
if (bla)
{
  bla
}
elseif (bla)
{
  bla
}
else
{
  bla
}

[ Voor 36% gewijzigd door Grijze Vos op 20-02-2004 15:53 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grijze Vos schreef op 20 februari 2004 @ 15:48:
elseif en else if zijn syntactisch niet gelijk, maar ze krijgen wel dezelfde uitkomst.
syntactisch niet idd, je krijgt een andere parse-tree, maar semantisch is het helemaal gelijk aan elkaar. In de andere C-like talen (C, C++, Java, C#) bestaat er ook geen elseif, omdat het gewoon onzin is om een keyword daarvoor te introduceren als het ook met 2 keywords naast elkaar kan

Maar php heeft wel vaker dat soort rare dingen, zoals echo vs. print (hoewel daar wel ietwat verschil in zit) en exit vs. die

[ Voor 7% gewijzigd door .oisyn op 20-02-2004 16:16 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op 20 februari 2004 @ 16:14:
[...]


syntactisch niet idd, je krijgt een andere parse-tree, maar semantisch is het helemaal gelijk aan elkaar. In de andere C-like talen (C, C++, Java, C#) bestaat er ook geen elseif, omdat het gewoon onzin is om een keyword daarvoor te introduceren als het ook met 2 keywords naast elkaar kan

Maar php heeft wel vaker dat soort rare dingen
Wat ik dan zou doen als interpreter is elseif als else if opvatten, maar of dat ook zo makkelijk gaat?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja dat is heel makkelijk, je kunt in de lexical analyser (die zet een stuk code om naar tokens) bij een elseif gewoon 2 tokens retourneren: ELSE en IF :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
.oisyn schreef op 20 februari 2004 @ 16:18:
Ja dat is heel makkelijk, je kunt in de lexical analyser (die zet een stuk code om naar tokens) bij een elseif gewoon 2 tokens retourneren: ELSE en IF :)
Waarom zou je het dan toch op die/een andere manier willen afhandelen?
Pagina: 1