Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Viitenumero

Sivun loppuun

Vasta_alkaja [29.05.2008 05:06:15]

#

Viitenumeron laskemiseen köysin koodivinkeistä tämmöisen esimerkin

<?php
$yks = Array(7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7);
$viite = "12345";
$viite = str_repeat("0", 19 - strlen($viite)) .$viite;
for ($i = 0; $i < 19; $i++) {
    $temp[$i] = substr($viite, $i, 1) * $yks[$i];
}
for ($i = 0; $i < 19; $i++) {
    $temp2 = $temp2 + $temp[$i];
}
$tarkistus = 10 - substr($temp2, -1);
if ($tarkistus = 10) {$tarkistus = 0;}
print "Tarkistusnumero: " .$tarkistus;
?>

Haluaisin kuitenkin tietää, millä perusteella viitenumero luodaan sekä sen, että millä logiikalla tarkistusnumero toteutetaan.

Saako viitteessä olla ihan mitä vain tuohon 19 numeoroon asti. Vaikkapa esim laskun summa + laskutuspäivä + tarkistusnumero ?

Kiitoksia etukäteen vaivaa nähneille. Ja muillekkin :)

ajv [29.05.2008 08:24:55]

#

Vasta_alkaja kirjoitti:

Saako viitteessä olla ihan mitä vain tuohon 19 numeoroon asti. Vaikkapa esim laskun summa + laskutuspäivä + tarkistusnumero ?

Saa olla. Mieti kuitenkin tarvitseeko sinun kuljettaa tuollaista määrää tietoa viitenumerossa. Käyttäjän, eli laskun maksajan kannalta se 4 numeroa (minimi) on kivempi kuin 20. Jos ei haittaa, että asiakas pystyy päättelemään laskujen määrän, 100 + laskun juokseva id-numero toimii yksinkertaisimmillaan.

Vasta_alkaja [29.05.2008 15:07:41]

#

Tuo on kyllä paras vaihtoehto. Ei sen viitenumeron mikään armoton numerojono tarvitse olla. Kaikkien kannalta yksinkertaisempaa.

Vasta_alkaja [04.06.2008 14:10:35]

#

Hei,

voisiko joku selventää minulle miksi juuri tuolla logiikalla luodaan viitenmuro.

Miksi on esim.

$yks = Array(7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7);

koo [04.06.2008 17:25:38]

#

Niin tai siis se juju on lisätä tarkistusmerkki jostakin keksittyyn numerosarjaan.

Tarkistusnumeron tarkoitus on auttaa varmistamaan, että numero on syötetty oikein. Yksinkertainen tapa voisi olla vaikka, että lasketaan numerosarjan kaikki numerot yhteen ja otetaan summasta kymmenen jakojäännös. Tämä simppeli tapa auttaa jo useimmiten havaitsemaan, jos yksittäinen numero on näppäilty väärin. Tällä tavalla ei kuitenkaan yleensä havaita, jos numerot ovat vaihtaneet paikkaansa.

Antamalla numerosarjan numeroille erilaiset painokertoimet - vaikka 1, 2, 1, 2, ... - peräkkäisten numeroiden vaihtuminen on yleensä mahdollista huomata.

En tiedä, miten viitenumeroissa on päädytty tuohon 137-sarjaan. Tärkeää siinä on, että peräkkäisillä numeroilla on eri kertoimet ja mieluusti niin, etteivät ne olisi jaollisia toistensa ja kymmenen kanssa, mutta muutoin ne lienee saatu numeromagialla.

Laskentakaavan pitää olla aika yksinkertainen, jotta se on riittävän helppo toteuttaa. Ei siinä kovin korkealentoista matematiikkaa kannata muutenkaan soveltaa, sillä jos tarkiste on yhden numeron mittainen, satunnainen apinakin saa joka kymmenennen numerosarjansa tarkastuksesta joka tapauksessa läpi.

Kuinka ollakaan, intternetistä löytyy aikas hyvät sivut tarkistusmerkkien laskentamenetelmistä, rispektiä niiden ylläpitäjälle.

Vasta_alkaja [06.06.2008 15:43:00]

#

Hei,

Alla olevaa esimerkkiä olen käyttänyt luodessani viitenumeron. Tämä esimerkki ei kuitenkaan mielestäni toimi oikein. Tämä palauttaa minulle aina tuloksen 0.

<?php
$yks = Array(7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7);
$viite = "12345";
$viite = str_repeat("0", 19 - strlen($viite)) .$viite;
for ($i = 0; $i < 19; $i++) {
    $temp[$i] = substr($viite, $i, 1) * $yks[$i];
}
for ($i = 0; $i < 19; $i++) {
    $temp2 = $temp2 + $temp[$i];
}
$tarkistus = 10 - substr($temp2, -1);
if ($tarkistus = 10) {$tarkistus = 0;}
print "Tarkistusnumero: " .$tarkistus;
?>

TsaTsaTsaa [06.06.2008 16:09:31]

#

Jos php:ssä pätee samat näkyvyysaluesäännöt (kuten epäilen) kun C++:ssa, niin ensimmäisessä for-loopissa oleva $temp-taulukko tuhotaan silmukan jälkeen ja toisessa luodaan uusi, eli se pitää luoda tyhjänä jo ennen silmukoita.

Lebe80 [06.06.2008 16:22:00]

#

Vasta_alkaja kirjoitti:

Alla olevaa esimerkkiä olen käyttänyt luodessani viitenumeron. Tämä esimerkki ei kuitenkaan mielestäni toimi oikein. Tämä palauttaa minulle aina tuloksen 0.

Jos tulee väärä tulos, niin paras tapa sen selvittämiseen ennen avun pyytämistä on laittaa kaikkiin mahdollisiin paikkoihin tulostusta muuttujien arvoista, jolloin näet, missä kohtaa rupeaa menemään vikaan.

Eli ennen ja jälkeen for -lauseita vaan echoa, samoin for-lauseiden sisään. yms. yms. yms.

Vasta_alkaja [06.06.2008 19:36:29]

#

function viitenumero($laskunro){
    if(strlen($laskunro) > 19) return 0;
    $kertoimet = array('7','3','1','7', '3','1','7','3','1','7','3','1','7','3','1','7','3','1','7');
    $tarkiste = 0;
    $j = 0;
    $tmp = $laskunro;
    settype($tmp, "string");
    for($i=strlen($tmp)-1; $i>-1; $i--){
        $tarkiste = $tarkiste + $kertoimet[$j++] * intval(substr($tmp, $i, 1));
     }
     $tarkiste = ceil($tarkiste / 10) * 10 - $tarkiste;
     $viite = "$laskunro$tarkiste";
    return $viite;

}

Sain toimimaan sekä löysin myös hieman karsitumman version.

ajv [06.06.2008 21:09:03]

#

Tässä vielä itselläni käytössä ollut versio, en muista enää mistä kopiotu.

<?php
function viitenumero($orderid) {
  $orderid = strval($orderid);
  $paino = array(7, 3, 1);
  $summa = 0;
  for($i=strlen($orderid)-1, $j=0; $i>=0; $i--,$j++){
    $summa += (int) $orderid[$i] * (int) $paino[$j%3];
  }
  $tarkiste = (10-($summa%10))%10;
  return $orderid.$tarkiste;
}
?>

Sivun alkuun

Vastaus

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

Tietoa sivustosta