Problemen met Update $_SESSION

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Matthijs PHPHULP

Matthijs PHPHULP

06/12/2010 11:06:57
Quote Anchor link
Ik wil graag dat ik in mijn winkelwagentje het aantal van een bepaald product kan veranderen door middel van een klein formulier. Dit formulier staat op regel 44, en dat formulier zou normaal gesproken het script op regel 21 moeten openen. Maar hij opent ook/ alleen het script op regel 13.

In het script heb ik bij het script ook een korte uitleg gezet. Maar als je er nog meer vragen over hebt moet je het vragen.

Het is dus de bedoeling dat ik met behulp van de submit button uit het formulier het nieuwe aantal, in de session moet zetten.

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
session_start();
session_register("session");

require "header.php";

    if(!$login->get_login_info()) {
        include('loginsysteem/login.inc.php');
        
    }
else {

if( isset( $_POST['ADD'] ) && ereg('^[1-9][0-9]*$', $_POST['aantal'])) {
    $_SESSION['winkelwagen'][$_POST['artikelid']] = $_POST['aantal'];
}


if( isset( $_GET['DEL'] ) ) {
    unset($_SESSION['winkelwagen'][$_GET['DEL']]);
}

\\ Het gaat om dit stukje script, alleen werkt dit niet. Hij opent namelijk ook het script op regel 17
if( isset( $_POST['actie'] ) && ereg('^[1-9][0-9]*$', $_POST['p_aantal'])) {
 if ($_POST['actie'] == 'Bijwerken') {
    $_SESSION['winkelwagen'][$_POST['aantal']] = $_POST['p_aantal'];
}
}

// Laat lijst zien

if( $_SESSION['winkelwagen'] ) {
    $totaal = 0;
    echo "<p>Uw winkelwagen</p><br>";
    echo "<table class=\"winkelwagen\">";
    echo "<tr><td class=\"w_product\"><b>Product</b></td><td class=\"prijs_stuk\"><b>Prijs</b></td><td class=\"aantal\"><b>Aantal</b></td><td class=\"prijs_totaal\"><b>Prijs totaal</b></td></tr>";
    foreach ( $_SESSION['winkelwagen'] as $key=>$val ) {

        $sql = "SELECT * FROM Artikel WHERE ARTIKEL_ID=$key";

        $resultaat = mysql_query($sql);

        while ($rij = mysql_fetch_array($resultaat)) {
            echo "<tr>";
            echo "<td>".$rij["Naam"]." <a href=\"".$_SERVER["PHP_SELF"]."?DEL=$key\"><img src=\"uploadimages/prullenbak.gif\"></a></td>";
            echo "<td>&euro;".number_format($rij["Prijs"], 2, ',', ' ')."</td>";

\\Hier onder roep ik het stukje script waarmee ik de session wil updaten aan...
            echo "<td><form><input type=\"text\" value=\"$val\" name=\"p_aantal\"><input type=\"hidden\" value=\"".$rij["ARTIKEL_ID"]."\" name=\"artikelid\"><input name=\"actie\" type=\"submit\" value=\"Bijwerken\"></form> </td>";
            $product_totaal = $rij["Prijs"] * $val;
            echo "<td>&euro;".number_format($product_totaal, 2, ',', ' ')."</td>";
            echo "</tr>";
            $totaal = $totaal + ($rij["Prijs"] * $val);
            
        }

    }

    echo "<tr></tr>";
    echo "<tr rowspan=\"2\"><td>Totaalbedrag:<td><td></td><td> &euro;".number_format($totaal, 2, ',', ' ')."</td></tr>";
    echo "</table>";
    echo ">> <a href=\"bestelling.php\" onClick=\"return Confirm(0)\">[Bestelling uitvoeren]</a>";
}
else {

    echo "De winkelwagen is momenteel leeg...";

}


if ($_GET["artikelid"]) {

    $sql = "SELECT * FROM Artikel WHERE ARTIKEL_ID=".$_GET["artikelid"];

    $result = mysql_query($sql);
    if (mysql_num_rows($result) > 0) {
        $naam = mysql_result($result, 0, "Naam");
        $prijs = number_format(mysql_result($result, 0, "Prijs"), 2, ',', ' ');
        echo "<p><div class=\"big\">Artikel toevoegen aan winkelwagen</div>";
        echo "<form method=\"post\" action=\"".$_SERVER["PHP_SELF"]."\">";
        echo "<input type=\"hidden\" name=\"artikelid\" value=\"".$_GET["artikelid"]."\">";
        echo "<input type=\"text\" name=\"aantal\" value=\"1\" size=\"2\" maxlength=2>";
        echo " x Artikel: $naam (prijs: $prijs euro)";
        echo "<input type=\"submit\" name=\"ADD\" value=\"Toevoegen\">";
        echo "</form>";
    }

}
}

require "footer.php";
?>


Alvast bedankt,
Matthijs
Gewijzigd op 06/12/2010 11:07:50 door Matthijs PHPHULP
 
PHP hulp

PHP hulp

22/12/2024 18:13:08
 
Kris Peeters

Kris Peeters

06/12/2010 13:22:04
Quote Anchor link
Eerst en vooral, controleer nooit op een waarde van een submit knop. Dat geeft vaak problemen. Soms wordt die waarde (en key) helemaal niet naar de server gestuurd.
Veel interessanter is om een hidden input mee te geven, of een extra GET variabele in de action van je form te zetten.

Verder...
Probeer je locica wat uhhh logischer te maken.

Splits je blokken op in: POST <-> geen POST.
Binnen die eerste block splits je op in "Een nieuw item in je winkelwagen steken" <-> "1 rij aanpassen in het winkelwagentje"
De tweede block bestaat uit: "De volledige tabel laten zien" <-> "Detail van 1 item"

Je zou zo-iets kunnen hebben als geraamte:
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
<?php
session_start();

if ($_SERVER['REQUEST_METHOD']=="POST") {         // Er is een post request
  
  if (!empty($_GET['edit_row'])) {                // 1 rij aanpassen  || Dit wordt bepaald door de action="?action=edit_row"; zie verder in script
    $_POST['aantal'] = (int) $_POST['aantal'];    //
    // ... handel je post request af

  }
  else if (!empty($_GET['new_row'])) {            // nieuw item in winkelwagentje || zie action="?new_row=1" verder in script
    // ...

  }
  
}

else {

  $_GET["artikelid"] = (!empty($_GET["artikelid"]) ? (int) $_GET["artikelid"] : 0);  // Zo moet je je verder niet meer aantrekken van eventuele foute/gevaarlijke gegevens
  if ($_GET["artikelid"] > 0) {                   // Detail item
    // ...

    echo '
    <form method="post" action="?new_row=1">
      <input type="hidden" name="artikelid" ...
    </form>'
;
  }

  else {                                          // volledige tabel
    // ...

    while ($rij = mysql_fetch_array($resultaat)) {
      echo'
      <form method="post" action="?action=edit_row">
        <input type="hidden" name="artikelid" ...
      </form>
      '
;
    }
  }
  
}

?>


Verder nog opmerken: het is gemakkelijker om strings in enkele quotes te steken. Dan moet je niet zoveel dubbele quotes escapen.
echo '<input type="text" value="'. $val .'" name="p_aantal">';
is gemakkelijker dan
echo "<input type=\"text\" value=\"$val\" name=\"p_aantal\">";

Herschrijf zelf eens je code, in zo'n geraamte. Dan zal het veel eenvoudiger zijn voor jezelf om te zien waar precies nog problemen kunnen zitten. Mocht je dan toch nog hulp nodig hebben, zal het ook voor ons duidelijker zijn, zodat we beter/vlugger kunnen helpen.
Gewijzigd op 06/12/2010 13:38:09 door Kris Peeters
 
Matthijs PHPHULP

Matthijs PHPHULP

06/12/2010 13:39:44
Quote Anchor link
Oké bedankt voor de uitgebreide uitleg! Ik zou vanmiddag het is opnieuw gaan bekijken en dan direct de code herschrijven, en natuurlijk kijken of ik dan zelf de fout kan ontdekken. En ik zou hem hier nog even posten om te laten controleren, zodat ik weet of ik het goed doe.

Matthijs
 
- SanThe -

- SanThe -

06/12/2010 13:49:21
Quote Anchor link
eregi

Quote:
Warning

This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.


session_register

Quote:
Warning

This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.
 
Matthijs PHPHULP

Matthijs PHPHULP

06/12/2010 13:59:51
Quote Anchor link
Dus die moet ik er uit halen?
 
Kris Peeters

Kris Peeters

06/12/2010 14:24:52
Quote Anchor link
Ik heb dat nooit gebruikt. Volgens mij doet die functie tegenwoordig niets meer dat al niet gebeurt als je de lijn zou weglaten.
 
- Raoul -

- Raoul -

06/12/2010 16:20:54
Quote Anchor link
Matthijs Thoolen op 06/12/2010 13:59:51:
Dus die moet ik er uit halen?


Kijk eens op PHP.net, daar staan wat functies die je beter gebruikt;)
 
Matthijs PHPHULP

Matthijs PHPHULP

06/12/2010 22:00:46
Quote Anchor link
Ik heb het een beetje aangepast, is dit een beetje wat je bedoelde?

Maar het werkt nog steeds niet om het aantal te veranderen, wat moet ik daar nog aan veranderen?

Quote:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
session_start();

require "header.php";

    if(!$login->get_login_info()) {
        include('loginsysteem/login.inc.php');
        
    }
else {

if ($_SERVER['REQUEST_METHOD']=="POST") {     
    if (!empty($_GET['edit_aantal'])) {
        $_POST['actie'] = (int) $_POST['aantal_product'];
        $_SESSION['winkelwagen'][$_POST['artikelid2']] = $_POST['aantal_product'];
    }
}

    
if( isset( $_POST['ADD'] ) && ereg('^[1-9][0-9]*$', $_POST['aantal'])) {
    $_SESSION['winkelwagen'][$_POST['artikelid']] = $_POST['aantal'];
}


if( $_SESSION['winkelwagen'] ) {
    $totaal = 0;
    echo '    <p>Uw winkelwagen</p><br>
            <table class="winkelwagen">
            <tr><td class="w_product"><b>Product</b></td><td class="prijs_stuk"><b>Prijs</b></td><td class="aantal"><b>Aantal</b></td><td class="prijs_totaal"><b>Prijs totaal</b></td></tr>'
;
    foreach ( $_SESSION['winkelwagen'] as $key=>$val ) {

        $sql = "SELECT * FROM Artikel WHERE ARTIKEL_ID=$key";

        $resultaat = mysql_query($sql);

        while ($rij = mysql_fetch_array($resultaat)) {
            echo '    <tr>
                    <td>'
.$rij["Naam"].' <a href=\''.$_SERVER["PHP_SELF"].'?DEL=$key\'><img src="uploadimages/prullenbak.gif"></a></td>
                    <td>&euro;'
.number_format($rij["Prijs"], 2, ',', ' ').'</td>
                    <td><form method="post" action="?action=edit_aantal&artikelid2='
.$rij["ARTIKEL_ID"].'&aantal_product='.$val.'">
                    <input type="hidden" value=\''
.$rij["ARTIKEL_ID"].'\' name="artikelid">
                    <input type="text" name="aantal_product" value="'
.$val.'">
                    <input type="hidden" name="product_aantal">
                    <input name="actie" type="submit" value="Bijwerken"></form> </td>'
;
            $product_totaal = $rij["Prijs"] * $val;
            echo '    <td>&euro;'.number_format($rij["Prijs"], 2, ',', ' ').'</td>
                    </tr>'
;
            $totaal = $totaal + ($rij["Prijs"] * $val);
            
        }

    }
                                    
    echo '    <tr></tr>
            <tr rowspan="2"><td>Totaalbedrag:<td><td></td><td> &euro;'
.number_format($totaal, 2, ',', ' ').'</td></tr>
            </table>
            >> <a href="bestelling.php" onClick="return Confirm(0)">[Bestelling uitvoeren]</a>'
;
}
else {

    echo "De winkelwagen is momenteel leeg...";

}


if( isset( $_GET['DEL'] ) ) {
    unset($_SESSION['winkelwagen'][$_GET['DEL']]);
}


if ($_GET["artikelid"]) {

    $sql = "SELECT * FROM Artikel WHERE ARTIKEL_ID=".$_GET["artikelid"];

    $result = mysql_query($sql);
    if (mysql_num_rows($result) > 0) {
        $naam = mysql_result($result, 0, "Naam");
        $prijs = number_format(mysql_result($result, 0, "Prijs"), 2, ',', ' ');
        echo '    <p>Artikel toevoegen aan winkelwagen
                <form method="post" action=\''
.$_SERVER["PHP_SELF"].'\'>
                <input type="hidden" name="artikelid" value=\''
.$_GET["artikelid"].'\'>
                <input type="text" name="aantal" value="1" size="2" maxlength=2>
                x Artikel: '
.$naam.' (prijs: '.$prijs.' euro)
                <input type="submit" name="ADD" value="Toevoegen">
                </form>'
;
    }

}
}

require "footer.php";
?>
 



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.