|
| 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 (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 (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
| |
|
|