Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

PHP eenvoudig winkelmandje

Pagina: 1
Acties:

  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Ha tweakers,

Sinds kort PHP weer opgepakt en ik loop tegen iets aan waar jullie misschien mee kunnen helpen. Vanuit een mysql dbase wordt een product getoond met een daarbij behorende prijs. Via een POST worden aantallen gesubmit. Prijs moet worden mee ge-submit, maar alleen de prijs van de laatste row wordt gesubmit.

Ik denk vast te moeilijk. Wie kan mij helpen. Schieten op alle code mag trouwens ook, alleen maar leerzaam. Hieronder de stuk code wat waarschijnlijk de problemen geeft:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $sql = "SELECT * FROM products";
        $result = mysqli_query($conn, $sql);

        if (mysqli_num_rows($result) > 0) {

            echo "<form action='add.php' method='post'>";
            echo "<table>";
            echo "<p><a href='cart.php'>Go to my cart</a></p>";

            while ($row = mysqli_fetch_assoc($result)) {
                echo    "<tr>";
                echo    "<td>" . "<a href='large_photos/" . $row["filename"] . ".jpg'>" . 
                        "<img class='kolomfotos' src='photos/" . $row["filename"] . ".jpg'</a></td>";
                echo    "<td class=kolomtext>" . $row["description"] . "</td>";
                echo    "<td class=kolomtext><input type='text' name='price' size='3' value='" . $row["price"] . "'  />" . $row["price"] . "</td>";
                echo    "<td><p>How many?</p></td><td><input type='text' name='test' size='5' value='0' /></td>";
                echo    "<td><p><input type='submit' value='Add to Cart' /></p>";
            }

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Als je inputs hebben dezelfde naam. Wat verwachtte je precies dat er dan zou gebeuren? [google=php how to post array of values].

Verder: waarom zou je de prijs überhaupt willen posten? Wat nu als ik, flauw als ik ben, mijn DOM-inspector open en overal een prijs van 0 invul, krijg ik dan op de postback mijn producten voor niks?

Je moet gewoon aantallen en productnummers doorgeven en de prijs na de postback opnieuw zélf berekenen. Regel één van beveiliging: never trust user input.

Verder: Hoe post je code? / Hoe gebruik je de code tag?

[ Voor 7% gewijzigd door NMe op 18-12-2014 18:41 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Ach, natuurlijk nu wordt elke keer de naam voor de input overschreven door de volgende row. Ik moet dus voor elke row een unieke input name hebben?

Ik moet de prijs toch posten om zo de prijs in het wagentje te bepalen? De prijs staat immers alleen in de mysql dbase. Welk alternatief denk jij aan?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

maaaaan schreef op donderdag 18 december 2014 @ 18:56:
Ach, natuurlijk nu wordt elke keer de naam voor de input overschreven door de volgende row. Ik moet dus voor elke row een unieke input name hebben?
Klik die link van me even aan voor je verdervraagt. ;)
Ik moet de prijs toch posten om zo de prijs in het wagentje te bepalen? De prijs staat immers alleen in de mysql dbase. Welk alternatief denk jij aan?
Als je het productnummer doorgeeft en hoeveel van dat product je wil, dan heb je toch genoeg om opnieuw uit de database te trekken wat dat moet kosten?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Ik zie nu inderdaad dat je met input een array kan gaan vullen, thanks.

Dus ik vul de array met de waarden aantal en productnummer geef dat alles door aan de volgende file, die file legt contact met de dbase, haalt de prijs op aan de hand van productnummer en berekent de totale prijs.

Klopt dit?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Ik zou de naamgeving in je formulier gebruik laten maken van het productnummer als key. Als je 20 keer product 684 wil bestellen post je dus een input product\[684] met als waarde 20. In je code aan de achterkant hoef je dan maar een simpel loopje te doen à la foreach ($_POST['product'] as $id => $amount) en dan hoef je alleen nog maar met het ID te kijken wat de juiste prijs is en die te vermenigvuldigen met de amount. En ineens ben je niet meer kwetsbaar voor dit specifieke gevalletje van HTML-injectie.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Thanks :) Het vullen van de array en die doorgeven aan de volgende file lukt met;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
       if (mysqli_num_rows($result) > 0) {

            echo "<form action='add.php' method='post'>";
            echo "<table>";
            echo "<p><a href='cart.php'><img src=images/cart.png width='30' /></a></p>";

            while ($row = mysqli_fetch_assoc($result)) {
                echo    "<tr>";
                echo    "<td>" . "<a href='large_photos/" . $row["filename"] . ".jpg'>" . 
                        "<img class='kolomfotos' src='photos/" . $row["filename"] . ".jpg'</a></td>";
                echo    "<td><p name='id'>Productnr:" . $row["id"];
                echo    "<td class=kolomtext>" . $row["description"] . "</td>";
                echo    "<td class=kolomtext><p>E" . $row["price"] . ",-</td>";
                echo    "<td><p><input type='hidden' name='id[]' value='" . $row["id"] . "'></p></td>";
                echo    "<td><p>How many?</p></td><td><input type='text' name='quantity[]' size='5' value='0' /></td>";
                echo    "<td><p><input type='submit' value='Add to Cart' /></p></td>";
            }
        } else {
            echo "0 results";
        }


Dit komt aan op:

code:
1
2
3
4
5
6
7
8
$quantity  = $_POST['quantity'];
$price = $_POST['price'];
$id=$_POST['id'];

echo "<h1>Winkelwagentje</h1>";
echo "<p>Hoeveelheid: " . $quantity[] . "</p><br>";
echo "<p>Productcode: " . $id[] . "</p><br>";
}


Maar nog niet op de specifieke geselecteerde items. Alleen wanneer ik de index van de array handmatig invul. Ik vermoed dat ik dit moet doen met een "foreach wanneer die gevuld is..." alleen ik kom niet uit de syntax.

Daarna moet ik de productcode nog koppelen aan de prijs in de database.

Heb je nog een tip/link ;) voor me? Zou top zijn.

Verwijderd

waarom niet per record/product een form?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 18 december 2014 @ 22:57:
waarom niet per record/product een form?
Waarom in hemelsnaam wél? :X
Wat begrijp je niet aan http://php.net/manual/en/control-structures.foreach.php ?

[ Voor 39% gewijzigd door RobIII op 18-12-2014 23:15 ]

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


  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Ik begrijp dat de behulpzaamheid nu ten einde is. Tot zover toch bedankt.

  • Damic
  • Registratie: September 2003
  • Laatst online: 21:39

Damic

Tijd voor Jasmijn thee

Trouwens gebruik je ' en " eens deftig.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
       if (mysqli_num_rows($result) > 0) {

            echo '<form action="add.php" method="post">
          <p><a href="cart.php"><img src="images/cart.png" width="30" /></a></p>
            <table>';
            while ($row = mysqli_fetch_assoc($result))
 {
                echo    '<tr><td><a href="large_photos/' . $row["filename"] . '.jpg"><img class="kolomfotos" src="photos/' . $row['filename'] . '.jpg"</a></td>
<td><p name="id">Productnr:' . $row['id'] .'</td>
<td class="kolomtext">' . $row['description'] . '</td>
<td class="kolomtext"><p>&euro;'. $row['price'] . ',-</td>
<td><p>How many?</p></td><td><input type="text" name="quantity['.$row['id'].']" size="5" value="0" /></td>
<td><p><input type="submit" value="Add to Cart" /></p></td></tr>';
            }
echo '</table></form>';
        } else {
            echo '0 results';
        }


En dan is het een kwestie van arrays te gebruiken ;)

[ Voor 11% gewijzigd door Damic op 19-12-2014 10:31 ]

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


  • HuHu
  • Registratie: Maart 2005
  • Niet online
Het zou ook al zo veel schelen als je je code fatsoenlijk opmaakt.

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
<?php if (mysqli_num_rows($result) > 0) : ?>

<form action="add.php" method="post">
  <p><a href="cart.php"><img src="images/cart.png" width="30" /></a></p>
  
  <table>
  <?php while ($row = mysqli_fetch_assoc($result)) : ?>
    <tr>
      <td>
        <a href="large_photos/<?php echo $row["filename"]; ?>.jpg">
        <img class="kolomfotos" src="photos/<?php echo $row['filename']; ?>.jpg" /></a>
      </td>
      <td>
        <p name="id">Productnr:<?php echo $row['id'] ?></p>
      </td>
      <td class="kolomtext">
        <?php echo $row['description']; ?>
      </td>
      <td class="kolomtext">
        <p>&euro;<?php echo $row['price']; ?>,-</p>
      </td>
      <td>
        <p>How many?</p>
      </td>
      <td>
        <input type="text" name="quantity[<?php echo $row['id']; ?>]" size="5" value="0" />
      </td>
      <td>
        <p>
          <input type="submit" value="Add to Cart" />
        </p>
      </td>
    </tr>
  <?php endwhile; ?>
  </table>
</form>

<?php else : ?>

0 results

<?php endif; ?>


Dan had je bijvoorbeeld ook al de talloze HTML-fouten kunnen zien (img wordt niet gesloten, missende sluittags voor de <p>).

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

maaaaan schreef op vrijdag 19 december 2014 @ 06:42:
Ik begrijp dat de behulpzaamheid nu ten einde is. Tot zover toch bedankt.
De behulpzaamheid is niet ten einde, maar ik heb je de syntax letterlijk gegeven in mijn vorige post. Als je die syntax niet begrijpt dan is de documentatie waar RobIII naar verwijst de volgende stap, en als je het daarmee nog steeds niet snapt (kan gebeuren, soms moet het even klikken) dan moet je gerichtere vragen kunnen stellen dan "ik snap de syntax niet." Vandaar Rob's vraag: wat snap je niet aan die documentatie?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21:08
Ik zou niet de prijs sturen via een POST en vanaf daar daar op vertrouwen want dat is clientside makkelijk aan te passen en dan kunnen ze straks makkelijk goedkoper bestellen dan de bedoeling was.

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Anders lees je het topic even voordat je post. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Konha
  • Registratie: Januari 2012
  • Laatst online: 14-09 14:49
Gok dat ik het zelfde doe als iedereen hierboven maar misschien heb je er wat aan.

Simpel voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
$sql =$this->mysqli->query("SELECT `id`, `description`, `price`, `filename` FROM `products`");
echo '<table>';
while($result = $sql->fetch_assoc()){
     echo '<tr>';
     echo '<td><a href="large_photos/'.$record["filename"].'.jpg"><img class="kolomfotos" src="photos/'.$record["filename"].'.jpg"</a></td>';
     echo '<td>'.$record["description"].'</td>';
     echo '<td>Prijs per stuk: &euro;'.$record["price"].'</td>';
     echo '<td><input type="text" name="amount['.$record["id"].']" value="0"></td>';
     echo '</tr>';
}
echo '<tr><td><button type="submit">Add to cart</button></td></tr>';
echo '</table>';


Als je nu de "form" submit dan krijg je een $_POST waarde terug die er ongeveer uit zal zien zoals dit:
code:
1
Array ( [0] => 22 [1] => 22  )

Als je de waardes dan wil uitlezen is de key van de array het id (van het product), en de value is de het aantal keer dat ze hem willen.

In dit voorbeeld hebben we dus 2 producten uit de database ingeladen met de id's 0 en 1. Beide moeten ze 22 keer in de winkelmand.

Hopelijk heb je er iets aan en anders mag je het negeren ;)

Groetjes!!!!

[ Voor 8% gewijzigd door Konha op 19-12-2014 14:28 ]


  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 20-11 20:04
Konha1989 schreef op vrijdag 19 december 2014 @ 14:24:
Gok dat ik het zelfde doe als iedereen hierboven maar misschien heb je er wat aan.

Simpel voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
$sql =$this->mysqli->query("SELECT `id`, `description`, `price`, `filename` FROM `products`");
echo '<table>';
while($result = $sql->fetch_assoc()){
     echo '<tr>';
     echo '<td><a href="large_photos/'.$record["filename"].'.jpg"><img class="kolomfotos" src="photos/'.$record["filename"].'.jpg"</a></td>';
     echo '<td>'.$record["description"].'</td>';
     echo '<td><input type="text" name="price['.$record["id"].']" value="'.$record["price"].'"></td>';
     echo '</tr>';
}
echo '<tr><td><button type="submit">Add to cart</button></td></tr>';
echo '</table>';


Als je nu de "form" submit dan krijg je een $_POST waarde terug die eruit zal zien zoals dit:
code:
1
Array ( [0] => 22 [1] => 22  )

Als je de waardes dan wil uitlezen is de key van de array het id, en de value is de price waarde.

In dit voorbeeld hebben we dus 2 producten uit de database ingeladen met de id's 0 en 1. Beide hebben deze een waarde van 22eutjes..

Hopelijk heb je er iets aan en anders mag je het negeren ;)

Groetjes!!!!
Zoals al meerdere malen aangehaald. In heel deze form mag je geen prijs kunnen aanpassen! Deze prijs haal je op uit je database van zodra er prijzen berekend moeten worden.

dus:
code:
1
<input type="text" name="price['.$record["id"].']" value="'.$record["quantity"].'">

RTFM!


  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Fijn dat het toch nog even op gang komt. Plat documentatie lezen helpt je ook maar tot zover. De reden dat ik een forum opzoek is dat er behoefte is aan interactiviteit. En van het ene komt dan ook vaak het andere zoals dit topic maar weer bewijst.

Het punt in mijn code was dat ik geen koppeling in de array kan leggen tussen quantity en productid. Ik krijg namelijk alleen een quantity terug.

Maar door nu de code van Kohna en de aanpassing daarop van _Moe_ ga ik dit nuproberen op te lossen. De de syntax van het vullen van de array moet complexer kennelijk.

Ook duidelijk dat price pas in de laatste file opgehaald moet worden. Thanks hiervoor heren :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Complexer? Dan wat? Ik zei in NMe in "PHP eenvoudig winkelmandje" toch al exact wat je nodig had?
Als je 20 keer product 684 wil bestellen post je dus een input product[684] met als waarde 20.
Kreeg je dat zelf niet in je hoofd vertaald naar <input type="text" name="product[684]" /> waarin een gebruiker zelf die 20 kan invullen?

Je zegt dat er "behoefte is aan interactiviteit." Dat dat voor jou makkelijker is begrijp ik maar zo werkt het natuurlijk niet. We zitten hier niet om je actief aan het handje te houden. Als we een linkje plaatsen om je op weg te helpen dan verwachten we op zijn minst dat je die even aanklinkt voor je verdergaat met vragen stellen en als we zeggen dat je een bepaalde constructie moet gebruiken verwachten we op zijn minst dat je de documentatie leest of zegt wat je dan precies niet begrijpt. De manier waarop je tot nu toe in dit topic staat komt redelijk lui over en dat is vervelend voor ons en bovendien ook voor jou omdat je er zo niks van leert.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
NME, jammer dat je dat zo ziet. Ik denk dat het goed is -zeker voor een forum admin- je te realiseren dat voorbeelden ontzettend belangrijk in het leerproces zijn. En neem van mij maar aan dat ik veel tijd hierin heb gestoken aangezien ik van nul kom.

Je komt over als iemand met veel kennis over dit onderwerp en je zou juist zo goed kunnen helpen. Maar zoals ik in het begin van dit topic zei, ik ben startend. En als vragen om voorbeelden jou lui overkomt, reageer -hoewel dat gezien jouw kennis dan erg jammer is- dan maar gewoon even niet en richt je aandacht op een voor jou uitdagender topic.

  • Konha
  • Registratie: Januari 2012
  • Laatst online: 14-09 14:49
Bekvechten hebben we vast een ander forum voor ;)

Maar zolang je bij de oplossing komt, is het doel behaald toch. En iedereen moet een keer beginnen.

Ik hoop dat je tot de oplossing kan komen, en anders moet je je code maar een keer dm'en dan zou ik er naar kunnen kijken eventueel een fix voor je kunnen maken.

Mijn beroep: programmeur, en dit soort dingen bouw ik dagelijks hahah ;)

Groetjes en fijne kerstdagen!!

  • Konha
  • Registratie: Januari 2012
  • Laatst online: 14-09 14:49
_Moe_ schreef op vrijdag 19 december 2014 @ 14:30:
[...]


Zoals al meerdere malen aangehaald. In heel deze form mag je geen prijs kunnen aanpassen! Deze prijs haal je op uit je database van zodra er prijzen berekend moeten worden.

dus:
code:
1
<input type="text" name="price['.$record["id"].']" value="'.$record["quantity"].'">
Je reageerde ook direct zoals je kan zien had ik paar sec later een me post aangepast .. ;)

Maar toch goed dat er alertheid is :)

  • maaaaan
  • Registratie: November 2002
  • Laatst online: 26-05-2023
Kohna, dank je. Misschien maak ik later gebruik van je aanbieding! Ik ga eerst even zelf prutsen met de info die ik nu heb (iets met leerzamer :P ). En jullie allemaal ook fijne feestdagen!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22:20

Rannasha

Does not compute.

maaaaan schreef op vrijdag 19 december 2014 @ 15:26:
Je komt over als iemand met veel kennis over dit onderwerp en je zou juist zo goed kunnen helpen. Maar zoals ik in het begin van dit topic zei, ik ben startend. En als vragen om voorbeelden jou lui overkomt, reageer -hoewel dat gezien jouw kennis dan erg jammer is- dan maar gewoon even niet en richt je aandacht op een voor jou uitdagender topic.
Huh? RobIII plaatst een link naar de documentatie-pagina van 'foreach', waar niet alleen de omschrijving van het commando staat, maar ook tal van voorbeelden, zowel van de auteurs van de PHP manual als van gebruikers in comments.

Het standaard leerproces lijkt mij dat je deze documentatie even doorneemt en als je iets niet snapt, dat specifiek vraagt. Want zodra er een specifieke vraag ligt, dan zullen er genoeg mensen zijn om deze te beantwoorden, zelfs als het gaat om beginnersvragen (misschien vooral als het gaat om beginnersvragen, want dan zijn er meer mensen die het antwoord weten).

|| Vierkant voor Wiskunde ||

Pagina: 1