Invalid argument supplied for foreach()

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Delano Velthuis

Delano Velthuis

21/06/2020 16:42:30
Quote Anchor link
Ik ben momenteel met school bezig en loop tegen het probleem
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\Eindopdracht 1.6\bestel.php on line 49
Ik heb dit online bekeken en vond een oplossing om te bekijken of het wel een array of object is, dit was het helaas niet.

Code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php  if ($conn->query( $sql ) ) {
                  $bestelnummer = $conn->insert_id;
                    $producten = $_POST['aantal'];

                      foreach ($producten as $productnummer => $aantal) {
                        if ($aantal > 0) {
                          $sql = "INSERT INTO 'bestelregel' ('bestelnummer', 'productnummer', 'aantal')
                          VALUES ('"
. $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')";

                          $conn->query($sql);
                          echo "Bestelling is succesvol geplaatst met bestelnummer: " . $bestelnummer;

                        }
                    }
                      }


?>

En
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
        $sql
= 'SELECT * FROM producten WHERE categorie = "wijnen"';
        $result = $conn->query($sql);
        $categorie = ("Wijnen");

        if ($result->num_rows > 0) {
        echo '
        <div class="form-group col-md-6">
        <table class="table">
        <thead>
          <h2 class="ml-1">'
. $categorie . '</h2>
          <tr>
            <th class="col-md-1">Product</th>
            <th>Prijs</th>
            <th>Aantal</th>
          </tr>
        </thead>
        <tbody>
        '
;

          while($row = $result->fetch_assoc()) {
            echo '
            <tr>
              <td>'
. $row['naam'] . '</td>
              <td>'
. $row['prijs'] . '</td>
              <td>   <input type="text" class="form-control" class="w-100" name="aantal"> </input></td>
            </tr>
            '
; }
          echo '</tbody>
          </table>
          </div>'
;
        }
else {
          echo '0 results';
        }

?>

Horen hierbij, ik hoop dat iemand mij hier mee kan helpen.
Gewijzigd op 21/06/2020 17:21:16 door Delano Velthuis
 
PHP hulp

PHP hulp

26/10/2020 19:23:08
 
Thomas van den Heuvel

Thomas van den Heuvel

21/06/2020 17:01:10
Quote Anchor link
Verander name="aantal" in name="aantal[<productnummer>]" waarbij <productnummer> het productnummer uit je queryresultaten is.

aantal[] zorgt ervoor dat $_POST['aantal'] een array is, en <productnummer> heb je nodig omdat dit overeenstemt met $productnummer in je foreach: foreach ($producten as $productnummer => $aantal).
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 17:08:49
Quote Anchor link
Kan je het script tussen code-tags zetten?
 
Delano Velthuis

Delano Velthuis

21/06/2020 17:14:38
Quote Anchor link
Thomas van den Heuvel op 21/06/2020 17:01:10:
Verander name="aantal" in name="aantal[<productnummer>]" waarbij <productnummer> het productnummer uit je queryresultaten is.

aantal[] zorgt ervoor dat $_POST['aantal'] een array is, en <productnummer> heb je nodig omdat dit overeenstemt met $productnummer in je foreach: foreach ($producten as $productnummer => $aantal).


Dit heeft geholpen, hartelijk dank!

Enige probleem waar ik nu mee zit is dat hij hem niet in phpmyadmin plaatst, wat ondanks de code na checken helemaal goed lijkt.

Ik heb doormiddel van de echo alles uitgeprint,

Hier kwam uit dat hij de productcode niet kan vinden.
Alleen ik zie niet waarom niet..
Gewijzigd op 21/06/2020 17:18:23 door Delano Velthuis
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 17:20:34
Quote Anchor link
Je bedoelt je database. PhpMyAdmin is niets meer dan een in PHP gebouwd script om de database mee uit te lezen en te beheren.
Gewijzigd op 21/06/2020 17:22:24 door - Ariën -
 
Delano Velthuis

Delano Velthuis

21/06/2020 17:23:39
Quote Anchor link
- Ariën - op 21/06/2020 17:20:34:
Je bedoelt je database. PhpMyAdmin is niets meer dan een in PHP gebouwd script om de database mee uit te lezen en te beheren.


Oh, ik wist dit niet.
Hartelijk bedankt voor het informeren.

Ik heb de code ook net aangepast met codetag voor u.
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 17:25:17
Quote Anchor link
Echo op lijn 9 eens $sql.
 
Delano Velthuis

Delano Velthuis

21/06/2020 17:58:33
Quote Anchor link
- Ariën - op 21/06/2020 17:25:17:
Echo op lijn 9 eens $sql.


Dan krijg ik dit:
INSERT INTO 'bestelregel' ('bestelnummer', 'productnummer', 'aantal') VALUES ('55', '', '22')
Gewijzigd op 21/06/2020 18:00:46 door Delano Velthuis
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 18:07:30
Quote Anchor link
Haal de quotes eens weg om je tabelnaam.
 
Delano Velthuis

Delano Velthuis

21/06/2020 18:08:50
Quote Anchor link
- Ariën - op 21/06/2020 18:07:30:
Haal de quotes eens weg om je tabelnaam.


Krijg ik hetzelfde resultaat:
INSERT INTO bestelregel ('bestelnummer', 'productnummer', 'aantal') VALUES ('57', '', '22')
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 18:15:53
Quote Anchor link
Met verschil in quotes. De veldnamen horen ook zonder quotes.

Maar probeer dit dan eens uit te voeren in phpMyAdmin.
 
Delano Velthuis

Delano Velthuis

21/06/2020 18:20:55
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php  $sql = "INSERT INTO bestelregel (bestelnummer, productnummer, aantal)
                          VALUES ('"
. $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')"; ?>

zo?

Als ik dit invul krijg ik:
Warning: #1366 Incorrect integer value: '" . $bestelnummer . "' for column `sligro`.`bestelregel`.`bestelnummer` at row 1

voor bestelnummer, productnummer en aantal
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 18:22:23
Quote Anchor link
De uitvoer moet je invoeren, niet het script.
 
Delano Velthuis

Delano Velthuis

21/06/2020 18:26:17
Quote Anchor link
- Ariën - op 21/06/2020 18:22:23:
De uitvoer moet je invoeren, niet het script.


INSERT INTO bestelregel (bestelnummer, productnummer, aantal) VALUES ('58', '', '22')
Dit? excusses ben hier nieuw in
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 18:27:08
Quote Anchor link
Jep.
 
Delano Velthuis

Delano Velthuis

21/06/2020 18:33:40
Quote Anchor link
- Ariën - op 21/06/2020 18:27:08:
Jep.


#1062 - Dubbele ingang '58' voor zoeksleutel 'PRIMARY'

Nu doe ik 59 i.p.v.
die werkte wel.

Nu vul in zelf een waarde in voor productcode zoals 3 wat een id is van een product van mij
deze werkt ook.

Mijn code zelf kan dus niet de productcode ophalen maar wel het aantal
 
Thomas van den Heuvel

Thomas van den Heuvel

21/06/2020 19:28:09
Quote Anchor link
Indien $bestelnummer geen nummer is (dump deze eens naar het scherm met var_dump($bestelnummer)?) dan moet je misschien even controleren of de query van de bestelling zelf wel goed ging.

Hoe luidt $sql van de eerste regel van het eerste codefragment uit jouw eerste bericht? Staan daar toevallig ook quotes om de tabel- of kolomnamen?
 
Delano Velthuis

Delano Velthuis

21/06/2020 21:44:07
Quote Anchor link
Thomas van den Heuvel op 21/06/2020 19:28:09:
Indien $bestelnummer geen nummer is (dump deze eens naar het scherm met var_dump($bestelnummer)?) dan moet je misschien even controleren of de query van de bestelling zelf wel goed ging.

Hoe luidt $sql van de eerste regel van het eerste codefragment uit jouw eerste bericht? Staan daar toevallig ook quotes om de tabel- of kolomnamen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php

  include'includes/header.php';


$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'sligro';

$conn = new mysqli($hostname, $username, $password, $database);

if ($conn->connect_error) {
  echo "Verbinding mislukt";
  exit();
  }


$voornaam = $_POST['voornaam'];
$achternaam = $_POST['achternaam'];
$adress = $_POST['adress'];
$postcode = $_POST['postcode'];
$woonplaats = $_POST['woonplaats'];
$email = $_POST['email'];
$telefoon = $_POST['telefoon'];
$verzendwijze = $_POST['verzendwijze'];
$wachtwoord = $_POST['wachtwoord'];
$wachtwoord_bevestigen = $_POST['wachtwoord_bevestigen'];

    if($wachtwoord != $wachtwoord_bevestigen) {
        echo "Uw wachtwoord komt niet overeen";
        exit();
    }


    $wachtwoord = password_hash($password, PASSWORD_DEFAULT);

    $sql = "INSERT INTO `klant` (`voornaam`, `achternaam`, `adress`, `postcode`, `woonplaats`, `email`, `telefoon`, `wachtwoord`)
        VALUES ('"
. $voornaam . "', '" . $achternaam . "', '" . $adress . "', '" . $postcode . "', '" . $woonplaats . "', '" . $email . "', '" . $telefoon . "', '" . $wachtwoord . "')";

        if ($conn->query( $sql ) ) {
            $klantnummer = $conn->insert_id;

            $sql = "INSERT INTO `bestelling` (`klant_klantnummer`, `verzendwijze`)
            VALUES ('"
. $klantnummer . "', '" . $verzendwijze . "')";

                if ($conn->query( $sql ) ) {
                  $bestelnummer = $conn->insert_id;
                    $producten = $_POST['aantal'];

                      foreach($producten as $productnummer => $aantal) {
                        if ($aantal > 0) {
                          $sql = "INSERT INTO bestelregel (bestelnummer, productnummer, aantal)
                          VALUES ('"
. $bestelnummer . "', '" . $productnummer . "', '" . $aantal . "')";
                            echo $sql;
                          $conn->query($sql);
                        //  echo "Bestelling is succesvol geplaatst met bestelnummer: " . $bestelnummer;
                          //echo "Bestelling is succesvol geplaatst met bestelnummer: " . $productnummer;
                          //echo "Bestelling is succesvol geplaatst met bestelnummer: " . $aantal;

                           var_dump($productnummer);

                        }
                    }
                      }
                    }



  include'includes/footer.php';

?>


Dit is de code momenteel, uitkomst vardump productnummer (wat het niet deed) is string(15) ""
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 21:48:04
Quote Anchor link
Een paar opmerkingen:

- Zorg dat elke invoer geëscaped wordt tegen kwaadardige manipulatie via SQL-injection. Dus zorg in dit geval dat je $_POST-veriabelen beveiliogd worden met $conn->real_escape_string()

- Waarom moet je script stoppen als je password niet goed is? Laat het netjes afsluiten met if-else statements.

- Vaste getallen in querys hoeven niet tussen single query-quotes.
Gewijzigd op 21/06/2020 22:18:49 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

21/06/2020 21:55:28
Quote Anchor link
- Ariën - op 21/06/2020 21:48:04:
- Zorg dat elke invoer geëscaped wordt tegen kwaadardige manipulatie via SQL-injection. Dus zorg in dit geval dat je $_POST-veriabelen beveiliogd worden met $conn->real_escape_string()

- Nummers in querys hoeven niet tussen single query-quotes.


Maar het een is niet veilig zonder het ander. Dus kun je dit beter wel doen. Het is ook consistenter als je overal quotes + escaping gebruikt. Zodat je ook niet overal hoeft na te denken of het per ongeluk is vergeten of het expres achterwege is gelaten.
 
- Ariën -
Beheerder

- Ariën -

21/06/2020 22:23:51
Quote Anchor link
Ik zie geen SQL-injection in een vaste waarde hoor. Ik heb mijn bericht daarom even geëdit voor de duidelijkheid. Verder zijn single-quotes voor je SQL bij invoer dus altijd verplicht, evenals de double-quotes om je variabelen geëscaped uit te voeren.

Of je single-quotes gebruikt bij getallen of niet, tja... dat blijft een eigen keuze.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.