While loop

  • Hallo allemaal,


    Ik ben op zoek naar een manier om in mijn while loop een string met een nummer te kunnen maken.
    Zodat ik meerdere string items kan maken.
    $string1
    $string2
    ...


    Waarna ik later de data kan toevoegen. Wie kan mij opweg helpen om met een while loop dit te kunnen maken?

  • Dit zou je kunnen doen met een variabele naam met behulp van een dubbele string ($$):


    PHP
    $i = 1;
    while (whatever) {
        $varName = 'string'.$i++; // post increment
        $$varName = 'something'; // let op de dubbele $
    }

    Maar hier kleven wel wat een aantal nadelen aan, zo "vervuil" je de huidige scope met een heleboel (soortgelijke) variabele( name)n. Daarbij programmeer je mogelijk informatie in de naam van de variabele (hard coding). Wat voor betekenis hebben deze 1, 2 et cetera?


    Zou het niet gewoon veel beter zijn om bijvoorbeeld één array te maken? Met dit volgnummer in de index ofzo? Wat voor bestaansrecht hebben al deze losse variabelen?


    Het kan dus wel, alleen zou ik deze aanpak niet aanraden. Je kunt beter investeren in een wat elegantere datastructuur. Hier zijn arrays bij uitstek voor geschikt.

  • Fangorn,


    In heb een post formulier waar de volgende waardes in staan:
    item1 qty1 price1


    Dit kan vermeerderd worden door een javascript. Onbeperkt aantal lijnen.
    Er is een counter bij de javascript die de aantal lijnen telt en via het post form meegaat.


    Zo kan ik via de while loop alles lezen en beveiligen.


    Of is er hiervoor een betere oplossing?

  • Zoals @D.Oomens al min of meer aangeeft: formulierelementen in HTML kennen ook array-structuren. Dit bereik je door een paar rechte haken achter de naam toe te voegen.


    Als elk item een id, hoeveelheid, prijs et cetera kent dan maak je voor elk van deze elementen een apart array:

    HTML
    <input type="text" name="item[]" value="<id hier>">
    <input type="text" name="quantity[]" value="">


    Prijs is afleidbaar, en weet je zelf al, die hoef je dus niet eerst in een formulier te stoppen, en er vervolgens weer uit te halen. Je zou wel een readonly prijs(tekst) op kunnen nemen in het formulier, zodat de invuller kan zien wat alles (totaal) kost.


    Bij de verwerking van het formulier (nadat je deze hebt gevalideerd uiteraard) itereer je over het item (sub)array, en gebruik je hierbij de index om de andere bijbehorende data te verzamelen, bijvoorbeeld zoiets:

    PHP
    // aanname: data is gevalideerd en is niet leeg
    foreach ($_POST['item'] as $index => $id) {
        $quantity = $_POST['quantity'][$index];
        // etc.
    }


    EDIT: je zou zelfs kunnen volstaan met het enkel doorgeven van een quantity, waarbij de key het item id is:

    HTML
    <input type="text" name="quantity[<item id hier>]" value="...">


    En dan wordt de loop:

    PHP
    // aanname: data is gevalideerd en is niet leeg
    foreach ($_POST['quantity'] as $productId => $quantity) {
        // etc.
    }
  • Dit heeft me uitendelijk kunnen helpen!
    Waarvoor dank.


    Mijn oplossing (deel van het script):


    Ik ga dit nu verwerken in mijn formulier & uiteraard de nodige veiligheid bijbouwen.

  • Ugh, arrays lijken mij een betere aanpak :p.


    En prijs is in principe informatie die je hebt, dus die hoef je niet te POSTen.


    Anders zou iemand zichzelf een korting kunnen geven :).


    En als je de prijs dan toch uit de database trekt voor een controle, waarom gebruik je die prijs dan niet direct? :)

  • prijs heb ik niet. Ik heb geen van de gegevens.
    Dit moet allemaal worden opgegeven.

  • Ik zou toch je formulier anders gaan opbouwen en verwerken, dan moet je geen kromme oplossing gebruiken als dat.


    Je form bijvoorbeeld:


    Waarbij 1122 het ID is is dat je uitleest vanuit je database.
    De rows in dat formmulier kan je dynamisch opbouwen met hetgeen je selecteert uit je database.


    Verwerking lees je dan gewoon je $_POST['price'] en je $_POST['quantity'] uit.
    Dit zal een array zijn in deze vorm:


    Code
    [
      1122 => 123,
      2233 => 456,
    ]


    Hierover kan je dan ook itereren:


    PHP
    <?php
    
    
    foreach ($_POST['price'] as $id => $price) {
      // verdere verwerking
    }
  • Zoals @Aaron hierboven aangeeft heeft hij geen enkele informatie, dus ook geen product id's ofzo.


    Neemt niet weg dat e.e.a. eenvoudiger kan. Je kunt alle velden die de productdata samenstellen batchgewijs toevoegen. Hierbij voorzie je alle velden van array-haken zonder een specifieke index. Je hebt dan geen JavaScript-constructies of wat dan ook nodig die tellers mee laten lopen. Je kunt simpelweg itereren over een van de productdata-velden en dat dan als index gebruiken om de andere bijbehorende velden aan te spreken. Dus wat @pottink, @D.Oomens en ik al min of meer voorstelden.


    Om toch ten overvloede maar een voorbeeld te geven:


    Je hebt dus behalve voor het interactief toevoegen van velden verder geen enkele JavaScript nodig.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!