PFZ.nl - PHP Community: Meerdere velden in array controleren met huidige data - PHP - Forum - PFZ.nl - PHP Community

Je kunt niet antwoorden op dit topic
#1 02-09-2012 21:44
  • Dragon Lau
  • Groep: Forumleden
  • Posts: 64
  • Actief sinds: 09-08-2005
Ik beschik over een database met tientallen producten met bijbehorende productprijs en verzendkosten.
Op een bewerkpagina waarin alle producten onder elkaar staan, kan ik in 1x alle productprijzen en bijbehorende verzendkosten aanpassen.
Voor zowel productprijs als verzendkosten heb ik de prijs gesplitst in een euro- en cent-veld zodat het duidelijk is wat euro en centen zijn. Dus 4 velden in totaal, prijseuro/prijscent en verzendeuro/verzendcent.

Ik heb nu alles mooi in een rijtje gezet met 4 velden naast elkaar met de euro's en centen uit de database.
Ik wil nu dat zodra ik op 'opslaan' druk, de site eerst alle nieuwe prijzen (zowel product als verzendkosten) ophaalt van het formulier en deze vervolgens gaat vergelijken met de bestaande prijzen in de database.

Maar ik loop nu vast op de manier hoe ik de prijzen uit mijn formulier haal, want via het onderstaande kan het systeem niet zien bij welke product de productprijs en verzendkosten hoort.
1
2
echo '<input name="prijseuro[]" type="text" size="5" value="'.$iPrijsEuro.'" />.<input name="prijscent[]" maxlength="2" type="text" size="5" value="'.$iPrijsCent.'" />';
echo '<input name="verzendeuro[]" type="text" size="5" value="'.$iVerzendEuro.'" />.<input name="verzendcent[]" maxlength="2" type="text" size="5" value="'.$iVerzendCent.'" />';

Bovendien krijg ik er niet voor elkaar om de prijseuro[] en prijscent[] in een gezamelijke $prijs te krijgen, zodat het vergelijken met de huidige prijzen makkelijker is.

Met onderstaande haal ik de prijzen op, maar dit werkt niet.
1
2
3
4
$aNieuwPrijs = array();
for ($i = 0; $i < count($_POST['prijseuro']); $i++) {
    $aNieuwPrijs[] = $_POST['prijseuro'][$i].'.'.$_POST['prijscent'][$i];
}

Ik krijg foutmelding als Notice: Undefined offset

#2 03-09-2012 09:14
Is het dus toch niet makkelijker om de prijzen NIET op te splitsen en daar gewoon 1 databaseveld voor te gebruiken? Dan is je tweede probleem al opgelost.

Voor je eerste probleem zou je bijvoorbeeld het productID dat je uit de database haalt als index voor de POST-array kunnen gebruiken:

1
2
echo '<input name="prijseuro['.$id_product.']" type="text" size="5" value="'.$iPrijsEuro.'" />.<input name="prijscent['.$id_product.']" maxlength="2" type="text" size="5" value="'.$iPrijsCent.'" />';
echo '<input name="verzendeuro['.$id_product.']" type="text" size="5" value="'.$iVerzendEuro.'" />.<input name="verzendcent['.$id_product.']" maxlength="2" type="text" size="5" value="'.$iVerzendCent.'" />';

#3 03-09-2012 19:11
  • Dragon Lau
  • Groep: Forumleden
  • Posts: 64
  • Actief sinds: 09-08-2005
Ik doe expres alle prijzen splitsen om geen foute invoer te hebben en omdat het een lange lijst betreft met 341 producten is het zo overzichtelijker.

Maar het probleem doet zich al voor bij de count.
1
for ($i = 0; $i < count($_POST['product']); $i++) {

Als ik dit output dmv een array, krijg ik maar 200 producten te zien ipv 341.
Is er een bepaalde limiet op de array?

#4 03-09-2012 20:20
En als je de waarden van $_POST['product'], $_POST['prijseuro'], $_POST['prijscent'] etc... op je scherm dumpt dmv print_r() ipv een for-lus? bijvoorbeeld:

1
2
// inhoud van $_POST
echo '<pre>'.print_r($_POST, true).'</pre>';


Bevat de POST dan wat je verwacht?

// edit: bbcode aangepast

#5 05-09-2012 18:46
  • Dragon Lau
  • Groep: Forumleden
  • Posts: 64
  • Actief sinds: 09-08-2005
Nee.. ik verwachte 341 producten in een array, dus 340 keys, maar ik krijg er maar 166 terug.

Ik zal niet alles posten, maar dit krijg ik als foutmelding:

Quote

Notice: Undefined offset: 166 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/verzendkosten.php on line 61

Notice: Undefined offset: 166 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/verzendkosten.php on line 61

UPDATE vvs_webshop_product SET variabel = '.' WHERE id = '321'

Array
(
[id] => Array
(
[0] => 303
[1] => 295
[2] => 101
...
[165] => 254
[166] => 321
Iets zegt me dat ie niet verder gaat dan de 166 keys ofzo?

Edit:
Als ik id=321 wegfilter uit de lijst, dan krijg ik een ander fout:

UPDATE vvs_webshop_product SET variabel = '.' WHERE id = '267'

#6 06-09-2012 08:42
Ik kom er nu ook net achter dat vanaf PHP 5.3 een maximum aantal input variabelen gepost kan worden (zie http://www.php.net/m....max-input-vars), standaard staat deze op 1000.

Kan het zijn dat je per product 6 inputvelden hebt? 6*166 = 996, dus bij product 167 gaat het dan fout.

Als je de error_reporting op max zet (is eigenlijk noodzakelijk tijdens het ontwikkelen) geeft hij dat ook wel aan trouwens, dus ik zou nog even de volgende regels toevoegen bovenaan je script:
1
2
ini_set('display_errors','1');
error_reporting(E_ALL);

Dat had je waarschijnlijk veel tijd bespaard :)

#7 06-09-2012 19:02
  • Dragon Lau
  • Groep: Forumleden
  • Posts: 64
  • Actief sinds: 09-08-2005
Mijn error_reporting staat al op max.
Dit staat bovenaan:

1
2
3
4
5
6
<?php session_start();
ob_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: private');


Probleem doet zich ook voor met 7 producten (ik heb ze nu opgedeeld in beginletters A, B ipv hele lijst).


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
UPDATE vvs_webshop_product SET variabel = '0.00' WHERE id = '355'

UPDATE vvs_webshop_product SET variabel = '0.00' WHERE id = '365'

UPDATE vvs_webshop_product SET variabel = '0.00' WHERE id = '366'


Notice: Undefined offset: 3 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21

Notice: Undefined offset: 3 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21
UPDATE vvs_webshop_product SET variabel = '.' WHERE id = '402'


Notice: Undefined offset: 4 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21

Notice: Undefined offset: 4 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21
UPDATE vvs_webshop_product SET variabel = '.' WHERE id = '117'


Notice: Undefined offset: 5 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21

Notice: Undefined offset: 5 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21
UPDATE vvs_webshop_product SET variabel = '.' WHERE id = '243'


Notice: Undefined offset: 6 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21

Notice: Undefined offset: 6 in /home/dimensi/public_html/vvshop/dir_beheer/dir_verzendkosten/bewerken.php on line 21
UPDATE vvs_webshop_product SET variabel = '.' WHERE id = '287'

array(4) {
  ["id"]=>
  array(7) {
    [0]=>
    string(3) "355"
    [1]=>
    string(3) "365"
    [2]=>
    string(3) "366"
    [3]=>
    string(3) "402"
    [4]=>
    string(3) "117"
    [5]=>
    string(3) "243"
    [6]=>
    string(3) "287"
  }
  ["vareuro"]=>
  array(3) {
    [0]=>
    string(1) "0"
    [1]=>
    string(1) "0"
    [2]=>
    string(1) "0"
  }
  ["varcent"]=>
  array(3) {
    [0]=>
    string(2) "00"
    [1]=>
    string(2) "00"
    [2]=>
    string(2) "00"
  }
  ["PHPSESSID"]=>
  string(32) "c7d434d53a7c0af5c0984a75eae57fbc"
}


Dus ik snap er niet veel meer van... er wordt duidelijk geen waarde doorgegeven aan de laatste 4 producten, terwijl alle producten op dezelfde manier worden opgehaald.


Nu heb ik de verwerking als volgt:
1
2
3
4
5
6
7
foreach ($_POST['id'] as $key => $product_id){
    mysql_query("UPDATE vvs_webshop_product
                SET prijs = '".mysql_real_escape_string($_POST['prijseuro'][$key].'.'.$_POST['prijscent'][$key])."',
                    functie = '".mysql_real_escape_string($_POST['functie'][$key])."',
                    variabel = '".mysql_real_escape_string($_POST['vareuro'][$key].'.'.$_POST['varcent'][$key])."'
                WHERE id = '".mysql_real_escape_string($product_id)."'");
}


In formulier staat dit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$sQueryA = "SELECT id, prijs, functie, variabel
            FROM vvs_webshop_product
            WHERE naam
            LIKE '".mysql_real_escape_string($aController[3])."%'
            ORDER BY naam ASC";

[..]

while ($objA = mysql_fetch_assoc($sResultA)) {
    list($iPrijsEuro, $iPrijsCent) = explode('.', $objA['prijs']);
    list($iVarEuro, $iVarCent) = explode('.', $objA['variabel']);
    echo '<input type="hidden" name="id[]" value="'.$objA['id'].'" />' .PHP_EOL;
    echo '<input name="vareuro[]" type="text" size="5" value="'.$iVarEuro.'" />.<input name="varcent[]" maxlength="2" type="text" size="5" value="'.$iVarCent.'" />' .PHP_EOL;
}

#8 06-09-2012 19:17
prijseuro en prijscent zijn dus wel gevuld, maar functie, vareuro en varcent niet?

Zou je de code kunnen plaatsen waarmee het HTML-form gegenereerd wordt? Het probleem lijkt daar te zitten...

#9 06-09-2012 19:22
  • Dragon Lau
  • Groep: Forumleden
  • Posts: 64
  • Actief sinds: 09-08-2005
Ow, ik had mijn vorige post aangepast, omdat het bij minder producten ook geldt (zie vorige post), maar volledige HTML-form is:

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
echo '<form class="form" id="brfm" name="brfm" method="post" enctype="multipart/form-data" action="'.$paginaUrl.'">' .PHP_EOL;
    echo '<div class="formheader">Verzendkosten bewerken</div>' .PHP_EOL;
    echo '<div class="innerform">' .PHP_EOL;
        if ($iNumA > 0) {
            echo '<div class="cellicheader">' .PHP_EOL;
                echo '<div class="cell" style="width: 25px;">';
                echo strtoupper(htmlspecialchars($aController[3], ENT_QUOTES));
                echo '</div>' .PHP_EOL;
                echo '<div class="cell" style="width: 282px;">';
                echo $iNumA.' product'.($iNumA == 1 ? '' : 'en');
                echo '</div>' .PHP_EOL;
                echo '<div class="cell" style="width: 130px;">Productprijs</div>' .PHP_EOL;
                echo '<div class="cell" style="width: 120px;">Standaard </div>' .PHP_EOL;
                echo '<div class="cell" style="width: 195px;">Variabel verzendkosten</div>' .PHP_EOL;
                echo '<div class="cell" style="width: 170px;">Totaal</div>' .PHP_EOL;
                echo '<div class="clear"></div>' .PHP_EOL;
            echo '</div>' .PHP_EOL;

            while ($objA = mysql_fetch_assoc($sResultA)) {
                list($iPrijsEuro, $iPrijsCent) = explode('.', $objA['prijs']);
                list($iVarEuro, $iVarCent) = explode('.', $objA['variabel']);
                echo '<input type="hidden" name="id[]" value="'.$objA['id'].'" />' .PHP_EOL;
                echo '<div class="cellic">' .PHP_EOL;
                    if (file_exists($objA['afbeelding_small'])) {
                        echo '<div class="cell" style="width: 25px;">';
                            echo '<a href="/'.$objA['afbeelding_small'].'" class="img_preview">';
                            echo '<img src="/gfx/icon/image_preview.png" alt="" width="16" height="16" class="img_icon" />';
                            echo '</a>';
                        echo '</div>' .PHP_EOL;
                        echo '<div class="cell" style="width: 267px;">';
                    } else {
                        echo '<div class="cell" style="width: 292px;">';
                    }
                    echo '<acronym title="'.htmlspecialchars($objA['naam'], ENT_QUOTES).' - '.$objA['nummer'].' - '.$objA['gewicht'].' kg">';
                    echo loadShort(htmlspecialchars($objA['naam'], ENT_QUOTES), 35);
                    echo '</acronym>';
                    echo '</div>' .PHP_EOL;
                    /*echo '<div class="cell" style="width: 15px;">€</div>' .PHP_EOL;
                    echo '<div class="cell" style="width: 130px;"><input name="prijseuro[]" type="text" size="5" value="'.$iPrijsEuro.'" />.<input name="prijscent[]" maxlength="2" type="text" size="5" value="'.$iPrijsCent.'" /></div>' .PHP_EOL;
                    */echo '<div class="cell" style="width: 120px;">';
                        if ($objA['flag'] == 1) {
                            echo 'Gratis';
                        } else {
                            $iShippingNed = ($objA['gewicht'] * D_TARIEF + D_START) > D_MAX ? D_MAX : $objA['gewicht'] * D_TARIEF + D_START;
                            $iShippingBel = (ceil($objA['gewicht'] / D_IMAXKG) * D_ISTART) + ($objA['gewicht'] * D_ITARIEF);
                            echo '+ '.number_format($iShippingNed, 2, ',', '.').' / '.number_format($iShippingBel, 2, ',', '.');
                        }
                    echo '</div>' .PHP_EOL;
                    /*echo '<div class="cell" style="width: 50px;">';
                        echo '<select'.($objA['flag'] == 1 ? ' disabled="disabled" ' : ' ').'name="functie[]">';
                            echo '<option'.($objA['functie'] == 'plus' ? ' selected="selected" ' : ' ').'value="plus">+ </option>';
                            echo '<option'.($objA['functie'] == 'min' ? ' selected="selected" ' : ' ').'value="min">- </option>';
                        echo '</select>';
                    echo '</div>' .PHP_EOL;*/
                    echo '<div class="cell" style="width: 15px;">€</div>' .PHP_EOL;
                    echo '<div class="cell" style="width: 130px;"><input name="vareuro[]" type="text" size="5"'.($objA['flag'] == 1 ? ' disabled="disabled" ' : ' ').'value="'.$iVarEuro.'" />.<input name="varcent[]" maxlength="2" type="text" size="5"'.($objA['flag'] == 1 ? ' disabled="disabled" ' : ' ').'value="'.$iVarCent.'" /></div>' .PHP_EOL;
                    echo '<div class="cell" style="width: 170px;">€ ';
                        if ($objA['flag'] == 1) {
                            echo $objA['prijs'];
                        } else {
                            if ($objA['functie'] == 'plus') {
                                $iTotalNed = $objA['prijs'] + ($iShippingNed + $objA['variabel']);
                                $iTotalBel = $objA['prijs'] + ($iShippingBel + $objA['variabel']);
                            } elseif ($objA['functie'] == 'min') {
                                $iTotalNed = $objA['prijs'] + ($iShippingNed - $objA['variabel']);
                                $iTotalBel = $objA['prijs'] + ($iShippingBel - $objA['variabel']);
                            }
                            echo number_format($iTotalNed, 2, ',', '.').' / '.number_format($iTotalBel, 2, ',', '.');
                        }
                    echo '</div>' .PHP_EOL;
                    echo '<div class="clear"></div>' .PHP_EOL;
                echo '</div>' .PHP_EOL;
            }
        }
        echo '<div class="buttons">';
            echo '<div class="cell" style="width: 297px;"></div>';
            echo '<div class="cell" style="width: 110px;"><input name="Verzenden" type="submit" class="formbuttons" value="Opslaan" /></div>';
            echo '<div class="cell" style="width: 110px;"><input name="Herstel" type="reset" class="formbuttons" value="Herstel" /></div>';
            echo '<div class="cell" style="width: 270px;"><input name="Annuleren" type="button" class="formbuttons" value="Annuleren" onclick="javascript:history.go(-1);" /></div>';
            echo '<div class="clear"></div>';
        echo '</div>' .PHP_EOL;
    echo '</div>' .PHP_EOL;
echo '</form>' .PHP_EOL;

#10 06-09-2012 19:42
Het probleem zit hem in de inputvelden die je op "disabled" zet, deze worden namelijk niet gepost. Is ook te zien in je vorige post, er worden 6 producten gepost en maar 3 prijzen.

Waarschijnlijk bedoel je readonly="readonly" bij de input? Dan kan het getal niet gewijzigd worden, maar de waarde wordt wel gepost.

#11 06-09-2012 19:47
  • Dragon Lau
  • Groep: Forumleden
  • Posts: 64
  • Actief sinds: 09-08-2005
Haha... ojee.. je hebt gelijk.
Ik dagen aan het zoeken, namen veranderd etc.

In ieder geval erg bedankt.
Ik kan weer verder :D


Inloggen wachtwoord vergeten? Aanmelden