IBAN Calculatie

Door Rene Geul, 14 jaar geleden, 31.806x bekeken

Naar aanleiding van de opbouwende kritiek van de eerste uitvoering van deze IBAN calculator hier een verbeterde uitvoering.

Voor de duidelijkheid, het is een class die de bedoeling heeft wat functies die men aantreft in het bancaire circuit in een class bij elkaar te laten zien. Het kan zijn dat U het script slecht zal vinden, op zich geen probleem maar zeg dan wat er slecht aan zou zijn.

Een van de redenen dat ik het script ter beschikking stel, is om te kijken of ik als voormalig Cobolkrasser PHP onder de knie begin te krijgen en zit dus niet te wachten op kritiek waar ik niets mee aan kan.

De (verbeterde) IBAN calculator zit er wederom bij, de oude kan verdwijnen.

Omdat dit script bedoeld is voor de situatie in Nederland heb ik dus wat minder Engels gebruikt, verkopen doe ik het niet het is voor mij lering en vermaak.

Wat naamgeving betreft heb ik gekozen voor de underscoremethode.
Dus zoiets als bepaal_11_proef.

Had ik gekozen voor de camelcase structuur dan had eerder genoemde methode dus bepaal11Proef geheten en was de methode generate_select_string voorzien van de naam generateSelectSstring.
etc

De class heet Biciban.php en daar valt wel wat op aan te merken, BankFuncties had ook gekund.
Als toevoeging een script bankfuncties.php geheten wat gebruik maakt van Biciban.php

Nogmaals iedere vorm van kritiek is welkom maar dan wel kritiek waar ik wat mee aankan in mijn proces om PHP te leren.

Met vriendelijke groeten
Rene Geul

Gesponsorde koppelingen

PHP script bestanden

  1. Biciban.php
  2. bankfuncties.php

 

Er zijn 20 reacties op 'Iban calculatie'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Roel -
Roel -
14 jaar geleden
 
0 +1 -1 -1
Even alles tussen [code][/code] tags zetten a.u.b.
Ook is het onnodig om hier een nieuwe versie voor aan te maken. Probeer in het vervolg je huidige script liever aan te passen.
Wouter J
Wouter J
14 jaar geleden
 
0 +1 -0 -1
Roel, en weer ga je de fout in met je reactie...

Ten eerste kan je niet zomaar een script na 7 dagen aanpassen en ten tweede is er door de scriptlib beheerder aangegeven een nieuwe te starten en is er door een moderator nu een linkje doorgestuurd naar deze nieuwe versie. Waarschijnlijk zal er binnenkort die andere weg gaan en er zijn geen problemen meer...
Roel -
Roel -
14 jaar geleden
 
0 +1 -0 -1
Correctie: je kunt je script wel wijzigen, alleen de hoofdpagina niet.
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
Beste Roel,
In het vervolg zal ik, indien nodig het script aanpassen en geen nieuwe opsturen, sorry maar zoals Wouter stelde dat door de scriptlib beheerder aangegeven was een nieuwe te starten.
Ik weet helaas niet wat je probeert te stellen met de
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
tags.
Ik neem aan dat het gaat om een commentgedeelte te scheiden van de code maar kan het mis hebben, ik weet niet wat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
betekent.
Afhankelijk van het antwoord kan ik het op zich goed werkende script script aanpassen en geen nieuw script opsturen en leer ik gelijk hoe ik hier een aangeleverd script kan aanpassen.
En in ieder geval bedankt voor de wel degelijk opbouwende kritiek.
Met vriendelijke groeten
Rene Geul
Kevin van Leeuwen
Kevin van Leeuwen
14 jaar geleden
 
0 +1 -0 -1
Wat me ook opviel is dat je operators vergelijkt in een string. Een integer hoeft niet als string vergeleken worden. Je kan gewoon < 0 of > 9 doen ;)
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
@Kevin
Strikt genomen heeft U gelijk maar de input voor de numeriektest kan wel degelijk een string zijn en indien ik dan 1 positie ga vergelijken met een int zal het ook wel goed gaan maar dan gaat PHP toch over op casting van char naar int en dat wou ik vermijden. Maar strikt genomen heeft U gelijk.

@Roel
Zo te zien ging er wat mis in de vorige opmerking gericht aan U.
de keten code /code tussen vierkante haken geeft geen problemen bij Uw opmerkingen en zodra ik het gebruik gebeurt er iets.
Maar aub licht even toe wat U bedoelt met de opmerking.
In het script zit een lading commentaar en zo hier en daar ook regels met coding en commentaar.
Is het de bedoeling coding van commentaar te scheiden of hoe moet ik het intepreteren, bij voorbaat hartelijk dank.
Rene Geul
Niels K
Niels K
14 jaar geleden
 
0 +1 -0 -1
Beste Roel en anderen,

Het was inderdaad de bedoeling om een nieuw script te starten, zoals ook in de reacties bij het oude script verteld is.

Een klein misverstand dus ;-)

Niels
Niels K
Niels K
14 jaar geleden
 
0 +1 -0 -1
Beste Rene,

Van mijn kant heel even een inhoudelijke reactie.

1: Probeer overzichtelijk te scripten. Maak dus altijd gebruik van dezelfde coding standard. Dat bevorderd de leesbaarheid. Op het ene moment gebruik je een tab en op het andere moment gebruik je één of meerdere spaties. Bekijk ook eens de gangbare standaarden zoals de Zend Coding standards.

2: Ik zie hele lappen met commentaar. Allereerst is er NIETS mis met commentaar, maar in jouw geval wel met de weergave van je commentaar:

- Het commentaar staat een beetje slordig door elkaar heen.
- Er wordt niet heel goed gebruik gemaakt van leestekens, punten en noem maar op.

Tips:

- Maak gebruik van PHPDoc. Het voordeel hiervan is, dat veel mensen je commentaar goed kunnen lezen, en dat je het commentaar (met de applicatie PHPDoc) kunt converteren naar bijvoorbeeld HTML bestanden die je kan gebruiken voor een handleiding of iets dergelijks.
- Probeer je zinnen goed te formulier en max 2 zinnen per regel te definiëren.

3: Waarom zet je bij bijvoorbeeld $input_bic en $input_rek standaard = '' ? Ze zijn standaard al leeg nietwaar?

4: De functie numeriek_test zou ik persoon isNumeriek noemen aan gezien dat makkelijker leest.

5: Het is uit de boze om getallen in een string te zetten. (zie regel 168) Wanneer je een vergelijking wilt maken, moet je dit gewoon als volgt doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($teststring[$loopcount] < 0 || $teststring[$loopcount] > 9)(
      // rest van je code.
}
?>


6: Let op de namen van je variabelen. Ze mogen wel lekker hollands zijn, maar ik vind het niet echt netjes overkomen.

Zie bijvoorbeeld regel 162 t/m 164. Dat kan prima zo herschreven worden. (heb het even naar Engels omgecat, dan zie wat ik bedoel)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php

private function isNumeric($string) {
    // Hier stond eerst 'loopcount' maar die is nergens voor nodig?
    for ($i = 0; $i < strlen($string); $i++) {
        if ($string[$i] < 0 || $string[$i] > 9) {
            $this->isNumeric = false;
        }
    }
}


?>


Scheelt je 1 twee regels, en 2 vind ik dit leesbaarder. Maar goed, het is ook wel een kwestie van persoonlijke voorkeur.

7: Waarvoor dient 177? Kijk eens hoe ik hem hier herschrijf, scheelt een aantal regels.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

public function banknaam($bic) {
    return isset($this->babic[strtoupper($bic)]) ? $this->babic[strtoupper($bic)] : 'onbekend';
}
    

?>


Zo kan ik nog wel even doorgaan, maar ik hoop dat het geland is. Je kan middels mijn tips je klasse zo voor de helft inkorten, en veel leesbaarder maken.

Al met al, is het wel een verbetering met de eerste versie.

Ga zo door!

Niels Kieviet
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
@Roel
Het meeste van de op zich terechte kritiek begrijp ik en zal ik ter harte nemen maar wat nummer 5 betreft wat uitleg.
U zegt "Het is uit de boze om getallen in een string te zetten" maar zodra ik iets via $_POST binnen krijg is dat altijd een string daar HTML zuiver en alleen strings kent.
Het is wel de bedoeling dat er een getal binnenkomt via die functie maar de functie is juist bedoeld om te kijken of de inhoud een getal/int voorstelt. Dus zolang ik een string binnenkrijg en ik niet weet of de sting in wezen een int is behandel ik de string voorzichtig als string. het getal/rekeningnummer zit in een string omdat HTML alleen strings kent.
Wat U opvalt is de kreet $loopcount een wat lange naam ter vervanging van de kreet $lc.
In de vorige uitvoering van de calculator kreeg ik de terechte kritiek dat kreet $lc wat weinig zeggend was maar de door U voorgestelde variable $i is eerlijk even weinig zeggend als de kreet $lc.
Dat mensen last hadden van de wat cryptische code in de eerste uitvoering heeft er toegeleid dat ik alles zo duidelijk mogelijk neerzette.
Daarom is de functie banknaam zo geschreven dat het duidelijk was, gebruik makend van simpele PHP hoewel ik Uw uitvoering goed kan lezen.
In ieder geval bedankt voor de opmerkingen.
met vriendelijk groet
Rene Geul
Wouter J
Wouter J
14 jaar geleden
 
1 +1 -0 -1
Quote:
In de vorige uitvoering van de calculator kreeg ik de terechte kritiek dat kreet $lc wat weinig zeggend was maar de door U voorgestelde variable $i is eerlijk even weinig zeggend als de kreet $lc.

De variabele $i is een variabele die altijd wordt gebruikt bij deze loops. $i staat voor Iteration en wordt al sinds het begin van de scripttalen voor loops gebruikt, het is dus een erkende variabele naam voor dit soort dingen en daarom ook veel beter dan $lc of $loopcount. Vaak wordt er, mocht $i al een keer gebruikt zijn, daarna $j, $k, $x, $y of $z.
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
@Wouter
Bedankt voor de info.
Ter info voor een ieder:
De kreet lc ben ik vaak tegengekomen op mainframes en in die context dus een erkende variabele naam voor loops.
Op deze manier weert wat geleerd.
In het script heb ik omdat men stelde dat de propperties voor de methodes moesten komen dan ook in de methodes de propperties van de methodes eerst maar gedeclareerd.
Is dat de bedoeling?
Jeroen VD
Jeroen VD
14 jaar geleden
 
0 +1 -0 -1
php is geen mainframe rene, dus er gelden ook andere gebruiken.

dat je variabelen binnen die methods eerst declareerd is wel een goed gebruik, maar kijk uit dat je dan geen variabelen gaat kopiëren. wanneer een variabele wordt meegegeven hoef je die natuurlijk niet nog eens apart te definiëren.
Niels K
Niels K
14 jaar geleden
 
1 +1 -0 -1
Beste Rene,

Ik heb je versie wat ingekort, en geprobeerd alles wat beter leesbaarder te maken.

Er zullen vast wat syntax fout zijn, en vast wat dingen beter kunnen, maar daarvoor is het Koninginnedag :-)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php

class IBANCalculator {

    protected $banks = array();
    protected $isNumeric;
    protected $bic;
    protected $accountNumber;
    protected $iban;
    
    public function getBankName($bic) {
        return isset($this->banks[uppercase($bic)]) ? $this->banks[uppercase($bic)] : 'onbekend';
    }

    
    public function is11Proof($accountNumber) {
        if (false === $this->isNumeric) {
            return false;
        }

        
        $total = 0;
        $factor = 0;
        
        for ($i = 0; $i < strlen($accountNumber[$i]); $i++) {
            $total = $total + ($accountNumber[$i] * $factor);
            $factor = $factor - 1;
        }

        
        return $total % 11 === 0 ? true : false;
    }

    
    public function getSelectbox() {
        asort($this->banks);
        $selectbox = '<select name="banksel">';
        foreach ($this->banks as $bic => $bank) {
            $selectbox .= '<option ' .(isset($_POST['banksel'] && $_POST['banksel'] == $bic) ? 'selected="selected"' : ''. '>' .$bank. '</option>';
        }

        $selectbox .= '</select>';
        return $selectbox;
    }

    
    public function invoerIban($bic, $accountNumber) {
        $bic = trim($bic);
        $this->bic = htmlspecialchars(strtoupper($bic));
        
        $accountNumber = trim($accountNumber);
        $this->accountNumber = htmlspecialchars($accountNumber);
        
        $this->validate();
        
        return $this->iban;
    }

    
    protected function calculate() {
        $iban = $this->getTurnover($this->bic) . $this->accountNumber . '232100';
        $checksum = 00;
        
        $modulo = (int)substr($iban, 0, 6) % 97;
        $modulo = (1000000 * $modulo) + (int) substr($iban, 6, 6) % 97;
        $modulo = (1000000 * $modulo) + (int) substr($iban, 12, 6) % 97;
        $modulo = (1000000 * $modulo) + (int) substr($iban, 18, 6) % 97;
        
        $checksum = 98 - $modulo;
        
        if (strlen($checksum) < 2) {
            $checksum = 0 . $checksum;
        }

        
        $this->iban = 'NL' . $checksum . substr($this->bic, 0, 4) . $this->accountNumber;
    }

    
    protected function validate() {
        $error = null;
        if (strlen($this->accountNumber) > 0) {
            if (false === $this->isNumeric($this->accountNumber)) {
                $error = '.....';
            }

            if (null === $error && strlen($this->accountNumber) > 10) {
                $error = '.....';
            }
        }

        if (null === $error && !isset($this->banks[$this->bic])) {
            $error = '....';
        }
        
        if (null !== $error) {
            $this->iban = $error;
        }

        else {
            while (strlen($this->accountNumber) < 10) {
                $this->accountNumber = 0 . $this->accountNumber;
            }

            $this->calculate();
        }
    }

    
    protected function getTurnover($input) {
        return ord($input[0]) - ord('A') + 10 . ord($input[1]) - ord('A') + 10 .ord($input[2]) - ord('A') + 10 .ord($input[3]) - ord('A') + 10;
    }

    
    protected function isNumeric($input) {
        for ($i = 0; $i < strlen($input); $i++) {
            if ($input[$i] < 0 || $input[$i] > 9) {
                $this->isNumeric = false;
            }
        }
    }
}


?>


Ik hoop dat je mijn punt begrijpt. Je kan het best op deze versie verder bouwen en netjes PHPDoc om de functies zetten.

Wanneer je dat gedaan hebt, wordt het al stukken beter.
Wanneer je zelf je code goed kunt lezen betekend het niet dat andere mensen dat ook kunnen ;-) Consistentie is in de programmeerwereld een zeer belangrijk woord!

Wanneer deze punten goed doorgevoerd zijn kunnen we gaan kijken naar de opbouw van de class want daar heb ik ook nog wat opmerkingen over.

Daarna is het een mooie toevoeging aan de library ;-)

Met vriendelijke groet,

Niels Kieviet
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
Beste Niels,
Ik loop de source na inclusief aanbevelingen.
Dit zal niet makkelijk gaan omdat ik de localhost niet kan gebruiken.
Op dit moment heb ik Zend Framework op de machine gezet en gaat het uitvoeren via de localhost mis omdat Framework er zich mee gaat bemoeien.
Kwestie van de Vhost etc even uit de Apachesettings halen en dan Uw input oppakken en implementeren.
Mvg
Rene Geul
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
Beste Niels
Je coding opgepakt en nog 1 functie erbij die kijkt of iets een Iban is of niet.
De coding komt er nu aan
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
<?php
/*Bank Identification Code (BIC) moet altijd en waar dan ook in uppercase
 *In de International Bank Account Number(IBAN) zit de BIC verwerkt dus de IBAN moet ook altijd in uppercase
 */

class IbanCalculator {
    protected $banks = array(
                    /*    BIC      =>  Banknaam  */
                         'ABNANL'  => 'Abn Amro' ,
                         'AEGONL'  => 'Aegon bank' ,
                         'CEBUNL'  => 'C & E Bankiers' ,
                         'CITINL'  => 'Citybank International' ,
                         'FVLBNL'  => 'F. van Lanschot Bankiers' ,
                         'FRBKNL'  => 'Friesland bank' ,
                         'INGBNL'  => 'Ing bank' ,
                         'RABONL'  => 'Rabobank' ,
                         'SNSBNL'  => 'Sns en Asn bank',
                         'RBOSNL'  => 'Royal bank of Scotland',
                         'AHBKNL'  => 'Achmea Hypotheek bank',
                         'ARBNNL'  => 'Achmea Retail bank',
                         'AENVNL'  => 'Aegon NV',
                         'AKBKNL'  => 'Akbank',
                         'AMSCNL'  => 'Amstel Securities',
                         'STOLNL'  => 'Amsterdam Trade bank',
                         'ANDLNL'  => 'Anadolubank Nederland',
                         'ABPTNL'  => 'Apg Algemene Pensioen Groep',
                         'ARAMNL'  => 'Aramco Overseas Company',
                         'AZLHNL'  => 'Azl',
                         'INSINL'  => 'Bank Insinger de Beaufort',
                         'BKMGNL'  => 'Bank Mendes Gans',
                         'BOFANL'  => 'Bank of America',
                         'BKCHNL'  => 'Bank of China',
                         'BOTKNL'  => 'Bank of Tokyo-Mitsubishi UFJ',
                         'BICKNL'  => 'Binck bank',
                         'BNPANL'  => 'Bnp Paribas',
                         'CGGVNL'  => 'Cggveritas Services Holding',
                         'CITCNL'  => 'Citco bank',
                         'COBANL'  => 'Commertz bank AG',
                         'FBHLNL'  => 'Credit Europe bank',
                         'DAIXNL'  => 'Daimler International Finance',
                         'DLIMNL'  => 'Delta Lloyd Asset Management',
                         'DLBKNL'  => 'Delta Lloyd bank',
                         'DHBNNL'  => 'Demir-Halk bank',
                         'DEUTNL'  => 'Deutsche bank',
                         'DSSBNL'  => 'Dsb bank',
                         'MIFINL'  => 'Dutch Ministry of Finance',
                         'DSTANL'  => 'Dutch State Treasury Agency',
                         'TEBUNL'  => 'Economy bank',
                         'EMCFNL'  => 'Emcf',
                         'INNDNL'  => 'Equens',
                         'EQUINL'  => 'Equity Trust Co',
                         'NECINL'  => 'Euroclear Nederland',
                         'UGBINL'  => 'Garantibank International',
                         'ARTENL'  => 'Ge Artesia bank',
                         'HABBNL'  => 'Habib bank',
                         'HBUANL'  => 'Hollandsche Bank Unie',
                         'HSBCNL'  => 'HSBC bank',
                         'BBRUNL'  => 'Ing Belgium NV/SA',
                         'INGINL'  => 'Ing Investment Management',
                         'BCITNL'  => 'Intensa Sanpaolo S.P.A.',
                         'ISBKNL'  => 'Isbank GMBH',
                         'CHASNL'  => 'JpMorgan Chase bank',
                         'KASANL'  => 'Kas bank',
                         'KREDNL'  => 'Kbc bank',
                         'KBCLNL'  => 'Kbc Clearing',
                         'KEMPNL'  => 'Kempen and Co',
                         'KECANL'  => 'Kempen Capital Management',
                         'JBBRNL'  => 'Kepler Equities',
                         'KPNCNL'  => 'Koninklijke KPN',
                         'KOEXNL'  => 'Korea Exchange bank',
                         'LPLNNL'  => 'Leaseplan Corporation',
                         'OVBNNL'  => 'Levob bank',
                         'LOYDNL'  => 'Lloyds TSB bank',
                         'LOCYNL'  => 'Lombard Odier Darier Hentsch en Cie',
                         'TWIXNL'  => 'Mars Nederland',
                         'ICBCNL'  => 'Mega International Commercial bank',
                         'MHCBNL'  => 'Mizuho Corporate bank',
                         'MNSNNL'  => 'Mn Services NV',
                         'AMTSNL'  => 'Mts Amsterdam',
                         'BOUNNL'  => 'N.V. Bank Voor de Bouwnijverheid',
                         'NTCONL'  => 'Nachenius Tjeenk and Co',
                         'ESESNL'  => 'Nederlands Centraal Instituut Voor Giraal Effectenverkeer',
                         'FLORNL'  => 'Nederlandsche bank',
                         'NFMONL'  => 'Nederlandse Financierings-maatschappij voor ontwikkelingslanden',
                         'NWABNL'  => 'Nederlandse Waterschapsbank',
                         'DNIBNL'  => 'Nibc bank',
                         'BNGHNL'  => 'Bank Nederlandse Gemeenten',
                         'SBNLNL'  => 'Settlement bank of the Netherlands',
                         'PGGMNL'  => 'Pggm',
                         'BVHLNL'  => 'Rbc Dexia Investor Services',
                         'RGVMNL'  => 'Robeco Institutional Asset Management',
                         'RGRBNL'  => 'Robeco Institutional Asset Management Funds',
                         'ROCHNL'  => 'Roche Pharmholding',
                         'SFBVNL'  => 'Schlumberger Finance',
                         'SCRTNL'  => 'Schretlen en Co',
                         'SNSINL'  => 'Sns asset management',
                         'SOVENL'  => 'Sociale Verzekeringsbank',
                         'SOGENL'  => 'Societe Generale',
                         'STALNL'  => 'Staal bankiers',
                         'SCBLNL'  => 'Standard Chartered Latin America',
                         'SHELNL'  => 'Stichting Shell pensioenfonds',
                         'HANDNL'  => 'Svenska Handelsbanken',
                         'SWHQNL'  => 'Swift Customer Service Centre',
                         'SYAVNL'  => 'Syntrus Achmea asset management',
                         'TDOMNL'  => 'Td Waterhouse bank',
                         'GILLNL'  => 'Theodoor Gilissen bankiers',
                         'TRIONL'  => 'Triodus bank',
                         'BFOFNL'  => 'Unilever Finance International',
                         'AMSTNL'  => 'Westlandutrecht effectenbank',
                         'KABANL'  => 'Yapi KREDI bank');
    protected $isNumeric;
    protected $bic;
    protected $accountNumber;
    protected $iban;
    
    /*  input   : een BIC
    *   returns : de naam van de bank of 'onbekend'
    */

    public function getBankName($bic) {
        return isset($this->banks[strtoupper($bic)]) ? $this->banks[strtoupper($bic)] : 'onbekend';
    }


    /* input   : een rekeningnummer
    *  returns : true of false afhankelijk of rekeningnummer voldoet aan de 11-proef
    */

    public function is11Proof($accountNumber) {
        if (false === $this->isNumeric($accountNumber)) {
            return false;
        }

        $total = 0;
        $factor = strlen($accountNumber);
        
        for ($i = 0; $i < strlen($accountNumber); $i++) {
            $total = $total + ($accountNumber[$i] * $factor);
            $factor = $factor - 1;
        }

        return $total % 11 === 0 ? true : false;
    }

    
    /*  input   : niets
    *   returns : een string die een select van alle banken met IBAN als value bevat
    */

    public function getSelectbox() {
        asort($this->banks);
        $selectbox = '<select name="banksel" id="banksel">';
        foreach ($this->banks as $bic => $bank) {
            $selectbox .= "\n" . '<option value="' . $bic . '"' .
            (((
isset($_POST['banksel'])) && ($_POST['banksel'] == $bic)) ? ' selected="selected"' : '') .
            '>' .$bank. '</option>';
        }

        $selectbox .= "\n" . '</select>' . "\n";
        return $selectbox;
    }

    /*  input   :De BIC van de bank en een rekeningnummer
    *   returns :De IBAN of een foutmelding, foutmelding begint met een "!"
    */
  
    public function invoerIban($bic, $accountNumber) {
        $this->bic = htmlspecialchars(strtoupper(trim($bic)));
        $accountNumber = trim($accountNumber);
        $this->accountNumber = htmlspecialchars($accountNumber);
        $this->validate();
        return $this->iban;
    }

    
    /*  input   :De te testen Iban die uiteraard een bekende BIC moet bevatten etc
    *   returns :true als het een Iban betreft anders false
    *   De IBAN wordt hier automatisch naar uppercase gezet daar de IBAN ook de BIC bevat
    */

    public function isIban($inputIban) {
        $iban = htmlspecialchars(strtoupper(trim($inputIban)));
        if (strlen($iban) != 18) {
            return false;
        }

        return $this->invoerIban(substr($iban,4,4) . substr($iban,0,2) , substr($iban,8,10)) == $iban ? true : false;
   }

 
    protected function calculate() {
        $iban = $this->getTurnover($this->bic) . $this->accountNumber . '232100';
        $checksum = '';
        $modulo = ((int)substr($iban, 0, 6)) % 97;
        $modulo = ((1000000 * $modulo) + (int) substr($iban,  6, 6)) % 97;
        $modulo = ((1000000 * $modulo) + (int) substr($iban, 12, 6)) % 97;
        $modulo = ((1000000 * $modulo) + (int) substr($iban, 18, 6)) % 97;
        $checksum = (string)98 - $modulo;
        if (strlen($checksum) < 2) {
            $checksum = '0' . $checksum;
        }

        $this->iban = 'NL' . $checksum . substr($this->bic, 0, 4) . $this->accountNumber;
    }

    
    protected function validate() {
        $error = null;
        if (strlen($this->accountNumber) > 0) {
            if (false === $this->isNumeric($this->accountNumber)) {
                $error = '!rekeningnummer niet numeriek';
            }

            if (null === $error && strlen($this->accountNumber) > 10) {
                $error = '!rekeningnummer is groter dan 10 posities';
            }
        }

        if (strlen($this->accountNumber) == 0) {
        $error = '!rekeningnummer invullen aub';
        }

        if (null === $error && !isset($this->banks[$this->bic])) {
            $error = '!BIC is onbekend';
        }
        
        if (null !== $error) {
            $this->iban = $error;
        }

        else {
            while (strlen($this->accountNumber) < 10) {
                $this->accountNumber = 0 . $this->accountNumber;
            }

            $this->calculate();
        }
    }

    
    protected function getTurnover($input) {
        return ord($input[0]) - ord('A') + 10 . ord($input[1]) - ord('A') + 10 .ord($input[2]) - ord('A') + 10 .
    ord($input[3]) - ord('A') + 10;
    }

    
    protected function isNumeric($input) {
        $this->isNumeric = true;
        for ($i = 0; $i < strlen($input); $i++) {
            if ($input[$i] < 0 || $input[$i] > 9) {
                $this->isNumeric = false;
            }
        }
    }
}

?>


en verder een voorbeeldscriptje dat gebruik maakt van de coding
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
include 'IbanCalculator';
$bankfunctions = new IbanCalculator();
$reknr = '';
$iban  = '';
if (isset($_POST['Reknr'])) {
  $reknr = $_POST['Reknr'];
  $iban = $bankfunctions->invoerIban($_POST['banksel'] , $_POST['Reknr']);
}

?>

<!DOCTYPE html>
<html>
<head>
<title>Bankfuncties</title>
<style type="text/css">body{background-color:#ffffcc;}</style>
</head>
<body>
<div>
<h1>bankfuncties/iban/11 proef/BIC</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>"  method="post">
Rekeningnummer: <input type="text" name="Reknr" id="Reknr" maxlength="10"
value ="<?php echo $reknr;?>"/>
<?php echo $bankfunctions->getSelectbox(); ?>
<input type="submit" <?php echo "value=\"Bereken\nIban\"";?>/>
</form>
<br/>
<?php
if (substr($iban,0,1) == '!')
{

   echo 'foutmelding: ' . '<b>' .substr($iban,1) . '</b>' . "\n";
}

else
{
  if (strlen($iban) > 0)
  {

    echo  'Iban: ' . '<b>' .$iban . '</b>' . ' <br/>';
    if ($bankfunctions->is11Proof($_POST['Reknr']))
    {

     echo "\n" .'<br>Rekeningnummer voldoet <b>wel</b> aan de 11 proef<br>';
    }

    else
    {
     echo "\n" . '<br>Rekeningnummer voldoet <b>niet</b> aan de 11 proef<br>';
    }

    echo "\n" .'<br><b>' . $_POST['banksel'] . '</b> is de BIC van ' . '<b>' .
         $bankfunctions->getBankName($_POST['banksel']) . "</b>\n";
  }
}

?>
Niels K
Niels K
14 jaar geleden
 
0 +1 -0 -1
Hoi Rene,

Ziet er al stukken beter uit ;-) Ik mis alleen nog PHPdoc?

Niels
Rene Geul
Rene Geul
14 jaar geleden
 
0 +1 -0 -1
Beste Niels,
PHPdoc moet ik nog downloaden en op dit moment heb ik het behoorlijk druk met ZF, althans het begrijpen ervan.
Op dit moment is de functionaliteit al tot in den treure uitgelegd maar later zal ik na downloaden kijken of ik deze tool wat zinnigs kan laten genereren.
Voorlopig ben ik nu bezig om om ZF te doorgronden (veel lesboeken zijn op zijn zachtjes gezegd nogal vaag) en heb als doel gesteld de calculator in ZF te zetten met nog wat uitbreidingen.
De uitbreidingen zijn niet spectaculair maar in wezen allemaal functies die werken vanuit de IBAN.
Dus het ophalen van de banknaam via de IBAN, bepalen of een rekening voldoet aan de 11proef vanuit de IBAN. De eerste functie werkend met een IBAN zit nu al in de toolbox (IsIban), hierbij gebruik gemaakt van het gegeven dat een IBAN de BIC en het locale accountnr bevat.
Dus zodra ik de calculator in ZF aan de praat krijg wil ik met alle plezier PHPdoc er ook overheen zetten.
Met vriendelijke groeten en dank voor de opbouwende kritiek.
Rene Geul
Wouter J
Wouter J
14 jaar geleden
 
0 +1 -0 -1
PHPDoc is niet per se iets om te installeren (behalve als je documentatie uit je PHPdoc wilt genereren). PHPDoc is meer een manier om al je functies mooi te documenteren. Zodat als ik in je source kijk ik mooi zie wat elke method kan, wat voor argumenten het meekrijgt, wat ik terug krijg ect. Voorbeeld: http://www.phphulp.nl/php/script/classes/phpbench/1936/researchphp/1708/
Rene Geul
Rene Geul
13 jaar geleden
 
0 +1 -0 -1
De ibancalculator heb ik nu ingebouwd in oscommerce als onderdeel van de informationbox. Werkt prima en kan de aankomende webwinkel vrolijk verder met klanten die vanwege IDEAL ineens geconfronteerd worden met een IBAN. Mensen die oscommerce gebruiken en belangstelling hebben kunnen contact met mij opnemen via facebook. De calculator voor oscommerce is nie gratis maar kan hem wel opsturen op no cure no pay basis. Dus pas betalen (40 euro) indien alles werkt en goed bevonden is.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Martijn Wieringa
Martijn Wieringa
12 jaar geleden
 
0 +1 -0 -1
Om te testen of een ingevulde IBAN code daadwerkelijk een correcte IBAN code is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

    function isIban($sValue)
    {

        if(strlen($sValue) > 10)
        {

            $sValue = strtoupper($sValue);

            if(preg_match('/[A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{4,4}[0-9]{10,}/i', $sValue))
            {

                $sCountryCode = substr($sValue, 0, 2);
                $sVerificationCode = substr($sValue, 2, 2);
                $sBankCode = substr($sValue, 4, 4);
                $sAccountNumber = substr($sValue, 8);

                // Verify checksum
                $sChecksum = $sBankCode . $sAccountNumber . $sCountryCode;
                $sChecksum = str_replace(array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'), array(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), $sChecksum);
                $sChecksum = $sChecksum . '00';

                $a = str_split($sChecksum);
                $r = 0;

                foreach($a as $v)
                {

                    $r = ((($r * 10) + intval($v)) % 97);
                }


                $iChecksum = (98 - $r);

                if(strcmp($iChecksum, $sVerificationCode) === 0)
                {

                    return true;
                }
            }
        }


        return false;
    }


    $sIban = 'NL54RABO0108429563';

    if(isIban($sIban))
    {

        echo $sIban . ' is a valid IBAN.';
    }

    else
    {
        echo $sIban . ' is NOT a valid IBAN.';
    }


?>

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Biciban.php
  2. bankfuncties.php

Labels

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.