IF-statement met $_GET parameter lukt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Mijn vraag
Hoe kan ik ook alweer de variabelen formuleren die ik in combinatie van een $_GET[...] en een IF-statement kan gebruiken?
Omdat ik een echte beginner ben wat betreft PHP, zitten er wel flarden van code in mijn hoofd, maar zonder onderlinge relatie.
Ik wil de uiteindelijke code zelf kunnen schrijven, maar enige uitleg en wat handvatten bij mijn probleem zijn zeer welkom.

Relevante software en hardware die ik gebruik
notepad++, xampp

Wat ik al gevonden of geprobeerd heb
Het blijkt wel dat ik echt nog maar weinig weet heb van PHP. Toch heb ik dat nodig om te bereiken wat ik met mijn foto's wil doen.
Oorspronkelijk had ik één grote array met 20 foto's. Nu wil ik dat ze met 4 of 5 naast elkaar komen te staan. Bovendien moet je kunnen kiezen of je alleen de eerste rij foto's ziet (4/5 foto's naast elkaar) of juist 2 rijen of 3 rijen, etc. Tot maximaal 4 of 5 rijen onder elkaar dus.
Nu heb ik 5 kleinere arrays gemaakt en als ik ze na elkaar uitlees komen er i.c.m. CSS vijf rijen van vier foto's onder elkaar.
Dit staat in CSS:

Cascading Stylesheet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        
        #container{
            margin: 0 auto;
            width: 900px;
            background-color: #ffffff;
        }

        ul {
            list-style-type: none;
            display: flex;
            margin-top: 0;
            padding-left: 20px;
        }

        ul li img {
            margin-right: 20px;
        }


Het bestand van de eigenlijke webpagina bevat deze 'include'-instructie:

HTML:
1
2
3
        <div id="container">        
            <?php include('photos.php'); ?>
        </div>


En zo heb ik het PHP-bestand geformuleerd:

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
36
37
38
39
40
41
        <?php
        $rij1 = array('<img src="img/photo1.jpg">', '<img src="img/photo2.jpg">', '<img src="img/photo3.jpg">', '<img src="img/photo4.jpg">');

        $rij2 = array('<img src="img/photo5.jpg">', '<img src="img/photo6.jpg">', '<img src="img/photo7.jpg">', '<img src="img/photo8.jpg">');

        $rij3 = array('<img src="img/photo9.jpg">', '<img src="img/photo10.jpg">', '<img src="img/photo11.jpg">', '<img src="img/photo12.jpg">');

        $rij4 = array('<img src="img/photo13.jpg">', '<img src="img/photo14.jpg">', '<img src="img/photo15.jpg">', '<img src="img/photo16.jpg">');

        $rij5 = array('<img src="img/photo17.jpg">', '<img src="img/photo18.jpg">', '<img src="img/photo19.jpg">', '<img src="img/photo20.jpg">');

            echo '<ul>';
            foreach ($rij1 as $value){
                echo '<li>'.$value.'</li><br>';
            }
            echo '</ul>';
            
            echo '<ul>';
            foreach ($rij2 as $value){
                echo '<li>'.$value.'</li><br>';
            }
            echo '</ul>';
            
            echo '<ul>';
            foreach ($rij3 as $value){
                echo '<li>'.$value.'</li><br>';
            }
            echo '</ul>';
            
            echo '<ul>';
            foreach ($rij4 as $value){
                echo '<li>'.$value.'</li><br>';
            }
            echo '</ul>';
            
            echo '<ul>';
            foreach ($rij5 as $value){
                echo '<li>'.$value.'</li><br>';
            }
            echo '</ul>';
        ?>


Maar dat wil ik zo niet laten. Bij een webshop heb ik wel eens gezien dat je meer produkten kunt opvragen. Zoiets wil ik ook voor mijn foto's maken. In plaats van alle 20 foto's tegelijkertijd te tonen, wil ik het aantal zichtbare foto's zelf kunnen kiezen. En in de adresbalk komt dan iets te staan als:

http://localhost/album.php?aantal=9

En als ik dan 'aantal=9' verander in 'aantal=5' dan zou ik bijvoorbeeld maar 5 foto's moeten zien.
Omdat ik een echte beginner ben wat betreft PHP, zitten er wel flarden van code in mijn hoofd, maar zonder onderlinge relatie. Mijn aanpak vraagt daarom om enige correctie.

Ik denk dat ik moet beginnen met het formuleren van een variabele zonder inhoud met daaronder een controle:

PHP:
1
2
3
4
5
6
        <?php       
        $aantal = ' ';
        if(isset($_GET['aantal'])){
            $aantal = $_GET['aantal'];
        }
        ?>


Ergens (maar waar???) moet er ook een link geplaatst worden met een verwijzing naar de adresbalk:

HTML:
1
        <a href="http://localhost/album.php?aantal=...">...</a>


En wat zou er dan op de plek van de puntjes moeten staan?

Wat ik niet goed kan snappen is op welke manier de adresbalk "weet"
1. dat er foto's op de pagina aanwezig zijn en vooral
2. wat het aantal foto's is dat getoond wordt.

Ik zou namelijk iets met een IF-statement willen doen waarin bijvoorbeeld het volgende voorkomt:

PHP:
1
2
3
4
5
        if($aantal == '...'){
            echo '...';
        } elseif($aantal == '...'){
            echo '...';
        } etc.


Maar ik wil graag uitgelegd krijgen hoe ik dat moet combineren met de individuele foto's. Bestaat er misschien zoiets als een optelmechanisme waarmee je het aantal te tonen foto's kunt beïnvloeden?

Wellicht ben ik wel helemaal verkeerd begonnen en is dat de reden dat ik hier niet uitkom. Moet ik eventueel gebruik maken van een multidimensionale array?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        <?php
        $photos = array(
                array('href' => 'localhost/album.php', 'content' => '<img src="img/photo1.jpg">'),
                array('href' => 'localhost/album.php', 'content' => '<img src="img/photo2.jpg">'),
                array('href' => 'localhost/album.php', 'content' => '<img src="img/photo3.jpg">'),
                array('href' => 'localhost/album.php', 'content' => '<img src="img/photo4.jpg">'),
                //etc.
                );

            echo '<ul>';
                    foreach ($photos as $key => $value){
                              foreach ($value as $key2 => $value2){
                          echo '<li>'.$value2.'</li><br>';
                          }
            }
                    echo '</ul>';
        ?>


Waar en hoe moet ik het PHP-bestand en de array aanpassen om het beoogde trucje te realiseren? Wie is zo vriendelijk om wat meer begrijpelijke uitleg te geven? Alvast bedankt.

[ Voor 0% gewijzigd door .oisyn op 23-10-2017 10:43 ]

Beste antwoord (via dfle op 21-10-2017 15:25)


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:39

orf

Je kunt een variabele gebruiken waar het aantal foto's in staat:

PHP:
1
$aantal = 5;


Als er iets in de URL staat, overschrijf je dit variabele met die waarde:

PHP:
1
2
3
4
5
$aantal = 5;

if (isset($_GET['aantal'])){
  $aantal = $_GET['aantal'];
}


Nu kun je $aantal in je code gebruiken om foto 1 t/m 5 te tonen of 1 t/m 10 als er [url]?aantal=10 in de adresbalk staat. In je HTML kun je gewoon linkjes opnemen. Dat kun je ook met een loopje doen, zodat je niet 10x hetzelfde linkje hoeft te typen met alleen een ander getal.

Je kunt het jezelf ook makkelijker maken met je array foto's. Met PHP kun je gemakkelijk tellen of loopen:

PHP:
1
2
3
4
$fotoNummers = range(1, 20);
foreach($fotoNummers as $getal){
  echo '<img src="img/foto' . $getal . '.jpg">';
}


Of je gebruikt een ander soort loopje, waar al een ophogend nummer in zit:

PHP:
1
2
3
for ($getal = 1; $getal <= 20; $getal++){
  echo '<img src="img/foto' . $getal . '.jpg">';
}


Je $aantal van hierboven kun je dan bijvoorbeeld zo gebruiken:

PHP:
1
2
3
4
5
for ($getal = 1; $getal <= 20; $getal++){
  if ($getal <= $aantal){
    echo '<img src="img/foto' . $getal . '.jpg">';
  }
}



Het is nóg makkelijker om met PHP de map /img uit te lezen. Dan hoef je de PHP code niet aan te passen als je een foto meer of minder hebt. De bestandsnamen maken dan ineens ook een stuk minder uit.

PHP:
1
2
3
foreach (glob('img/*.jpg') as $filename) {
    echo '<img src="' . $filename . '">';
}



Met een beetje slim je code uitdenken kun je dan misschien wel in 5-10 regels code het zo flexibel maken dat je een variabel aantal foto's kan tonen uit een map vol foto's. :)

Alle reacties


Acties:
  • +2 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Begin eens met [code] tags zou ik zeggen.
Je post is niet leesbaar.

Maak je niet druk, dat doet de compressor maar


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:39

orf

Je kunt een variabele gebruiken waar het aantal foto's in staat:

PHP:
1
$aantal = 5;


Als er iets in de URL staat, overschrijf je dit variabele met die waarde:

PHP:
1
2
3
4
5
$aantal = 5;

if (isset($_GET['aantal'])){
  $aantal = $_GET['aantal'];
}


Nu kun je $aantal in je code gebruiken om foto 1 t/m 5 te tonen of 1 t/m 10 als er [url]?aantal=10 in de adresbalk staat. In je HTML kun je gewoon linkjes opnemen. Dat kun je ook met een loopje doen, zodat je niet 10x hetzelfde linkje hoeft te typen met alleen een ander getal.

Je kunt het jezelf ook makkelijker maken met je array foto's. Met PHP kun je gemakkelijk tellen of loopen:

PHP:
1
2
3
4
$fotoNummers = range(1, 20);
foreach($fotoNummers as $getal){
  echo '<img src="img/foto' . $getal . '.jpg">';
}


Of je gebruikt een ander soort loopje, waar al een ophogend nummer in zit:

PHP:
1
2
3
for ($getal = 1; $getal <= 20; $getal++){
  echo '<img src="img/foto' . $getal . '.jpg">';
}


Je $aantal van hierboven kun je dan bijvoorbeeld zo gebruiken:

PHP:
1
2
3
4
5
for ($getal = 1; $getal <= 20; $getal++){
  if ($getal <= $aantal){
    echo '<img src="img/foto' . $getal . '.jpg">';
  }
}



Het is nóg makkelijker om met PHP de map /img uit te lezen. Dan hoef je de PHP code niet aan te passen als je een foto meer of minder hebt. De bestandsnamen maken dan ineens ook een stuk minder uit.

PHP:
1
2
3
foreach (glob('img/*.jpg') as $filename) {
    echo '<img src="' . $filename . '">';
}



Met een beetje slim je code uitdenken kun je dan misschien wel in 5-10 regels code het zo flexibel maken dat je een variabel aantal foto's kan tonen uit een map vol foto's. :)

Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Merci orf voor uw uitleg. Dat van die variabele $aantal wist ik inderdaad nog. Dat had ik al opgenomen boven de array. Maar dat heeft nu nog geen effect op de webpagina of in de adresbalk. Als ik dat werkend krijg, hoef ik waarschijnlijk ook niet vijf kleine arrays te maken, maar kan ik gewoon één grote array van alle foto's gebruiken.

U schrijft:
"Nu kun je $aantal in je code gebruiken om foto 1 t/m 5 te tonen of 1 t/m 10 als er [url]?aantal=10 in de adresbalk staat. In je HTML kun je gewoon linkjes opnemen."

Dat is precies waar bij mij de blokkade zit. Hoe gebruik ik $aantal in een code zodat het effectief in de adresbalk zichtbaar wordt? Ik stel me zo voor dat ik in de multidimensionale array per foto deze [key] => 'value' opneem:
'href' => 'http://localhost/album.php?aantal=1' voorde eerste foto
en voor foto nummer 2: 'href' => 'http://localhost/album.php?aantal=2', etc.
Of vergis ik me nog steeds en is dat niet voldoende?

Op een of andere manier moet ik toch die variabele $aantal verbinden met het feitelijke aantal foto's?

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:39

orf

Ik heb al een voorbeeld gegeven hoe je een loopje doet voor de foto's. Dat kun je natuurlijk precies hetzelfde gebruiken voor de linkjes:

PHP:
1
2
3
for ($getal = 1; $getal <= 20; $getal++){
  echo '<a href="example.org/script.php?aantal=' . $getal . '">' . $getal . '</a><br>';
}


Met dit voorbeeld gebruik je nog geen arrays. Maar het lijkt me een goed idee om eerst variabelen, if-constructies en loops te begrijpen voordat je met arrays aan de slag gaat.

Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Inderdaad, door eerst de variabele $aantal met inhoud te definiëren gevolgd door de controle met isset is aan een eerste voorwaarde voldaan. Alle foto's heb ik nu op deze manier in één array geplaatst:

PHP:
1
2
3
4
5
6
7
8
9
        $photos = array
                ('<img src="img/photo' . $getal . '.jpg">',
                 '<img src="img/photo' . $getal . '.jpg">',
                 '<img src="img/photo' . $getal . '.jpg">',
                 '<img src="img/photo' . $getal . '.jpg">',
                 '<img src="img/photo' . $getal . '.jpg">',
                 '<img src="img/photo' . $getal . '.jpg">',
                 '<img src="img/photo' . $getal . '.jpg">',
                                 etc.


En daarboven de for-loop:

PHP:
1
2
3
4
5
6
7
8
        for($getal = 1; $getal <= 20; $getal++)
        {   if($getal <= $aantal)
            {
                echo '<ul>';
                echo '<img src="img/photo' . $getal . '.jpg">';
                echo '</ul>';
            }
        }


Ik heb zo de unordered list kunnen behouden en in de CSS heb ik alleen maar 'display: flex;' hoeven te wijzigen in 'display: inline;'.

Omdat ik zo gefixeerd was op het gebruik van een foreach-loop, heb ik helemaal niet gedacht in deze richting. U hebt het helder uitgelegd. Hiermee kan ik hopelijk ook in andere situaties met de $_GET[]-parameter uit de voeten.
Mijn complimenten en een dikke merci voor orf.

[ Voor 1% gewijzigd door .oisyn op 23-10-2017 10:45 ]


Acties:
  • 0 Henk 'm!

  • TomsDiner
  • Registratie: November 2014
  • Laatst online: 18-07 23:44
Is dit niet dubbelop?

Je doet een for tot 20, en gebruikt daarna alleen de nummers kleiner dan aantal. Dan zou ik for tot $aantal doen...

Ik zou dit doen:

code:
1
2
3
4
5
for($getal = 1; $getal <= $aantal; $getal++) {
  echo '<li>';
  echo '<img src="img/photo' . $getal . '.jpg">';
  echo '</li>';
}


(Ik neem aan dat je <ul><li></li></ul> gaat gebruiken, dus rondom de foto's LI ipv UL)

[ Voor 20% gewijzigd door TomsDiner op 21-10-2017 23:28 ]


Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Dank TomsDiner voor uw terechte correctie.
Ik heb de code als volgt aangepast:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$aantal = 4;

if (isset($_GET['aantal']))
{
  $aantal = $_GET['aantal'];
}

for($getal = 1; $getal <= $aantal; $getal++)
{   if($getal <= $aantal)
    {
        echo '<ul>';
        echo '<li><img src="img/photo' . $getal . '.jpg"></li>';
        echo '</ul>';
    }
}

?>


En verder bedenk ik achteraf ook dat ik bij een for-loop helemaal geen array hoef te definiëren.
Met een foreach-loop heb je zo'n array wel klaarstaan. Dus met genummerde foto's. Maar met een foreach-loop is dan niet te realiseren wat met bovenstaande for-loop wel kan. Ik zou namelijk niet weten welke restricties opgenomen dienen te worden in een ingebed IF-statement.

[ Voor 0% gewijzigd door .oisyn op 23-10-2017 10:45 ]


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:39

orf

Toch deed ik de if met een reden binnen de loop. Wat als in de url een enorm getal wordt gezet? Wat gebeurt er als ik script.php?aantal=9223372036854775807 aanroep?

Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Inderdaad. Ik heb niet letterlijk het voorbeeld uitgeprobeerd, want de computer zou wel eens op hol kunnen slaan.
Het is dus wel degelijk nodig om de voorwaarde van de for-loop te beperken tot het beschikbare aantal foto's.

En met een zogenoemde transtypage kun je voorkomen dat er iets anders dan een heel getal wordt aangeroepen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

if (isset($_GET['aantal']))
{
   $_GET['aantal'] = (int) $_GET['aantal'];
   $aantal = $_GET['aantal'];

   if($_GET['aantal'] >= 1 && $_GET['aantal'] <= 20)
   {
      for($getal = 1; $getal <= $_GET['aantal']; $getal++)
      {
         echo '<ul>';
     echo '<li><img src="img/photo' . $getal . '.jpg"></li>';
     echo '</ul>';
      }
   }
}

?>


Is dit een verstandige manier van formuleren?

[ Voor 0% gewijzigd door .oisyn op 23-10-2017 10:45 ]


Acties:
  • +1 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

@dfle ik wil je graag helpen, maar lees de FAQ eens door en dan in het bijzonder de stukjes over de code-tag en/of de php-tag. De code die je hier post is echt niet te lezen. :/ @DJMaze gaf dit in deze post al aan maar dat heb je kennelijk gemist. Doe ons en de toekomstige zoeker een plezier en edit je posts in dit topic even... dan heb je gelijk die code-tag onder de knie en kunnen we de volgende keer de quote-tag doen :7

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Ja, ik heb het uitgeprobeerd. Dat ziet er veel verzorgder uit.
Mijn laatste bericht heb ik hieronder herschreven. Is dit de bedoeling?
Maar waarom staan er 'antislash'-tekens in?

Inderdaad. Ik heb niet letterlijk het voorbeeld uitgeprobeerd, want de computer zou wel eens op hol kunnen slaan.
Het is dus wel degelijk nodig om de voorwaarde van de for-loop te beperken tot het beschikbare aantal foto's.

En met een zogenoemde transtypage kun je voorkomen dat er iets anders dan een heel getal wordt aangeroepen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (isset($_GET['aantal']))
{
   $_GET['aantal'] = (int) $_GET['aantal'];
   $aantal = $_GET['aantal'];

   if($_GET['aantal'] >= 1 && $_GET['aantal'] <= 20)
   {
      for($getal = 1; $getal <= $_GET['aantal']; $getal++)
      {
         echo '[ul]';
         echo '[li][img src="img/photo' . $getal . '.jpg"][/li]';
         echo '[/ul]';
      }
   }
}


Is dit een verstandige manier van formuleren?

Acties:
  • +1 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 00:53
PHP:
1
2
3
4
   $_GET['aantal'] = (int) $_GET['aantal'];
   $aantal = $_GET['aantal'];

   if($_GET['aantal'] >= 1 && $_GET['aantal'] <= 20)


Die eerste 2 regels kun je toch gewoon samenvoegen tot
PHP:
1
   $aantal = (int) $_GET['aantal'];

?

En waarom definieer je eerst $aantal, om die variabele vervolgens nergens meer te gebruiken? ;) Het zou logischer zijn om in de rest van de code $_GET['aantal'] door $aantal te vervangen, dus in de if-statement en in de for-loop.

De code die je nu hebt geschreven doet helemaal niets meer wanneer er geen $_GET["aantal"] wordt opgegeven, of wanneer er een getal buiten 1-20 wordt opgegeven. Is dat wel de bedoeling? Zou je niet liever op een default terugvallen o.i.d?

En wat gebeurt er als je een keer meer of minder dan 20 foto's hebt? Meer dan 20 foto's kun je via dit script niet opvragen, en stel dat er maar 15 foto's bestaan dan gaat jouw script dode links genereren. Ik zou zoals @orf al voorstelt vanuit PHP de /img map uitlezen.

Zoiets (niet getest ofzo, puur voor het idee):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$afbeeldingen = glob('img/*.jpg');
$aantal = $_GET['aantal'];

if (!is_int($aantal) || $aantal < 1 || $aantal > count($afbeeldingen)) {
  $aantal = count($afbeeldingen);
}

for($i = 0; $i <= $aantal-1; $i++) {
  echo '[ul]';
  echo '[li][img src="' . $afbeeldingen[$i] . '"][/li]';
  echo '[/ul]';
}

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Wat @Xander zegt. De truc van slim programmeren/coden is natuurlijk dat je de boel zó in elkaar draait dat je ook rekening houdt met 'onvoorziene' situaties (als je ze voorziet zijn ze natuurlijk niet meer onvoorzien ;)) en oneigenlijk gebruik door users. Wanneer je gebruik maakt van variabelen in de $_GET-scope moet je daarom eigenlijk altijd defaulten wanneer de waarde niet in het verwachte bereik valt. Het is natuurlijk niet geheel ondenkbaar dat iemand in de adresbalk zelf pagina.php?aantal=999 in gaat vullen. Wat gebeurt er dan?

Hoeder van het Noord-Meierijse dialect


Acties:
  • +1 Henk 'm!

  • Kontsnorretje
  • Registratie: Augustus 2011
  • Laatst online: 14-06-2024
Om het geheel even aan te vullen, maar toch out of scope te gaan:
GET waardes uitfilteren moet helemaal wanneer je een Database connectie hebt, of aan de hand van de GET waardes includes doet.

Stel dat je iets als de volgende setup hebt:
URL = www.example.com/index.php?page=main.php
code:
1
2
3
4
5
6
<?php
$page = $_GET['page'];
include('header.php');
include($page);
include('footer.php');
?>


Wat gebeurd er als iemand /etc/passwd in de URL zet? Je wachtwoorden kunnen worden uitgelezen en uiteindelijk gedecrypt. Nu is je webserver een C&C server voor malware.

Het zelfde geldt voor data input voor databases, dit is de eerste stap tegen SQL injectie, ook al gebruik je PDO als driver.

Acties:
  • +1 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Xander schrijft:
quote: url
PHP:
1
2
3
4
   $_GET['aantal'] = (int) $_GET['aantal'];
   $aantal = $_GET['aantal'];

   if($_GET['aantal'] >= 1 && $_GET['aantal'] <= 20)


Die eerste 2 regels kun je toch gewoon samenvoegen tot
PHP:
1
   $aantal = (int) $_GET['aantal'];

Het zou logischer zijn om in de rest van de code $_GET['aantal'] door $aantal te vervangen, dus in de if-statement en in de for-loop.
Dit heb ik inmiddels aangepast en de code doet nog steeds waarvoor hij bedoeld is. Merci voor de tip.

Uit het vervolg van zijn reactie begrijp ik (maar ik ben slechts debutant wat betreft PHP) dat ik de functie 'count($afbeeldingen)' pas kan gebruiken, indien er ook fysiek van tevoren een $afbeeldingen = array() is gemaakt.
Of betekent 'glob('img/*.jpg')' dat van alle in de map 'img' aanwezige jpg-bestanden automatisch een array wordt gemaakt?
Voorlopig doet zijn voorgestelde code niets anders dan de hele verzameling jpg-bestanden afficheren, ook als ik 'X' in 'http://localhost/album.php?aantal=X' wijzig in een willekeurig heel getal.

Harrie_ schrijft:
quote: url
@dfle ik wil je graag helpen, maar lees de FAQ eens door en dan in het bijzonder de stukjes over de code-tag en/of de php-tag. De code die je hier post is echt niet te lezen.
Ik heb zijn advies ter harte genomen en vervolgens gevraagd waar die antislash-tekens vandaan komen? Want ik heb ze zelf niet geschreven.
Kan iemand dat uitleggen?

De opmerking van Kontsnorretje zet mij direct op mijn plaats als maar net startende met PHP. Het zal zeker hout snijden wat hij zegt, maar voor mij is dat op dit moment nog te cryptisch om te begrijpen. Ik kan dus spijtig genoeg niet echt adequaat reageren.

Acties:
  • 0 Henk 'm!

  • dfle
  • Registratie: Oktober 2017
  • Laatst online: 30-10-2022
Het voorstel van Xander heb ik enigszins aangepast en de code werkt nu wel op de volgende manier:
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
36
37
38
39
40
41
42
43
$aantal = 2;
         // om bij het invoeren van 'http://localhost/album.php' alvast enkele foto's te tonen
$photos = glob('img/*.jpg');
         // de functie glob('') maakt van alle in een map aanwezige bestanden (naar gedefinieerd type) automatisch een array

if (isset($_GET['aantal']))
{
    // $_GET['aantal'] = (int) $_GET['aantal']; // transtypage
    // $aantal = $_GET['aantal'];
             // beide regels mogen worden vervangen door :
    $aantal = (int) $_GET['aantal'];
}

if (!is_int($aantal) || $aantal < 1 || $aantal > count($photos))
{
    $aantal = count($photos);
}

for($getal = 0; $getal <= $aantal-1; $getal++)
{
    echo '[ul]';
    echo '[li][img src="' . $photos[$getal] . '"][/li]';
    echo '[/ul]';
}

//of deze for-loop:
/*
for($i = 0; $i <= $aantal-1; $i++)
{
    echo '[ul]';
    echo '[li][img src="' . $photos[$i] . '"][/li]';
    echo '[/ul]';
}
*/
//of deze for-loop:
/*
for($getal = 1; $getal <= $aantal; $getal++)
{
    echo '[ul]';
    echo '[li][img src="img/photo' . $getal . '.jpg"][/li]';
    echo '[/ul]';
}
*/


Maar op welke manier beïnvloedt de inhoud van 'echo' de startpositie van de for-loop?
Dus: waarom begint de for-loop de ene keer met $getal = 0; en de andere keer met $getal = 1;?

En nogmaals: hoe kan ik die onverwachte antislash-tekens vermijden?

Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

dfle schreef op dinsdag 24 oktober 2017 @ 12:29:
Maar op welke manier beïnvloedt de inhoud van 'echo' de startpositie van de for-loop?
Dus: waarom begint de for-loop de ene keer met $getal = 0; en de andere keer met $getal = 1;?
Staat $getal eigenlijk wel op 0? Heb je al geprobeerd om deze te echo-en of voordat je aan je loop begint of om deze vooraf op 0 te zetten? En waarom gebruik je $getal en niet $i wat eigenlijk common practice is?
dfle schreef op dinsdag 24 oktober 2017 @ 12:29:
En nogmaals: hoe kan ik die onverwachte antislash-tekens vermijden?
Geen idee waar dit vandaan komt. Ik zie in je code [ul]- en [li]-tags staan, i.p.v. (in HTML gebruikelijke) <ul>- en <li>-tags. Heeft het misschien te maken met het feit dat dat [ul] en [li] geldige UBB-code is op dit forum en dat het forum ze dus escaped omdat je ze in een [code]-block hebt staan?

P.S. Aardige eerste aanzet, er is natuurlijk altijd van alles wat beter kan, maar onderstaande wilde ik toch nog even kwijt, dit is een korte snippet van je code met comments van mij. Reden dat ik dit aanhaal is, hoewel het altijd fijn is als je code werkt, het wel van belang is dat je even nagaat wat er nu 'logic-wise' gebeurt...
dfle schreef op dinsdag 24 oktober 2017 @ 12:29:
PHP:
14
15
16
17
18
19
20
21
22
23
24
25
$aantal = 2; 
// $aantal is nu zeker weten een int
...
if (isset($_GET['aantal'])) {
    $aantal = (int) $_GET['aantal']; 
// $aantal is ook nu zeker weten een int 
// (bij een ongeldige waarde wordt deze 0, maar dat is ook een int)
}
...
if (!is_int($aantal) || $aantal < 1 || $aantal > count($photos)) 
// hier check je of $aantal een int is...
...

Hoeder van het Noord-Meierijse dialect


Acties:
  • +1 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 00:53
dfle schreef op dinsdag 24 oktober 2017 @ 10:26:
Uit het vervolg van zijn reactie begrijp ik (maar ik ben slechts debutant wat betreft PHP) dat ik de functie 'count($afbeeldingen)' pas kan gebruiken, indien er ook fysiek van tevoren een $afbeeldingen = array() is gemaakt.
De functie count() werkt inderdaad alleen op een array, hij telt namelijk het aantal array-items. ;)

Maar die array hoef je natuurlijk niet met de hand te creëren. :)
Of betekent 'glob('img/*.jpg')' dat van alle in de map 'img' aanwezige jpg-bestanden automatisch een array wordt gemaakt?
Jep! Dat doet deze functie exact. Het voordeel is dat je de code zo nooit hoeft aan te passen als de afbeeldingsbestanden een keer veranderen.
Voorlopig doet zijn voorgestelde code niets anders dan de hele verzameling jpg-bestanden afficheren, ook als ik 'X' in 'http://localhost/album.php?aantal=X' wijzig in een willekeurig heel getal.
My bad, ik converteerde $aantal nergens daadwerkelijk naar een int. 't is 5 jaar geleden dat ik iets met PHP deed, struikelde perongelijk over dit topic. :P Zo werkt 'ie wel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$afbeeldingen = glob('img/*.jpg');
$aantal = (int) $_GET['aantal'];

if ($aantal < 1 || $aantal > count($afbeeldingen)) {
  $aantal = count($afbeeldingen);
}

for($i = 0; $i <= $aantal-1; $i++) {
  echo '<ul>';
  echo '<li><img src="' . $afbeeldingen[$i] . '"></li>';
  echo '</ul>';
}


Heb de is_int er ook uitgehaald, dat is natuurlijk een beetje overbodig als je het net naar een int geconverteerd hebt. :)
Ik heb zijn advies ter harte genomen en vervolgens gevraagd waar die antislash-tekens vandaan komen? Want ik heb ze zelf niet geschreven.
Kan iemand dat uitleggen?
Ik heb ook geen idee waar die \ vandaan komt wanneer je "[li]" binnen code-tags hier probeert te plaatsen.

[ul] [li] enzo is natuurlijk wel foute HTML. Geen idee waar die vandaan komt, had dat stukje code van jou gekopieëerd. :+ Ook gefixt in bovenstaande code. ;)
dfle schreef op dinsdag 24 oktober 2017 @ 12:29:
Maar op welke manier beïnvloedt de inhoud van 'echo' de startpositie van de for-loop?
Dus: waarom begint de for-loop de ene keer met $getal = 0; en de andere keer met $getal = 1;?
Je kunt een for-loop laten beginnen waar je maar wilt. Dit werkt ook gewoon:
PHP:
1
2
3
4
for($i= 155; $i<= 158; $i++)
{
    echo '<img src="img/photo' . $i . '.jpg">';
}


Als je foto's photo155.jpg, photo156.jpg, photo157.jpg en photo158.jpg heten. ;)

In mijn voorbeeld gebruik ik echter de glob()-functie om een array met foto's te vullen. Kijk voor de grap eens met var_dump($afbeeldingen) hoe zo'n array eruit ziet. Ik heb de code net even getest met wat willekeurige plaatjes en dan komt er dit uit:
code:
1
2
3
4
5
6
7
8
9
array(8) { 
[0]=> string(38) "img/04124_shadesofnature_1920x1080.jpg" 
[1]=> string(39) "img/04125_howlinatthemoon_1920x1080.jpg" 
[2]=> string(47) "img/04126_theoverlookoflakelucern_1920x1080.jpg" 
[3]=> string(45) "img/04127_alcazarbathsinsevilla_1920x1080.jpg" 
[4]=> string(39) "img/04128_glaciertrifecta_1920x1080.jpg" 
[5]=> string(35) "img/04129_zuiderheide_1920x1080.jpg" 
[6]=> string(37) "img/04131_mistyyosemite_1920x1080.jpg" 
[7]=> string(38) "img/04132_yosemiteonfire_1920x1080.jpg" }


Zoals je ziet retourneert de glob() functie een array met keys die bij 0 beginnen. Als je de eerste foto wilt invoegen, zul je dus $afbeelding[0] moeten hebben. Zou je de for beginnen bij 1 en dus als eerste $afbeelding[1] invoegen dan mis je een foto.

Onderstaande stukjes code doen trouwens allemaal precies hetzelfde:
PHP:
1
2
3
for($i = 0; $i <= $aantal-1; $i++) {
  echo '<li><img src="' . $afbeeldingen[$i] . '"></li>';
}

PHP:
1
2
3
for($i = 1; $i <= $aantal; $i++) {
  echo '<li><img src="' . $afbeeldingen[$i-1] . '"></li>';
}

PHP:
1
2
3
for($i = 0; $i < $aantal; $i++) {
  echo '<li><img src="' . $afbeeldingen[$i] . '"></li>';
}

PHP:
1
2
3
4
5
$afbeeldingen = array_slice($afbeeldingen, 0, $aantal);

foreach ($afbeeldingen as $afbeelding) {
  echo '<li><img src="' . $afbeelding . '"></li>';
}

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Goede uitgebreide uitleg van Xander d:)b
dfle schreef op dinsdag 24 oktober 2017 @ 10:26:
De opmerking van Kontsnorretje zet mij direct op mijn plaats als maar net startende met PHP. Het zal zeker hout snijden wat hij zegt, maar voor mij is dat op dit moment nog te cryptisch om te begrijpen. Ik kan dus spijtig genoeg niet echt adequaat reageren.
Kontsnorretje wil hier nogmaals benadrukken dat je variabelen die user input bevatten (uit de $_GET- en $_POST-scope) goed moet valideren en filteren.

Anders krijg je dus dit soort lekken:
Afbeeldingslocatie: https://itswadesh.files.wordpress.com/2011/11/sql-injection.jpg

Hoeder van het Noord-Meierijse dialect

Pagina: 1