Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Laskutoimitus taulukosta

Sivun loppuun

masiaro [02.10.2012 19:00:07]

#

Moi,

Olen kauan yrittänyt keksiä miten tehdä laskutoimituksen, joka tarkastelee txt-taulukosta joka 4 ja 5 kohdasta ja tekee loppusumman silloin kun taulukkoa näytetään sivulla. Saatu laskusumma ei siis tarvitse tallentaa tuohon taulukkoon. Onko mitään kätevää ja simppeli skripti joka laskee nuo taulukossa olevat luvut?

1349112455|3.9.2012|Helsinki||2,70e|2,70e||||
1349112487|4.9.2012|Helsinki||2,70e|2,70e||||
1349112503|5.12.2012|Vantaa||4,50e|4,50e||||
1349112522|6.9.2012|Helsinki||2,70e|2,70e||||

Grez [02.10.2012 19:14:08]

#

Summa tarkoittaa yhteenlaskua. Eli teet muuttujan, jonka alustat nollaksi. Kunkin rivin kohdalla lisäät sen luvun ko. muuttujaan (useimmissa kielissä lisääminen tapahtuu + operaattorilla). Lopussa muuttujassa on kaipaamasi summa.

masiaro [02.10.2012 19:21:58]

#

Grez kirjoitti:

Summa tarkoittaa yhteenlaskua. Eli teet muuttujan, jonka alustat nollaksi. Kunkin rivin kohdalla lisäät sen luvun ko. muuttujaan (useimmissa kielissä lisääminen tapahtuu + operaattorilla). Lopussa muuttujassa on kaipaamasi summa.

Kiitos, löytyisikö ohjeita tähän mistään? Taitoni alkaa olemaan kovassa ruosteessa kun en ole moneen vuoteen koodaanut mitään.

Grez [02.10.2012 19:24:40]

#

No riippuu hirveästi kielestä millä olet tekemässä. Esimerkiksi PHP:ssä muuttujan voisi määrittää ja alustaa nollaksi seuraavasti:

$summa = 0;

Myöskin järkevän käytännön ohjeen antaminen rivillä olen luvun lisäämisestä edellyttäisi, että tietäisi miten käsittelet niitä rivejä tällä hetkellä. Mutta jos nyt vaikka tekisit PHP:llä lisättävä luku olisi muuttujassa $row['luku'] niin lisääminen onnistuisi koodilla

$summa += $row['luku'];

masiaro [02.10.2012 19:38:43]

#

Nyt tässä edistyy jotain, mutta loppusumma on täysin väärä.

Koodina seuraavasti:

for ($i = 0; $i < $viestimaara; $i++) {
   $tiedot = explode("|", $viestit[$i], 11);

$summa = 0;
$summa += $tiedot['10'];
echo $summa;

}

Php tulosti summaksi 00000000000000000014184496.5936.47.47.42

Txt-taulukossa näkyy tältä (pitää laskea siis viimeisin kohta (10).

349194421|16.2.2012|Helsinki|Laskutesti|2,70e|2,70e|||10e||14
1349194481|laskutesti|Ei valittu||Ei valittu|Ei valittu|10|5|3||18
1349194503||Ei valittu||2,70e|2,70e|||||4
1349194546||Ei valittu||2,70|2,70|||||4
1349194555||Ei valittu||4.50|4.50|||||9
1349194971||Ei valittu||2.70|4.50|||||6.5
1349195000||Ei valittu||4.50|4.50|||||9
1349195124||Ei valittu||2.70|2.70|11|10|10||36.4
1349195142||Ei valittu||2.70|2.70|1.10|1.00|||7.4
1349195248||Ei valittu||2.70|2.70|1.10|1.10|||7.4
1349195265||Ei valittu||Ei vlitt|Ei vlitt|1.11|1.12|||2

Huomasin muuten äsken, ettei yhteenlasku ole oikein tossa 10.rivissä, summan pitäisi olla 7,60e mutta php laski sen 7,40euroksi..?

Grez [02.10.2012 19:49:04]

#

Alusta se nollaksi ennen looppia ja tulosta tulos vasta loopin jälkeen

Jos jokaisella rivillä laitat muuttujan arvoksi nolla ja lisäät siihen ko. rivin arvon niin silloinhan se muuttuja on sama kuin rivin arvo ja kun vielä tulostat sen jokaisella rivillä, niin jokaisen rivin arvo tulostuu.

masiaro [02.10.2012 19:54:52]

#

Grez kirjoitti:

Alusta se nollaksi ennen looppia ja tulosta tulos vasta loopin jälkeen

Jos jokaisella rivillä laitat muuttujan arvoksi nolla ja lisäät siihen ko. rivin arvon niin silloinhan se muuttuja on sama kuin rivin arvo ja kun vielä tulostat sen jokaisella rivillä, niin jokaisen rivin arvo tulostuu.

Niin pitääkin, laitoin ne ennen ja jälkeen loopia, ja tulos tuli. Kiitos paljon. Onko PHP:n laskutoimitus niin luotettava? Outoa kun 2,70+2,70+1,10+1,10e tuli summaksi 7.40e. Koodi näyttää täältä

$tulos = $_POST['matka1'] + $_POST['matka2'] + $_POST['matka3'] + $_POST['matka4'] + $_POST['muitakuluja'];

tneva82 [02.10.2012 19:57:42]

#

Kokeiles vaikka tulostaa post muuttujien arvot ja katsoa onko siellä jotain outoa.

Grez [02.10.2012 20:02:33]

#

Joo, print_r($_POST); olisi kova juttu. Varmaan toi muitakuluja on -0.2

masiaro [02.10.2012 20:03:00]

#

tneva82 kirjoitti:

Kokeiles vaikka tulostaa post muuttujien arvot ja katsoa onko siellä jotain outoa.

Tulostuksessa ennen laskua summat näyttävät oikealta, virhe on siis tapahtunut laskuvaiheessa.

Grez [02.10.2012 20:03:58]

#

Vika tuskin on laskuvaiheessa, mutta arvojen muutto numeroiksi voi kusta tms. Edelleen jos viitsit laittaa tuon print_r($_POST) ennen tuota riviä ja kopioida tulosteen sellaisenaan niin voimme kertoa missä vika on.

masiaro [02.10.2012 20:08:13]

#

Grez kirjoitti:

masiaro kirjoitti:

virhe on siis tapahtunut koodausvaiheessa

Korjasin uskottavammaksi

Heh, tottakai koodissa pitää olla jotain vikana. Koodi näyttää tältä. Äsken siis kokeilin poistaa $_POST koska sitä on kerran tehty, eipä auttanyt. Nyt näyttää 6.50e, eli jompikumpi 1,10e on jäänyt laskematta.

   $tiedosto = fopen("data/$tunnus-$kuukausi.txt", "a") or exit("Tietokantaan ei saatu yhteyttä");

   //haetaan lomakkeen kautta tulleet muuttujat
   $paiva = $_POST['paiva'];
   $paikka = $_POST['paikka'];
   $muupaikka = $_POST['muupaikka'];
   $matka1 = $_POST['matka1'];
   $matka2 = $_POST['matka2'];
   $matka3 = $_POST['matka3'];
   $matka4 = $_POST['matka4'];
   $muitakuluja = $_POST['muitakuluja'];
   $selitys = $_POST['selitys'];

	$search = array(',', 'e', 'u', 'r', 'o', 'a', '€');
	$replace = array('.', '', '', '', '', '', '');

	$matka1 = str_replace($search, $replace, $matka1);
	$matka2 = str_replace($search, $replace, $matka2);
	$matka3 = str_replace($search, $replace, $matka3);
	$matka4 = str_replace($search, $replace, $matka4);
	$muitakuluja = str_replace($search, $replace, $muitakuluja);

	$tulos = $matka1 + $matka2 + $matka3 + matka4 + muitakuluja;


   //poistetaan ylimääräiset kenoviivat (\)
   $viesti = stripslashes($viesti);
   //estetään HTML-tagien käyttäminen
   $viesti = htmlspecialchars($viesti);

   $nimi = str_replace("|", "I", $nimi);
   $email = str_replace("|", "I", $email);
   //muutetaan rivinvaihdot HTML-muotoon
   $viesti = str_replace("\n", "<br>", $viesti);

   //otetaan talteen aika, jolloin viesti lähetettiin
   $aika = time();

   //muodostetaan tiedostoon tallennettava rivi
   $rivi = "$aika|$paiva|$paikka|$muupaikka|$matka1|$matka2|$matka3|$matka4|$muitakuluja|$selitys|$tulos\n";

   //kirjoitetaan rivi tiedostoon
   fwrite($tiedosto, $rivi);

   //suljetaan tiedosto
   fclose($tiedosto);

   header("Location: matkakorvaus.php");

Grez [02.10.2012 20:14:22]

#

masiaro kirjoitti:

Heh, tottakai koodissa pitää olla jotain vikana.

$tulos = $matka1 + $matka2 + $matka3 + matka4 + muitakuluja;

Tuosta puuttuu pari $ -merkkiä. Huomaatko mistä kohdista?

Ei siis millään pahalla, mutta on melkoisesti todennäköisempää että koodissa tai syöttöarvoissa olisi vikaa, kuin että PHP laskisi noin paljon väärin. (Pyöristysvirheitä voi toki tulla jossain 10. desimaalin paikkeilla)

masiaro [02.10.2012 20:22:18]

#

Grez kirjoitti:

masiaro kirjoitti:

Heh, tottakai koodissa pitää olla jotain vikana.

$tulos = $matka1 + $matka2 + $matka3 + matka4 + muitakuluja;

Tuosta puuttuu pari $ -merkkiä. Huomaatko mistä kohdista?

Ei siis millään pahalla, mutta on melkoisesti todennäköisempää että koodissa tai syöttöarvoissa olisi vikaa, kuin että PHP laskisi noin paljon väärin. (Pyöristysvirheitä voi toki tulla jossain 10. desimaalin paikkeilla)

Hassua etenkin tällä koodi oli kohdallaan, silti lasku oli väärä:

$tulos = $_POST['matka1'] + $_POST['matka2'] + $_POST['matka3'] + $_POST['matka4'] + $_POST['muitakuluja'];

Ja kun poistin POST:t, multa jäi huomaamatta että poistin myös $:t. Nyt summa näyttää oikealta, 7,60e kuten pitääkin. Eli ensimmäisessä POST-koodissa antoi vääriä arvoja?

Grez [02.10.2012 20:24:05]

#

Niin, olisko esim. matka3 ja matka4 arvot olleet 1,1 (eikä 1.1) jolloin PHP ei olisi ymmärtänyt niitä oikein. Ei voi koskaan tietää kun et laittanut sitä print_r($_POST) tulostetta kuten pyysin.

masiaro [02.10.2012 20:37:46]

#

Grez kirjoitti:

Niin, olisko esim. matka3 ja matka4 arvot olleet 1,1 (eikä 1.1) jolloin PHP ei olisi ymmärtänyt niitä oikein. Ei voi koskaan tietää kun et laittanut sitä print_r($_POST) tulostetta kuten pyysin.

Kuten tässä rivissä näkyy selvästi, millaista tietoa lomakkeesta saatiin. Siinä oli piste, eikä pilkku.

1349195248||Ei valittu||2.70|2.70|1.10|1.10|||7.4

Muuten kiitoksia paljon, homma pääsi eteenpäin.

Grez [02.10.2012 20:47:37]

#

Niin ja edellenkään
1) tuo ei ole print_r($_POST) tuloste.
2) tuolla laittamallasi rivillä $_POST -arvot eivät ole käsittelemättömässä muodossaan
3) Koodissasi (jolla sen todennäköisesti tulostit) korvaat pilkut pisteellä.

Eli edellisessä viestissäni antamani selitys asialle on edelleen kaiken kertomasi tiedon valossa se todennäköisin selitys.

Kaiken kaikkiaan pointti oli se, että jos laittaisit suoraan syötteen sellaisena kuin se on ja koodin joka tuottaa virheellisen tuloksen, niin pystyisimme useimmissa tapauksissa kertomaan suoraan mikä vika on ja miten se korjataan. Näin ei tarvitsisi hieroa montaa viestiä yksinkertaista asiaa ja kaivaa tietoja kuin hammaslääkärissä hammasta.

dartvaneri [02.10.2012 23:50:02]

#

masiaro kirjoitti:

Kuten tässä rivissä näkyy selvästi, millaista tietoa lomakkeesta saatiin. Siinä oli piste, eikä pilkku.

1349195248||Ei valittu||2.70|2.70|1.10|1.10|||7.4

Muuten kiitoksia paljon, homma pääsi eteenpäin.

Kuten Grez jo sanoikin vika oli joko lomake päässä tai tiedon syöttäjän päässä, taikka molemmisa, sillä toi koodi, minkä pastetit tuossa aluksi toimi mulla ihan täysin, ongelmitta(toki laitoin ne muutamat dollarit sinne) vaikka laittoi lomakkeissa pilkut pisteiden sijaan.

Ja muuten kannattanee käyttää tuon vanhan fopen funktion sijaan file_put_contents()-functiota. Esimerkki Putkan oppaassa

file_put_contents("rivit.txt", $rivit, FILE_APPEND);

Edit.
Tässä olisi tällänen pikkunen vinkki(Taikasana funktio):

<?php
	//Kannattanee käyttää funktiota, jos pitää useasti tehdä sama asia.
	function parse($data){
		$data = str_replace(",", ".", $data);
		return preg_replace("/[^0-9.]/", "", $data);
	}

	$matka1 = parse($_POST['matka1']);
	$matka2 = parse($_POST['matka2']);
	$matka3 = parse($_POST['matka3']);
	$matka4 = parse($_POST['matka4']);
	$muitakuluja = parse($_POST['muitakuluja']);

	$tulos = $matka1 + $matka2 + $matka3 + $matka4 + $muitakuluja;

?>

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta