/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
array_sum()
Fra : Poul Kubel


Dato : 02-05-04 09:23

Hej

Jeg bruger array_sum() til at udregne den samlede pris på en flok varer, som
en kunde bestiller. Problemet består i at priserne, i overensstemmelse med
dansk sprogbrug, er skrevet med kommatal (8,75 - 9,50 etc.) mens at
array_sum() kun kan udregne heltal og floats med punktummer (8.75 - 9.75
etc.) Derfor vil array_sum() kun udregne summen af de tal der kommer før
kommaet.

Er der nogen der har forslag til hvordan jeg kan løse problemet? Findes der
evt. en måde hvorpå jeg kan omdanne kommaet til et punktum, mens funktionen
udregner, og som efterfølgende genskaber outputtet som et kommatal?

Mvh.

Poul



 
 
Tommy Ipsen (02-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 02-05-04 10:20

Poul Kubel wrote:

> Jeg bruger array_sum() til at udregne den samlede pris på en flok varer, som
> en kunde bestiller. Problemet består i at priserne, i overensstemmelse med
> dansk sprogbrug, er skrevet med kommatal (8,75 - 9,50 etc.) mens at
> array_sum() kun kan udregne heltal og floats med punktummer (8.75 - 9.75
> etc.) Derfor vil array_sum() kun udregne summen af de tal der kommer før
> kommaet.
>
> Er der nogen der har forslag til hvordan jeg kan løse problemet? Findes der
> evt. en måde hvorpå jeg kan omdanne kommaet til et punktum, mens funktionen
> udregner, og som efterfølgende genskaber outputtet som et kommatal?

Du bør så vidt muligt holde tal (og andre datatyper som eks. datoer) i
det format computeren kan lide at regne med og kun ved udskrivning og
lignende lave om til det format som brugeren kan lide!

Hvor kommer input/tallene fra i dette tilfælde - fra en db, formular
eller...?

Mvh Tommy

Poul Kubel (02-05-2004)
Kommentar
Fra : Poul Kubel


Dato : 02-05-04 17:00


> > Jeg bruger array_sum() til at udregne den samlede pris på en flok varer,
som
> > en kunde bestiller. Problemet består i at priserne, i overensstemmelse
med
> > dansk sprogbrug, er skrevet med kommatal (8,75 - 9,50 etc.) mens at
> > array_sum() kun kan udregne heltal og floats med punktummer (8.75 - 9.75
> > etc.) Derfor vil array_sum() kun udregne summen af de tal der kommer før
> > kommaet.
> >
> > Er der nogen der har forslag til hvordan jeg kan løse problemet? Findes
der
> > evt. en måde hvorpå jeg kan omdanne kommaet til et punktum, mens
funktionen
> > udregner, og som efterfølgende genskaber outputtet som et kommatal?
>
> Du bør så vidt muligt holde tal (og andre datatyper som eks. datoer) i
> det format computeren kan lide at regne med og kun ved udskrivning og
> lignende lave om til det format som brugeren kan lide!
>
> Hvor kommer input/tallene fra i dette tilfælde - fra en db, formular
> eller...?

De kommer fra en database i mysql.

mvh.

Poul



Tommy Ipsen (02-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 02-05-04 18:38

Poul Kubel wrote:

> De kommer fra en database i mysql.

Så benytter du vel en af MySQL's numeriske datatyper - og dermed kan du
også bare bruge SUM() til at summere direkte i MySQL.

Se evt: http://dev.mysql.com/doc/mysql/en/Numberic_type_overview.html

Mvh Tommy

Poul Kubel (02-05-2004)
Kommentar
Fra : Poul Kubel


Dato : 02-05-04 22:27


"Tommy Ipsen" skrev :
>
> Så benytter du vel en af MySQL's numeriske datatyper - og dermed kan du
> også bare bruge SUM() til at summere direkte i MySQL.
>
> Se evt: http://dev.mysql.com/doc/mysql/en/Numberic_type_overview.html
>
> Mvh Tommy

Næh, det gjorde jeg nu ikke, men det fandt jeg jo så ud af var smart, tak
for hjælpen

Jeg har nu defineret indholdet af den pågældende kolonne i min mysql-tabel
til at være float. Jeg har dog et lille problem med brugen af SUM(), som jeg
ikke helt kan forstå.

Dette virker fint:

$sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer < 1100");
echo mysql_result($sql, 0);

Men følgende script returnerer ikke summen af alle værdierne, men alle
sammen, en efter en (eks.: 2100.001500.00275.00):

$input = array_unique($_SESSION['bestilling']);
foreach ($input as $reg) {
$sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer=$reg");
echo mysql_result($sql, 0);
}

Hvad gør jeg galt?



Tommy Ipsen (03-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 03-05-04 11:41

Poul Kubel wrote:

> Næh, det gjorde jeg nu ikke, men det fandt jeg jo så ud af var smart, tak
> for hjælpen
>
> Jeg har nu defineret indholdet af den pågældende kolonne i min mysql-tabel
> til at være float. Jeg har dog et lille problem med brugen af SUM(), som jeg
> ikke helt kan forstå.
>
> Dette virker fint:
>
> $sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer < 1100");
> echo mysql_result($sql, 0);
>
> Men følgende script returnerer ikke summen af alle værdierne, men alle
> sammen, en efter en (eks.: 2100.001500.00275.00):
>
> $input = array_unique($_SESSION['bestilling']);
> foreach ($input as $reg) {
> $sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer=$reg");
> echo mysql_result($sql, 0);
> }
>
> Hvad gør jeg galt?

Det er jo fordi du laver en ny forespørgsel for hver eneste værdi i dit
session-array - du skal have samlet det til en forespørgsel! Du skal
egentlig have summeret alle priser på varer med varenumre i
session-arrayet - det kan du gøre på følgende måde:

$varekurv = explode(', ', $_SESSION['bestilling']);
$sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer IN
($varekurv)");
echo mysql_result($sql, 0);

Læs mere om IN på:
http://dev.mysql.com/doc/mysql/en/Comparison_Operators.html#IDX1217

Der er dog ét problem med ovenstående - nemlig, hvis man har bestilt
mere end én af nogle varer - dét er der ikke taget højde for!

Mvh Tommy

Poul Kubel (03-05-2004)
Kommentar
Fra : Poul Kubel


Dato : 03-05-04 12:53


"Tommy Ipsen" skrev
>
> Det er jo fordi du laver en ny forespørgsel for hver eneste værdi i dit
> session-array - du skal have samlet det til en forespørgsel! Du skal
> egentlig have summeret alle priser på varer med varenumre i
> session-arrayet - det kan du gøre på følgende måde:
>
> $varekurv = explode(', ', $_SESSION['bestilling']);
> $sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer IN
> ($varekurv)");
> echo mysql_result($sql, 0);

Ok, jeg kan godt forstå hvad du mener, og jeg har prøvet at paste det du
skrev over i mit php-script. Det giver imidlertid fejlen: MySQL-fejl:
Unknown column 'Array' in 'where clause', hvilket jeg desværre ikke bliver
klogere af.
>
> Der er dog ét problem med ovenstående - nemlig, hvis man har bestilt
> mere end én af nogle varer - dét er der ikke taget højde for!
>
> Mvh Tommy



Tommy Ipsen (03-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 03-05-04 14:15

Poul Kubel wrote:

>>$varekurv = explode(', ', $_SESSION['bestilling']);
>>$sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer IN
>>($varekurv)");
>>echo mysql_result($sql, 0);
>
> Ok, jeg kan godt forstå hvad du mener, og jeg har prøvet at paste det du
> skrev over i mit php-script. Det giver imidlertid fejlen: MySQL-fejl:
> Unknown column 'Array' in 'where clause', hvilket jeg desværre ikke bliver
> klogere af.

Min fejl - jeg har brugt explode() i stedet for implode() - ret koden til:

$varekurv = implode(', ', $_SESSION['bestilling']);
$sql = "SELECT SUM(pris) FROM webshop WHERE varenummer IN ($varekurv)"
$res = mysql_query($sql) or die('Fejl i query: ' . $sql);
echo mysql_result($res, 0);

Mvh Tommy

Jonas Koch Bentzen (03-05-2004)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 03-05-04 16:33

Tommy Ipsen skrev:
>
> $res = mysql_query($sql) or die('Fejl i query: ' . $sql);

Med fare for at gentage mig selv... :) At stoppe scriptet midt i udførslen
er ret dårlig fejlhåndtering:
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=b7gr39%24l5%241%40sunsite.dk

--
- Jonas Koch Bentzen

http://understroem.dk/
http://findhim.com/

Tommy Ipsen (04-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 04-05-04 13:13

Jonas Koch Bentzen wrote:

>>$res = mysql_query($sql) or die('Fejl i query: ' . $sql);
>
> Med fare for at gentage mig selv... :) At stoppe scriptet midt i udførslen
> er ret dårlig fejlhåndtering:
> http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=b7gr39%24l5%241%40sunsite.dk

Det er vi helt enige om Jonas, men spørgsmålet gik ikke på
fejlhåndtering, så jeg fokuserer på det essentielle i spørgsmålet og
giver noget kode, der er nem at debugge, mens skidtet er under udvikling!

Hvordan man efterfølgende vælger at håndtere fejl når websitet er i
drift er meget forskelligt og jeg vil ikke bebyrde spørgeren med min(e)
metode(r) til dette!

Mvh Tommy

Jonas Koch Bentzen (04-05-2004)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 04-05-04 15:12

Tommy Ipsen skrev:

> Jonas Koch Bentzen wrote:
>
>>>$res = mysql_query($sql) or die('Fejl i query: ' . $sql);
>>
>> Med fare for at gentage mig selv... :) At stoppe scriptet midt i
>> udførslen er ret dårlig fejlhåndtering:
>>
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&selm=b7gr39%24l5%241%40sunsite.dk
>
> Det er vi helt enige om Jonas, men spørgsmålet gik ikke på
> fejlhåndtering, så jeg fokuserer på det essentielle i spørgsmålet og
> giver noget kode, der er nem at debugge, mens skidtet er under udvikling!

Faktisk er koden ikke nem at debugge på den måde, fordi fejlmeddelsen kan
komme langt nede på siden, så man ikke lægger mærke til den, eller den kan
ligge ind i en <select> eller lignende, så man ikke kan se den.

> Hvordan man efterfølgende vælger at håndtere fejl når websitet er i
> drift er meget forskelligt og jeg vil ikke bebyrde spørgeren med min(e)
> metode(r) til dette!

Du ville ikke bebyrde nogen ved at skrive f.eks.

or trigger_error(mysql_error())

Faktisk ville du give spørgeren et godt råd mht. fejlhåndtering. At du så
ikke også har lyst til at skrive en smøre om, hvordan man laver sin egen
fejlhåndteringsfunktion, som trigger_error() så kalder, forstår jeg godt.

--
- Jonas Koch Bentzen

http://understroem.dk/
http://findhim.com/

Tommy Ipsen (04-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 04-05-04 15:23

Jonas Koch Bentzen wrote:

> Faktisk er koden ikke nem at debugge på den måde, fordi fejlmeddelsen kan
> komme langt nede på siden, så man ikke lægger mærke til den, eller den kan
> ligge ind i en <select> eller lignende, så man ikke kan se den.

Hvis man af mystiske årsager ikke kan se en fejlmelding, viser man
sourcekoden og så vil fejlkoden være det sidste der er modtaget af
klienten - det bliver ikke meget nemmere.

> Du ville ikke bebyrde nogen ved at skrive f.eks.
>
> or trigger_error(mysql_error())
>
> Faktisk ville du give spørgeren et godt råd mht. fejlhåndtering. At du så
> ikke også har lyst til at skrive en smøre om, hvordan man laver sin egen
> fejlhåndteringsfunktion, som trigger_error() så kalder, forstår jeg godt.

Ovenstående vil næsten sikkert give anledning til den type spørgsmål,
hvor jeg så vil føle mig forpligtet til at forklare, hvordan
fejlhåndtering fungerer og hvad der kan betragtes som god praksis!
Derudover kan den være problematisk da visningen af fejlmeldingen
afhænger af brugerens fejlrapporteringsniveau, hvilket ikke er tilfældet
for die()!

Jeg kan godt se dine argumenter og respekterer din holdning, men jeg
holder mig til simplificerede svar, der fokuserer på den konkrete
problemstilling og ikke samtidig prøver at "uddanne" i god
programmeringsskik.

Derudover benytter jeg ikke selv trigger_error(), da jeg forlader mig på
den fejlhåndtering der er indbygget i PEAR-klassen i mine projekter, og
jeg vil derfor skulle bruge lidt tid på lige at slynge en passende
fejlhåndtering ud til denne metode.

Mvh Tommy

Jonas Koch Bentzen (04-05-2004)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 04-05-04 15:36

Tommy Ipsen skrev:
|
> Derudover benytter jeg ikke selv trigger_error(), da jeg forlader mig på
> den fejlhåndtering der er indbygget i PEAR-klassen i mine projekter, og
> jeg vil derfor skulle bruge lidt tid på lige at slynge en passende
> fejlhåndtering ud til denne metode.

PEAR::setErrorHandling(PEAR_ERROR_TRIGGER);

- så vil PEAR også bruge samme fejlhåndteringsfunktion som den, PHP's
funktioner kalder ved fejl eller man selv kalder vha. trigger_error().
Nemmere kan det vist ikke blive :)

--
- Jonas Koch Bentzen

http://understroem.dk/
http://findhim.com/

Peter Brodersen (04-05-2004)
Kommentar
Fra : Peter Brodersen


Dato : 04-05-04 17:06

On Tue, 04 May 2004 16:36:29 +0200, Jonas Koch Bentzen
<ingen.email@eksempel.dk> wrote:

>- så vil PEAR også bruge samme fejlhåndteringsfunktion som den, PHP's
>funktioner kalder ved fejl eller man selv kalder vha. trigger_error().
>Nemmere kan det vist ikke blive :)

... og allerede nu har du øget kompleksiteten i en hurtig fejlfinding
til at skulle tage stilling til om brugeren bruger PEAR, og så
fremdeles :)

Jeg vil mene, at det blot forvirrer i en konkret sag at blande andre
detaljer og argumenter ind over, fordi formålet for en ny person ikke
vil være klart, og tråden hurtigt kan komme til at handle om noget
andet - i det her tilfælde PEAR.

Som eksempel på dette, så burde du jo også rette din trigger_error()
til, så den smider noget andet end blot en E_USER_NOTICE, der
fortsætter udførsel. Så kan du overveje at kaste en anden error_type
eller justere i indstillingerne i error_reporting().

Givet, intet problem i at skrive "or trigger_error(mysql_error())" i
stedet for "or die(mysql_error())". Men ingen grund til at rette, hvis
du alligevel ikke har nogen planer om at fortælle den fulde historie.

--
- Peter Brodersen

Ugens sprogtip: "Der er et yndigt land" (og ikke "Det er et yndigt land")

Jonas Koch Bentzen (04-05-2004)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 04-05-04 23:12

Peter Brodersen skrev:
>
> .. og allerede nu har du øget kompleksiteten i en hurtig fejlfinding
> til at skulle tage stilling til om brugeren bruger PEAR, og så
> fremdeles :)

Med Tommys sidste kommentar havde debatten drejet sig over i, hvordan man
laver god fejlhåndtering - derfor kom jeg bare med et forslag. Det var ikke
for at sige, at den oprindelige spørger burde bruge det.

--
- Jonas Koch Bentzen

http://understroem.dk/
http://findhim.com/

Tommy Ipsen (04-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 04-05-04 17:14

Jonas Koch Bentzen wrote:

> PEAR::setErrorHandling(PEAR_ERROR_TRIGGER);
>
> - så vil PEAR også bruge samme fejlhåndteringsfunktion som den, PHP's
> funktioner kalder ved fejl eller man selv kalder vha. trigger_error().
> Nemmere kan det vist ikke blive :)

- jo, ved at skrive "or die(mysql_error());"...

Mvh Tommy

Poul Kubel (03-05-2004)
Kommentar
Fra : Poul Kubel


Dato : 03-05-04 18:23


"Tommy Ipsen" skrev
> Min fejl - jeg har brugt explode() i stedet for implode() - ret koden til:
>
> $varekurv = implode(', ', $_SESSION['bestilling']);
> $sql = "SELECT SUM(pris) FROM webshop WHERE varenummer IN ($varekurv)"
> $res = mysql_query($sql) or die('Fejl i query: ' . $sql);
> echo mysql_result($res, 0);
>
Mange tak, nu virker det Jeg skulle dog lige erstatte:

$sql = "SELECT SUM(pris) FROM webshop WHERE varenummer IN ($varekurv)"
$res = mysql_query($sql) or die('Fejl i query: ' . $sql);
echo mysql_result($res, 0);

med

$sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer IN
($varekurv)");
echo mysql_result($res, 0);

før det ville virke. Men igen, tusind tak for hjælpen.

Mvh.

Poul Kubel




Tommy Ipsen (04-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 04-05-04 13:06

Poul Kubel wrote:

> Mange tak, nu virker det Jeg skulle dog lige erstatte:
>
> $sql = "SELECT SUM(pris) FROM webshop WHERE varenummer IN ($varekurv)"
> $res = mysql_query($sql) or die('Fejl i query: ' . $sql);
> echo mysql_result($res, 0);
>
> med
>
> $sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer IN
> ($varekurv)");
> echo mysql_result($res, 0);
>
> før det ville virke. Men igen, tusind tak for hjælpen.

Jeg vil godt garantere, at den nederste udgave ikke fungerer ($sql vs.
$res), men jeg kan ikke se, hvor problemet skulle være i min udgave?

Mvh Tommy

Jakob Braad (04-05-2004)
Kommentar
Fra : Jakob Braad


Dato : 04-05-04 13:18

I din udgave mangler der blot et ; i slutningen af første linie.

Tommy Ipsen wrote:

> Poul Kubel wrote:
>
>> Mange tak, nu virker det Jeg skulle dog lige erstatte:
>>
>> $sql = "SELECT SUM(pris) FROM webshop WHERE varenummer IN ($varekurv)"
>> $res = mysql_query($sql) or die('Fejl i query: ' . $sql);
>> echo mysql_result($res, 0);
>>
>> med
>>
>> $sql = mysql_query("SELECT SUM(pris) FROM webshop WHERE varenummer IN
>> ($varekurv)");
>> echo mysql_result($res, 0);
>>
>> før det ville virke. Men igen, tusind tak for hjælpen.
>
>
> Jeg vil godt garantere, at den nederste udgave ikke fungerer ($sql vs.
> $res), men jeg kan ikke se, hvor problemet skulle være i min udgave?
>
> Mvh Tommy


Tommy Ipsen (04-05-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 04-05-04 13:25

Jakob Braad wrote:

> I din udgave mangler der blot et ; i slutningen af første linie.

Ahh - takker

Mvh Tommy

Peter Farsinsen [900~ (02-05-2004)
Kommentar
Fra : Peter Farsinsen [900~


Dato : 02-05-04 14:20

Poul Kubel wrote:

> Jeg bruger array_sum() til at udregne den samlede pris på en flok varer, som
> en kunde bestiller. Problemet består i at priserne, i overensstemmelse med
> dansk sprogbrug, er skrevet med kommatal (8,75 - 9,50 etc.) mens at
> array_sum() kun kan udregne heltal og floats med punktummer (8.75 - 9.75
> etc.) Derfor vil array_sum() kun udregne summen af de tal der kommer før
> kommaet.
>
> Er der nogen der har forslag til hvordan jeg kan løse problemet? Findes der
> evt. en måde hvorpå jeg kan omdanne kommaet til et punktum, mens funktionen
> udregner, og som efterfølgende genskaber outputtet som et kommatal?

Mjaeh, jeg er ikke helt sikker, men jeg mener at setlocale(); ændre på
det! Jeg er i hvert fald næsten sikker på at det er meningen, at den
sku' ku' gøre det!

Altså noget a la setlocale('LC_ALL', 'da_dk'); i toppen, og prøv så med
array_sum(); som du ellers ville ha' gjort!

mvh

Peter Farsinsen

Christian Joergensen (02-05-2004)
Kommentar
Fra : Christian Joergensen


Dato : 02-05-04 17:20

On Sun, 02 May 2004 10:23:24 +0200, Poul Kubel wrote:

> Jeg bruger array_sum() til at udregne den samlede pris på en flok varer, som
> en kunde bestiller. Problemet består i at priserne, i overensstemmelse med
> dansk sprogbrug, er skrevet med kommatal (8,75 - 9,50 etc.) mens at
> array_sum() kun kan udregne heltal og floats med punktummer (8.75 - 9.75
> etc.) Derfor vil array_sum() kun udregne summen af de tal der kommer før
> kommaet.
>
> Er der nogen der har forslag til hvordan jeg kan løse problemet? Findes der
> evt. en måde hvorpå jeg kan omdanne kommaet til et punktum, mens funktionen
> udregner, og som efterfølgende genskaber outputtet som et kommatal?

Du kan gemme prisen i øre.

--
Christian Jørgensen
http://www.razor.dk


Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste