[PHP] If opdracht wordt niet uitgevoerd?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Debian23
  • Registratie: Augustus 2007
  • Niet online
Ik moest een php scriptje maken waarbij prijzen.txt wordt ingelezen. In dit txt bestandje staan een aantal nummers en deze moet je controleren met het getal wat je net in het form hebt ingevult.
Gemakkelijk dacht ik maar toch werkt hij niet?
PHP:
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
<html>
<head>
    <title>php opgave 60</title>
</head>
<body>
<?php
if (isset($_POST['lotnummer'])){
    $lotnummer=$_POST['lotnummer'];
    $naam="prijzen.txt";
    $open=fopen($naam,"r");
    $array=file($naam);
    $regels=count($array);
    $prijs="Geen prijs, probeer nog eens";
        for ($i=0;$i<$regels;$i++)
        {
            if ($array[$i]==$lotnummer)
            {
            $prijs="prijs!";
            }
            echo("$array[$i] <br>");
            
        }
    echo("<b>$lotnummer </b> <br>");
    echo("<b>$prijs </b>");
    fclose($naam);
}else{
?>
<form action=" <?php echo $_SERVER[SCRIPT_NAME] ?> " method="post">
geeflotnummer en druk daarna op enter!<br><input type="text" name="lotnummer" ><br>
</form>
<?php
}
?>
</body>
</html>


en het prijzen.txt bestand
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
758
914
621
432
444
121
349
578
665
621
699
722
888
678
876
123
129
298
376
368


als ik in het form 444 invul geeft hij dit als resultaat
Afbeeldingslocatie: http://i42.tinypic.com/2ptapea.jpg

vreemd? want $Lotnummer wordt toch een gelijk aan array[$I]?
en hij drukt zelfs 444 af!

iemand suggesties? ik weet het zelf ook niet meer |:(

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

Returns the file in an array. Each element of the array corresponds to a line in the file, with the newline still attached.
Overigens hoef je bij het gebruik van file() geen fopen/fclose te doen.

[ Voor 16% gewijzigd door crisp op 25-05-2009 10:11 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
As always: begin eens met debuggen: Debuggen: Hoe doe ik dat?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 17-09 21:58

BHR

Tijd voor wat mooie logmeldingen? Zoals var_dump van beide variabelen voordat je de if statement ingaat?

[ Voor 0% gewijzigd door BHR op 25-05-2009 10:11 . Reden: te laat :( ]

No amount of key presses will shut off the Random Bug Generator


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

crisp schreef op maandag 25 mei 2009 @ 10:09:
[...]


Overigens hoef je bij het gebruik van file() geen fopen/fclose te doen.
een gevalletje rtrim() dus.
http://nl3.php.net/manual/en/function.rtrim.php

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
PHP:
1
echo $_SERVER[SCRIPT_NAME]


ze ook meteen error_reporting op E_ALL|E_STRICT als je toch gaat debuggen ;)

edit: ook hoef je geen haakjes te gebruiken bij echo :)

[ Voor 19% gewijzigd door Cartman! op 25-05-2009 10:13 ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Volgens mij komt het omdat je een regel tekst vergelijkt met een ander stuk tekst. Achter die regel staat not een \n (new line) en wellicht ook een \r (return) karakter. Gebruik de functie intval() om de tekst van zowel $lotnummer en uit het bestand om te zetten naar een getal.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Johnny schreef op maandag 25 mei 2009 @ 10:14:
Volgens mij komt het omdat je een regel tekst vergelijkt met een ander stuk tekst. Achter die regel staat not een \n (new line) en wellicht ook een \r (return) karakter. Gebruik de functie intval() om de tekst van zowel $lotnummer en uit het bestand om te zetten naar een getal.
^dit. Zorg ervoor dat je $_POST['lotnummer'] en de ingelezen karakters als een int geparsed worden mbv intval en vrienden, en vergelijk ze dan als zodanig. Daarmee kun je ook foute input afvangen (in zowel de $_POST als het .txt bestand), al moet je in de gaten houden dat PHP een string waar geen nummer in staat interpreteert als een 0.

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

YopY schreef op maandag 25 mei 2009 @ 10:25:
[...]

^dit. Zorg ervoor dat je $_POST['lotnummer'] en de ingelezen karakters als een int geparsed worden mbv intval en vrienden, en vergelijk ze dan als zodanig. Daarmee kun je ook foute input afvangen (in zowel de $_POST als het .txt bestand), al moet je in de gaten houden dat PHP een string waar geen nummer in staat interpreteert als een 0.
Niet helemaal waar, de string "123fout!" zal naar de integer 123 parsen, maar "fout123" niet. Zie deze pagina.

EDIT: Ik heb je reactie een beetje verkeerd gelezen. Inderdaad is het zo dat een variabele zonder nummers sowieso een 0 zal zijn. Desalniettemin is het gedrag waar ik het over heb ook zeker iets om rekening mee te houden bij zulke dingen.

[ Voor 17% gewijzigd door Patriot op 25-05-2009 10:40 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:17

crisp

Devver

Pixelated

Ik vind het nogal kort door de bocht om aan te raden de boel maar naar int's te parsen; waar is gezegd dat het lotnummer geen alfanumerieke karakters kan bevatten? Gewoon trimmen en als string vergelijken is prima.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Ik vind de manier waarop jij dit hebt gemaakt heel erg raar, als je met arrays werkt dan weet je dat je niets in loops moet matchen, aangezien die sowieso naar de laatste regel van het bestand gaat. Daarom moet je de data als je wilt eerst "vastleggen" en dan pas proberen te matchen.

Ik heb even je script iets aangepast, het script werkt helemaal, alleen zou ik sommige dingen net wat anders doen maar goed. Het gaat even om het idee:

PHP:
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
<html> 
<head> 
    <title>php opgave 60</title> 
</head> 
<body> 
<?php 
if (isset($_POST['lotnummer']) && $_POST["lotnummer"]){ 
    foreach(file("prijzen.txt") as $num => $data) {
        $d[$num + 1] = $data;
    }
    
    /*
        See whats in array $d
        print_r($d);
    */

    if(array_key_exists($_POST["lotnummer"], $d) && $d[$_POST["lotnummer"]]) {
        echo "Lotnummer: <strong>" . $_POST["lotnummer"] . "</strong><br />
        Prijs: <strong>&euro;" . $d[$_POST["lotnummer"]] . "</strong>";
    } else {
        echo "Er was geen match gevonden, probeer een ander getal! :)";
    }
}else{ 
echo "
<form action=" . $_SERVER["SCRIPT_NAME"] . " method=\"post\"> 
Geef een lotnummer en druk daarna op enter! <br />
<input type=\"text\" name=\"lotnummer\" ><br />
<input type=\"submit\" value=\"Gaan met die banaan!\" />
</form>";

} ?>
</body> 
</html>


Er zijn nu in totaal 20 keys (1 t/m 20), heb de 0 niet mee laten doen aangezien lotnummer 0 een beetje raar overkomt ;)
Good luck!

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
PHP:
1
2
3
4
5
6
$File = File('prijzen.txt');
$File = array_map('trim', $File);
If (IsSet($_POST['lotnummer']) && In_Array($_POST['lotnummer']))
{
echo 'Prijs!';
}

Nog simpler :P

[ Voor 28% gewijzigd door Megamind op 25-05-2009 11:52 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Tja, gebruik dan meteen in_array()

edit
beetje laat... :X

[ Voor 8% gewijzigd door Verwijderd op 25-05-2009 11:53 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Verwijderd schreef op maandag 25 mei 2009 @ 11:53:
[...]

Tja, gebruik dan meteen in_array()

edit
beetje laat... :X
Zojuist al gedaan maar werkte even zo 1,2,3 niet, had geen zin meer om langer bezig te gaan met het scriptje :X

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Megamind schreef op maandag 25 mei 2009 @ 11:51:
PHP:
1
2
3
4
5
6
$File = File('prijzen.txt');
$File = array_map('trim', $File);
If (IsSet($_POST['lotnummer']) && In_Array($_POST['lotnummer']))
{
echo 'Prijs!';
}

Nog simpler :P
De syntax die je bij "In_Array" gebruikt is fout, je mist namelijk 1 parameter ;)
Clicky voor php.net

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 17:44

remco_k

een cassettebandje was genoeg

Los van het bovenstaande klopt dit ook niet bepaald:
PHP:
1
2
3
    $open=fopen($naam,"r"); 
    // <knip>
    fclose($naam);

Als eerste gebruik je resource $open verder nergens, dus de fopen gebeurd imo helemaal voor niets.
Vervolgens doe je een fclose, met als parameter de bestandsnaam? Die parameter moet een resource zijn, $open.
Maar in het voorbeeld wat je geeft kunnen deze 2 regels gewoon weg als je het mij vraagt.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Manueltje22 schreef op maandag 25 mei 2009 @ 11:44:
Ik vind de manier waarop jij dit hebt gemaakt heel erg raar, als je met arrays werkt dan weet je dat je niets in loops moet matchen, aangezien die sowieso naar de laatste regel van het bestand gaat. Daarom moet je de data als je wilt eerst "vastleggen" en dan pas proberen te matchen.

[...]

PHP:
1
2
3
    foreach(file("prijzen.txt") as $num => $data) {
        $d[$num + 1] = $data;
    }
Waarom doe je dan hier zo onzinnig? Wat denk je dat file() returnt? En wat denk je dat de TS in zijn $array variabele heeft staan? En sowieso, waarom $num + 1?

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!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
.oisyn schreef op maandag 25 mei 2009 @ 11:59:
[...]

Waarom doe je dan hier zo onzinnig? Wat denk je dat file() returnt? En wat denk je dat de TS in zijn $array variabele heeft staan? En sowieso, waarom $num + 1?
File stuurt inderdaad een array terug, namelijk 2 dingen: Regelnummer, data van regelnummer. Dus je krijgt dan weer een keyset van 0 => 1 => 2 etc. Ik heb daarom $num + 1 gebruikt zodat als iemand een lotnummer van 1 gebruikt dat die naar de set van 0 gaat en niet andersom, zo heb je nu 20 loten en niemand heeft het getal 0.

Het lijkt me namelijk erg stug dat als jij een lot koopt je ineens het lotnummer 0 hebt.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De regelnummers hebben helemaal geen betekenis, dus je doet moeilijk. :z ,)

{signature}


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Voutloos schreef op maandag 25 mei 2009 @ 12:15:
De regelnummers hebben helemaal geen betekenis, dus je doet moeilijk. :z ,)
Nu ja, ik zou zeggen ga je gang :)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Uit de topicstart is af te leiden dat de winnende nummers in het bestandje staan. Andere nummers of regelnummers doen er niet toe, dus je doet voor niets moelijk. :)

Verder is er weinig mijn gang te gaan: Het huiswerk is reeds gemaakt, Megamind heeft al de ubersimpele oplossing gegeven. ;)

{signature}


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Manueltje22 schreef op maandag 25 mei 2009 @ 12:03:
[...]


File stuurt inderdaad een array terug, namelijk 2 dingen: Regelnummer, data van regelnummer. Dus je krijgt dan weer een keyset van 0 => 1 => 2 etc. Ik heb daarom $num + 1 gebruikt zodat als iemand een lotnummer van 1 gebruikt dat die naar de set van 0 gaat en niet andersom, zo heb je nu 20 loten en niemand heeft het getal 0.
Onzin. Het enige wat jij effectief doet is elke key met 1 verhogen. Oftewel, als je data eerst was: array(1 => "bla", 2 => "woei"), dan is ie daarna: array(2 => "bla", 3 => "woei")

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!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Precies zoals ik zeg lijkt me? Ik zei ook: "Ik heb daarom $num + 1 gebruikt zodat als iemand een lotnummer van 1 gebruikt dat die naar de set van 0 gaat en niet andersom, zo heb je nu 20 loten en niemand heeft het getal 0.". Daarmee bedoelde ik dat niemand nu het lotnummer 0 kon hebben..

Dan ziet het er zo uit (print_r):
PHP:
1
2
3
Array ( [1] => 758 [2] => 914 [3] => 621 [4] => 432 [5] => 444 [6] => 121 [7] => 349 [8] => 578 [9] => 665 [10] => 621 [11] => 699 [12] => 722 [13] => 888 [14] => 678 [15] => 876 [16] => 123 [17] => 129 [18] => 298 [19] => 376 [20] => 368 ) 
Lotnummer: 1
Prijs: €758

Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, je zegt het gewoon vaag. Een lotnummer is bijv. 758, niet 1. En "de set van 0" klinkt ook raar. De elementen in de lijst zijn namelijk geen sets; een set is een verzameling, en de elementen in de array zijn gewoon getallen. Daarnaast, wat moet je met die informatie?

En waarom een key in die array niet 0 mag zijn is me ook niet helemaal duidelijk. Wellicht heeft dat hiermee te maken:
PHP:
1
if(array_key_exists($_POST["lotnummer"], $d) && $d[$_POST["lotnummer"]])

maar die code slaat nergens op. Je lotnummers staan namelijk niet in de keys, maar in de values. Echter ben je hier juist aan de hand van de keys dingen aan het opzoeken. Ik denk dus ook dat je het hele key/value idee hebt ongewisseld in je hoofd, en moest die foreach in het begin eigenlijk dit zijn:
PHP:
1
2
3
    foreach(file("prijzen.txt") as $num => $data) { 
        $d[$data] = $num + 1;  // ipv: $d[$num + 1] = $data; 
    }

[ Voor 60% gewijzigd door .oisyn op 25-05-2009 13:06 ]

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!

  • user109731
  • Registratie: Maart 2004
  • Niet online
.oisyn schreef op maandag 25 mei 2009 @ 13:01:
En waarom een key in die array niet 0 mag zijn is me ook niet helemaal duidelijk.
Hij gaat uit van het prijzen.txt lijstje zoals in de TS: lotnummer 1 (regel 1) wint 758 euro, lotnummer 2 wint 914, etc. lotnummer => prijs. Die loop gebruikt hij dan om regel 1 (lotnummer 1) op index 1 te hebben, en dan bevatten de keys wel de lotnummers...

Echter zoals gezegd bevat prijzen.txt geen bedragen maar alleen de lotnummers :)

[ Voor 12% gewijzigd door user109731 op 25-05-2009 13:16 ]


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aha :D

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!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
758
914
621
432
444
121
349
578
665
621
699
722
888
678
876
123
129
298
376
368


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function hasPrice($priceFile, $lotNumber){
    if(!file_exists($priceFile)) return flase;
    foreach(file($priceFile) as $line){
        $line = trim($line);
        if(strlen($line)>0 && is_numeric($line)){
            if($line==$lotNumber) return true;
        }
    }
    return false;
}

if(isset($_POST['lotNumber'])){
    echo hasPrice('prijzen.txt', $_POST['lotNumber'])?'Je hebt prijs!':'Geen prijs voor jouw :( ';
}


Komt het niet gewoon hier op neer?

De functie file doet niks anders dan een array returnen met voor elke item een regel uit het bestand.

PHP:
1
2
$open = file('prijzen.tx');
fclose($open); // fclose('prijzen.txt') :S

Gaat dus niet werken ;)

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
vdvleon schreef op maandag 25 mei 2009 @ 14:28:

PHP:
1
//code


Komt het niet gewoon hier op neer?
Nee, je doet moeilijk. Er is helemaal geen foreach nodig. Megamind heeft al de beste oplossing gepost.
De functie file doet niks anders dan een array returnen met voor elke item een regel uit het bestand.

PHP:
1
2
$open = file('prijzen.tx');
fclose($open); // fclose('prijzen.txt') :S

Gaat dus niet werken ;)
Het gaat wel werken, het heeft enkel geen nut 8) En dat is al twee maal opgemerkt btw.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
uh, je leest toch echt niet goed ;)

met fclose sluit je een handle die geopend is met fopen of fsockopen. file leest in als array, en een array is geen handle... snap je em nu? ;)

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Cartman! schreef op maandag 25 mei 2009 @ 18:58:
uh, je leest toch echt niet goed ;)

met fclose sluit je een handle die geopend is met fopen of fsockopen. file leest in als array, en een array is geen handle... snap je em nu? ;)
Zijn punt is dat het voor de werking van het script bar weinig uitmaakt dat het er staat. In die zin 'werkt het' (waar 'het' niet die twee regeltjes code maar het hele script is).

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
Inderdaad, hoewel het natuurlijk wel een error kan geven.

Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Met 'werkt het' zou ik bedoelen, doet het wat het zou moeten doen. En
PHP:
1
2
3
4
<?php
$open = file('prijzen.tx');
fclose($open); // fclose('prijzen.txt') :S
?>

Doet dat niet. fclose sluit de 'file handle' niet af, omdat er niet eens spraken is van een file handel. Het is erg handig als je programmeerd dat je weet wat je doet ;) Als je simpel naar php.net gaat en je tikt file in, krijg je netjes te zien dat file een array returned.

Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vind dat hele voorbeeld suf, de TS gebruikte dat namelijk niet. Die deed een fclose() met de filenaam als parameter, niet met de array die door file() gereturned was. In dat opzicht kan de originele code van de TS wél eens gewoon niet werken, omdat hij twee keer dezelfde file probeert te openen (ergo, het gaat dan om de fopen() voor de file(), niet om de fclose() na de file()). Als je dat doet op een OS die 'm bij openen automatisch lockt ben je de sjaak.

[ Voor 10% gewijzigd door .oisyn op 25-05-2009 22:47 ]

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!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
We dwalen een beetje af hier. Maar het is dus opgelost, mooi.
Pagina: 1