[php] probleem met array_sum()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Heel simpel: ik heb een formulier met waardes, en in m'n post krijg ik een array en wil controleren of er wel iets is ingevuld. Daarvoor wilde ik array_sum gaan gebruiken. Het vervelende is alleen dat die van niet ingevulde waarden een 0 maakt.
van PHP.net:
Note: PHP versions prior to 4.0.6 modified the passed array itself and converted strings to numbers (which most of the time converted them to zero, depending on their value).
Zoals daar onder al wordt opgemerkt zit die bug er in 4.1.2 nog steeds in (gebruik ik zelf).
IK dacht dit op te lossen door de array die ik wil controleren eerst in een andere variabele to gooien en dan die te controleren. Maar het gekke is, dan maakt ie van m'n post-array nog steeds nullen??? :S

hier is een stukje code waarmee jullie het eventueel zelf kunnen testen:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
if ($_POST['mode']  == "sent")
{
    echo "<pre>\n";print_r($_POST['array']);echo "</pre>\n";
    $check_array = $_POST['array']; 
    if (array_sum($check_array) > 0)
    {
        $top_message = "form processed";
        unset ($_POST);
    }
    else
    {
        $top_message = "<font color=\"#FF0000\">You forgot to fill in at least one value</font>\n";
    }
    echo "<pre>\n";print_r($_POST['array']);echo "</pre>\n";
}
?>
<html>
<head>
 <script language="javascript">
    //
 </script>
</head>
<body>
<center>
<br>

<?php if ($top_message) echo $top_message; ?>

<form action="<?php echo $PHP_SELF; ?>" method="post" name="Frm">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
 <td align="left" valign="top">
    0
 </td>
 <td align="left" valign="top">
    <input type="text" name="array[0]" value="<?php echo $_POST['array'][0]; ?>"
 </td>
</tr>
<tr>
 <td align="left" valign="top">
    1
 </td>
 <td align="left" valign="top">
    <input type="text" name="array[1]" value="<?php echo $_POST['array'][1]; ?>"
 </td>
</tr>
<tr>
 <td align="left" valign="top">
    2
 </td>
 <td align="left" valign="top">
    <input type="text" name="array[2]" value="<?php echo $_POST['array'][2]; ?>"
 </td>
</tr>
<tr>
 <td align="center" colspan="2" bgcolor="#CACACA">
    <input type="submit" value="Submit">
 </td>
</tr>
</table>
<input type="hidden" name="mode" value="sent">
</form>


met deze regel:
echo "<pre>\n";print_r($_POST['array']);echo "</pre>\n";
print ik dus twee keer die array uit, de eerste keer is ie gewoon leeg als je nix invult, de tweede keer staan er overal nullen.
Doe ik nou gewoon iets stoms? Of is de bug nog veel groter dan op php.net staat?

p.s. welke andere functie zou ik kunnen gebruiken? (ipv met een foreach alle variabelen in m'n array checken).

[ Voor 24% gewijzigd door marty op 20-12-2002 10:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als ik 3 waardes invul, laat ie deze 3 waardes gewoon keurig netjes 2x zien hoor.
Ik krijg alleen een melding dat ik minstens 1 waarde moet invullen.

[edit: ff denken hoor ...]

Ik zou inderdaad een andere manier gebruiken om je variabelen te checken

PHP:
1
2
3
4
5
6
7
8
9
10
function checkVar($var){
   return (!empty($var) && $var!="");
}

$check_array = true;
for($i=0; $i<sizeof($_POST['array']); $i++){
   $check_array = checkVar($_POST[['array'][$i]);
}

($check_array) ? $top_message = "ok" : $top_message = "foutje";

[ Voor 79% gewijzigd door Verwijderd op 20-12-2002 10:41 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Verwijderd schreef op 20 December 2002 @ 10:30:
Als ik 3 waardes invul, laat ie deze 3 waardes gewoon keurig netjes 2x zien hoor.
Ik krijg alleen een melding dat ik minstens 1 waarde moet invullen.

Het gaat waarschijnlijk fout bij:
array_sum($check_array)
Kijk eens naar de titel van m'n topic.
dat het daar fout gaat was ik ook al achter: dat was de hele reden waarom ik dit topic poste!! :P

Het probleem zit 'm er in dat als ik nix invul, dat er allemaal nullen in m'n formulier komen
en dat wil ik niet

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Schrijf dan gewoon je eigen loopje die door de array heenloopt en checkt :)

En ik zie dat je geen error_reporting(E_ALL) gebruikt.. anders had je ook nog wel wat foutmeldingen gehad.. bijvoorbeeld over niet bestaande array-indices..

[ Voor 28% gewijzigd door Bosmonster op 20-12-2002 10:43 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Bosmonster schreef op 20 december 2002 @ 10:42:
Schrijf dan gewoon je eigen loopje die door de array heenloopt en checkt :)
..
ja, dat heb ik ondertussen ook wel gedaan, zo dat ik verder kan werken, maar dat vind ik zo lelijk :r
Zoiets basics moet toch wel met een gewone php functie op te lossen zijn?
en daarbij, wilde graag weten of ik nou zelf liep te klooien waardoor het mis ging met die array_sum, of dat die functie echt gewoon rot is

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Bosmonster schreef op 20 december 2002 @ 10:42:
En ik zie dat je geen error_reporting(E_ALL) gebruikt.. anders had je ook nog wel wat foutmeldingen gehad.. bijvoorbeeld over niet bestaande array-indices..
Is dat zo erg dan?
....vind het weinig toegevoegde waarde hebben dat ie daar over begint te zeuren.
Wat vind jij een goed argument om het aan te zetten dan?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

marty schreef op 20 December 2002 @ 10:58:
[...]


Is dat zo erg dan?
....vind het weinig toegevoegde waarde hebben dat ie daar over begint te zeuren.
Wat vind jij een goed argument om het aan te zetten dan?


Dat je 'normaal' leert programmeren.. :)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Bosmonster schreef op 20 December 2002 @ 11:04:

[...]


Dat je 'normaal' leert programmeren.. :)
Aan zo'n antwoord heb nog eens wat!
Ben gelijk overstag :|

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Mijn doel is ook niet om je over te halen.. het nut moet je er zelf van in zien. Als jij er voor wilt kiezen om PHP een groot gedeelte van de ERRORs te laten negeren, dan moet je dat zelf weten. Zelf heb ik liever dat de code echt klopt.

[ Voor 3% gewijzigd door Bosmonster op 20-12-2002 11:12 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
nou, ik sta voor alles open. als ik m'n manier van programmeren kan verbeteren doe ik dat graag. dus ik hoopte eigenlijk dat je een overtuigend argument kon geven. of in iedergeval een argument wat jij zelf belangrijk vindt en waarvan ik zoiets kan hebben: dat vind ik niet belangrijk - dan weet ik in iedergeval waarom ik het nog steeds zo doe.

kijk, als je de error reporting uit zet, dan wordt het een soort onmogelijk om je scripts te debuggen. dus da's dom. dat zou je het grootste argument kunnen noemen waarom je dat dus aan moet zetten. maar ik zet 'm niet op ALL omdat ik daar nou juist het nut weer niet van zie. Gaat ie om dingen zeuren, wat me allemaal extra code kost, terwijl het - imho - niets aan de structuur van m'n code toevoegd, de debugbaarheid (als dat een woord is), of iets dergelijks

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

marty schreef op 20 December 2002 @ 11:24:
nou, ik sta voor alles open. als ik m'n manier van programmeren kan verbeteren doe ik dat graag. dus ik hoopte eigenlijk dat je een overtuigend argument kon geven. of in iedergeval een argument wat jij zelf belangrijk vindt en waarvan ik zoiets kan hebben: dat vind ik niet belangrijk - dan weet ik in iedergeval waarom ik het nog steeds zo doe.

kijk, als je de error reporting uit zet, dan wordt het een soort onmogelijk om je scripts te debuggen. dus da's dom. dat zou je het grootste argument kunnen noemen waarom je dat dus aan moet zetten. maar ik zet 'm niet op ALL omdat ik daar nou juist het nut weer niet van zie. Gaat ie om dingen zeuren, wat me allemaal extra code kost, terwijl het - imho - niets aan de structuur van m'n code toevoegd, de debugbaarheid (als dat een woord is), of iets dergelijks
Wacht maar tot je php applicatie op een server moeten draaien waar dat aanstaat en je het niet kan wijzigen.

Het is gewoon zinvol om met e_all te werken aangezien je code dan op zo goed als elke server zullen werken.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Als het je verplicht om bijvoorbeeld indices te quoten zoals het hoort en variabelen te initialiseren zoals het hoort (inclusief array indices) dan is dat voor mij al voordeel genoeg. Nu doe ik het toch wel, ook zonder E_ALL, omdat ik het gewoon ranzig vind om het niet te doen, maar het helpt mij wel om deze problemen te herkennen. Als je al niet de drive hebt om goed te programmeren, maar slechts jezelf beperkt tot "ranzig programmeren kost me minder code", dan is dat een keus voor jezelf. En dan kom je jezelf nog wel eens tegen als je eens een echte programmeertaal wilt proberen, ipv van dit beetje scripten.

Ben ikzelf blij dat ik niet je collega ben in ieder geval :)

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
Door te programmeren met E_ALL wordt je gedwongen om netter om te gaan met variablen daardoor worden fouten voorkomen.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Nou...zo ranzig ziet het er toch niet uit wat hier boven staat?
ik vind eigenlijk dat ik vrij netjes programmeer. en ik quote die indices ook altijd, omdat ik dáár het nut wel van inzie. ik indent ook alles consequent, etc. en ik wilde ook niet suggereren dat ik het enkel met minimale code (ik zie nu dat ik het inderdaad een beetje extreem stelde), maar om eerst te gaan controleren of iets wel bestaat en dan vervolgens de waarde die niet bestaat ook niet neer te zetten vind ik een beetje overdreven. dan kun je net zo goed die waarde printen, want als ie niet bestaat komt er ook niets te staan. wat precies is wat je wil.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Dat is misschien wat jij wil, maar dat is niet wat ik wil.. ik wil namelijk dat ie een foutmelding geeft dat de variabele niet bestaat.. dan weet ik dat ik ergens iets vergeten ben, en dat ik niet per ongeluk een andere variabele gebruik die ergens WEL gedeclareerd is.. ook dat is niet voor niks 'fout' hoor :)

Niet hoeven declareren van variabelen scoort in ranzigheid net zo hoog als register_globals. Het maakt code heel ondoorzichtig en moeilijk leesbaar voor buitenstaanders. En dan heb ik het niet over zo'n scriptje van een paar regels, maar over pagina's lange code bijvoorbeeld..

[ Voor 32% gewijzigd door Bosmonster op 20-12-2002 12:19 ]


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Tja, ik ben zelf nog nooit tegen problemen aangelopen, omdat het me altijd precies duidelijk is wat ik doe... misschien wel omdat ik de rest van m'n code zo netjes hou (ondanks dat ik E_ALL uit heb staan) :) :)

Maar, ik hoef ook nooit met buitenstaanders samen te werken.....

Misschien wel een ideetje om vanuit dat oogpunt (en met oog op toekomst) het mezelf toch maar aan te leren dan om dat ook te doen...

iig bedankt voor de wat uitgebreidere toelichting ;)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
maar om ff op m'n topic terug te komen.
het is toch raar dat als ik zeg
$array1 = $array2
array_sum($array1);
dat dit dan ook invloed heeft op $array2?
afgezien van het feit dat die array sum dus zowiezo die bug met die nulwaardes heeft
daar doe ik dus zelf nix fout aan dat dat toch fout gaat?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

je doet

unset($_POST)

en vindt het vervolgens gek dat je $_POST['array'] array niet meer is wat ie was? :)

M.a.w.: laat de superglobals met rust en ga ze niet proberen te unsetten of modifyen.

[ Voor 127% gewijzigd door Bosmonster op 20-12-2002 12:57 ]


Acties:
  • 0 Henk 'm!

Verwijderd

mm, als je dan toch zo netjes mogelijk wilt programmeren ... noem dan een variabele niet 'array' :P

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Bosmonster schreef op 20 december 2002 @ 12:54:
je doet

unset($_POST)

en vindt het vervolgens gek dat je $_POST['array'] array niet meer is wat ie was? :)

M.a.w.: laat de superglobals met rust en ga ze niet proberen te unsetten of modifyen.
Dat staat los van mijn probleem
$_POST wordt alleen ge-unset als er waardes worden ingevuld - vervolgens moet er een leeg formulier worden weergegeven. in het geval waar het mis gaat doe ik niets met die unset.
Verwijderd schreef op 20 december 2002 @ 14:12:
mm, als je dan toch zo netjes mogelijk wilt programmeren ... noem dan een variabele niet 'array' :P
uhmm.... waar doe ik dat dan?

Acties:
  • 0 Henk 'm!

Verwijderd

Heu?! Valt je dat zelf niet op!?
Je invoervelden heten :

name="array[1]" etc.

Dus je POST variabelen welke een array zijn heten ook 'array' ...

namelijk: $_POST['array'][1]
Dus de naam van de variabele is array :)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ahhh....dat
Wel, het was slechts een voorbeeldje. Het kwam uit een heel stuk code en ik maak dat formulier op dynamische wijze. maar omdat ik jullie daar niet mee wilde lastig vallen heb ik gewoon even 1 tabelrow gemaakt en die daaronder nog 2x ge-copy-en-paste. en moest toen dus ook nog ff een naampje invullen. In m'n code heeft het wel een wat zinnigere naam hoor :-)

Maar in princiepe is het in de POST ook een array: $_POST['array'] is gewoon een array.
En zolang het nog in m'n formulier staat is het niet eens een variabele maar gewoon de naam van de name="" tag in html :) :)

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Blijf het een vage bug vinden..

Het gekste vond ik nog dat de array_sum() bug verdween nadat ik de array reference kopieerde..

In jouw code zou dat dit worden:

$check_array = &$_POST['array'];

Omgekeerde wereld ik weet het, maar het werkt wel. array_sum() gaf hierna bij mij nog steeds netjes de sum van de array terug, maar de inhoud van de array blijft ongewijzigd.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ja, dat is idd helemaal raar..... echt vaag...... 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Welke PHP versie gebruik je?
Want ik kreeg echt geen rare dingen hoor ...

Ik gebruik de laatste versie: 4.2.3 (lokaal)
Pagina: 1