webForum webForum sponsras med lina och serverplats av Binero AB

Gå tillbaka   webForum > Artiklar och källkod > Källkod > Script - PHP

Svar
 
Trådverktyg Visningsalternativ
Äldre 2001-04-01, 11:43   #1
sgtpepper
Medlem
 
sgtpeppers avatar
 
Registrerad: 2000-05-01
Ort: Stockholm
Inlägg: 5 524
Lösningar: 2065
Metod för att kontrollera personnummer

Denna metod kontrollerar ett svenskt personnummer och returnerar true (1) om personnummret stämmer och false (0) om det inte stämmer.

Personnummret skall anges utan bindestreck.

Demonstration finns här.

Kod:
<?
	function checkPnr($pnr)
	{	
		if (strlen($pnr) != 10) die("Felaktigt angivet personnummer! Ange personnummret utan bindestreck, totalt 10 siffror.");
		
		$n = 2;
		
		// Räkna fram kontrollsumman
		for ($i=0; $i<9; $i++) 
		{
			$tmp = $pnr[$i] * $n;
			($tmp > 9) ? $sum += 1 + ($tmp % 10) : $sum += $tmp;
			($n == 2) ? $n = 1 : $n = 2;
		}
	
		// Lägg till sista siffran (kontrollsiffran), resultatet skall bli jämt tiotal, returnera true/false
		return !( ($sum + $pnr[9]) % 10);
	}
	
	if (checkPnr("7410291234"))
	{
		echo "Korrekt personnummer!";
	}
	else
	{
		echo "Felaktigt personnummer!";
	}
	
?>
------------------
"Med ett schysst järnrör slår man hela världen med häpnad" - Socker-Conny
sgtpepper besöker inte forumet just nu   Svara med citat
Äldre 2003-01-10, 10:41   #2
Diggin
Medlem
 
Registrerad: 2002-07-19
Inlägg: 6
Lösningar: 0
fortsättning

Ytterligare kontroller är att rekommendera:

Om 3:e siffran är > 1 så är det ett organisationsnummer. I annat fall bör man kolla att det är ett giltigt datum. Svenska org. nr. använder samma algoritm för kontrollsiffror som personnummer.
Diggin besöker inte forumet just nu   Svara med citat
Äldre 2005-10-05, 19:41   #3
amabo
Medlem
 
Registrerad: 2005-10-05
Inlägg: 1
Lösningar: 0
...men det finns organisationsnummer där 3:e siffran är 0 eller 1 eftersom enskilda firmor har sin ägares personnummer som organisationsnummer.
amabo besöker inte forumet just nu   Svara med citat
Äldre 2006-01-12, 01:02   #4
bassebhu
Moderator
 
bassebhus avatar
 
Registrerad: 2001-11-21
Inlägg: 3 997
Lösningar: 37
Jag har modifierat lite. Det verkar funka, men för säkerhets skull. Är det några fel här?

Kod:
				if(preg_match("/^[0-9]{10}$/", $string)) {
		
					$n = 2;
			
					// Räkna fram kontrollsumman
					for ($i=0; $i<9; $i++) {
						$tmp = $string[$i] * $n;
						($tmp > 9) ? $sum += 1 + ($tmp % 10) : $sum += $tmp;
						($n == 2) ? $n = 1 : $n = 2;
					}
					
					return !(($sum + $string[9]) % 10);
				
				} else {
				
					return false;
				
				}
__________________
bassebhu - din kompis bland kompisar

Om du mot förmodan inte är nöjd med kompositionen av ovanstående inlägg,
eller att det helt enkelt inte nådde upp till dina förväntningtar - var god:

Rapportera till bassebhu

Senast redigerad av bassebhu, 2006-01-12 klockan 01:11
bassebhu besöker inte forumet just nu   Svara med citat
Äldre 2012-03-23, 07:27   #5
ax5
Medlem
 
Registrerad: 2012-03-23
Inlägg: 7
Lösningar: 0
Finns det något sätt att koppla det med någon sida för att kålla upp om person numret är giltigt och för att för att hindra pedofiler med fake konton ? är det lagligt att använda persunumer och kålla upp dem eller behöver jag betala för den känsten ?
ax5 besöker inte forumet just nu   Svara med citat
Äldre 2012-03-23, 14:27   #6
dwmedia
Medlem
 
Registrerad: 2006-11-24
Ort: Härnösand
Inlägg: 224
Lösningar: 0
Du kan annars använda dig Klarnas API lösning för kontrollera adressuppgifter och personnummer. Om du känner att du behöver ett lite mer säkert system.
dwmedia besöker inte forumet just nu   Svara med citat
Äldre 2012-03-24, 18:14   #7
ax5
Medlem
 
Registrerad: 2012-03-23
Inlägg: 7
Lösningar: 0
fortsättning

Citat:
dwmedia skrev: Visa inlägg
Du kan annars använda dig Klarnas API lösning för kontrollera adressuppgifter och personnummer. Om du känner att du behöver ett lite mer säkert system.
Jag ringde PUL och dom sa att man får ej lagra personnummer och adress på sin database om sidan inte har grymt bra säkerhet och sedan sa dom att man kan göra en upplysning mot en sida när användarna skriver in sina uppgifter och att man hänvisar till dom som ska bli medlemmar att man tar info från personnummer för att se att det är verkligen du. helt skumt
ax5 besöker inte forumet just nu   Svara med citat
Äldre 2012-03-24, 18:36   #8
nitro2k01
Forumvärd
 
nitro2k01s avatar
 
Registrerad: 2003-08-26
Inlägg: 7 611
Lösningar: 715
ax5, vem ringde du, sa du? PUL är en lag, inte en myndighet. Du kan inte ringa PUL, och inte heller brottsbalken eller yttrandefrihetsgrundlagen. Ringde du möjligen Datainspektionen?

Jag hörde av naturliga skäl inte ditt samtal, men på det du säger låter det som deras förslag var att du skulle kontakta en tredje part för att verifiera att personnumret är korrekt och därefter ta bort personnumret. Med andra ord, inte lagra personnummer permanent.
__________________
Gameboy Genius - Foto: Gatukonst och elektronikporr
Internklippning:
1) Snaggning av fångar.
2) Klippning frisörer emellan.
nitro2k01 besöker inte forumet just nu   Svara med citat
Äldre 2013-08-15, 05:37   #9
MickeA.com
Medlem
 
MickeA.coms avatar
 
Registrerad: 2003-02-03
Ort: Sabang Beach, Puerto Galera, Philippines
Inlägg: 4 506
Lösningar: 73
Tja

Jag har använt scriptet ovan i flera år. Nu har vi stött på ett fall där ett giltigt, Svenskt personnummer inte accepteras, funktionen returnerar false.

Kan naturligtvis inte dela med mig av det här, men vad beror det på?
__________________
//Micke Andersson
Hemsida | Kontakta
----------------------
"Det är svårt att vara ödmjuk när man vet att man är bäst".
MickeA.com besöker inte forumet just nu   Svara med citat
Äldre 2013-08-15, 07:50   #10
nitro2k01
Forumvärd
 
nitro2k01s avatar
 
Registrerad: 2003-08-26
Inlägg: 7 611
Lösningar: 715
Använder du basses kod rakt av? Lägg till lite debugkod:
Kod:
				if(preg_match("/^[0-9]{10}$/", $string)) {
		
					$n = 2;
			
					// Räkna fram kontrollsumman
					for ($i=0; $i<9; $i++) {
						$tmp = $string[$i] * $n;
						echo "$tmp, ";
						($tmp > 9) ? $sum += 1 + ($tmp % 10) : $sum += $tmp;
						($n == 2) ? $n = 1 : $n = 2;
					}
					echo "Sum: $sum";
					
					return !(($sum + $string[9]) % 10);
				
				} else {
					echo "Regex fail";
					return false;
				
				}
Min gissning är att felet beror på regexet, dvs att du t ex har fått in ett extra mellanslag någontans eller att personnumret är angivet med bindestreck, medan denna funktion förväntar sig enbart siffror.
__________________
Gameboy Genius - Foto: Gatukonst och elektronikporr
Internklippning:
1) Snaggning av fångar.
2) Klippning frisörer emellan.
nitro2k01 besöker inte forumet just nu   Svara med citat
Äldre 2013-08-15, 08:03   #11
MickeA.com
Medlem
 
MickeA.coms avatar
 
Registrerad: 2003-02-03
Ort: Sabang Beach, Puerto Galera, Philippines
Inlägg: 4 506
Lösningar: 73
Nepp, jag använder sgtpepper's kod rakt av. Den har använts sedan 2005 men det här är första gången jag hör att den inte fungerar. Jag har frågat kunden om det är 100% att dom anger rätt.

Datumet är 20090523 och de fyra sista udda udda udda jämn. Eftersom inga andra ändringar är gjorda i koden "runt om" så ska det inte kunna smyga med några mellanslag eller andra tokiga tecken.
__________________
//Micke Andersson
Hemsida | Kontakta
----------------------
"Det är svårt att vara ödmjuk när man vet att man är bäst".
MickeA.com besöker inte forumet just nu   Svara med citat
Äldre 2013-08-15, 11:56   #12
nitro2k01
Forumvärd
 
nitro2k01s avatar
 
Registrerad: 2003-08-26
Inlägg: 7 611
Lösningar: 715
Ett sånt där dumt förslag igen. Du har skrivet året som 2009 ovan. Kan det vara så att det är så personnumret är inskrivet i databasen också? Funtionen är ju gjord för att validera tiosiffriga personnummer, dvs utan hundra- och tusentalssiffra i året.
__________________
Gameboy Genius - Foto: Gatukonst och elektronikporr
Internklippning:
1) Snaggning av fångar.
2) Klippning frisörer emellan.
nitro2k01 besöker inte forumet just nu   Svara med citat
Äldre 2013-08-15, 12:41   #13
b242569
Medlem
 
Registrerad: 2005-09-18
Ort: Gävle
Inlägg: 734
Lösningar: 4
Just det. Nu för tiden brukar man behöva skriva 19741020xxxx (x = en av de 4 sista siffrorna). Tidigare kunde man skriva 741020xxxx. Det är nog för att det blivit ändrat som en gammal metod inte längre fungerar.
b242569 besöker inte forumet just nu   Svara med citat
Äldre 2014-09-14, 05:16   #14
ax5
Medlem
 
Registrerad: 2012-03-23
Inlägg: 7
Lösningar: 0
Bra exempel för nya här

php
PHP-kod:
<?php
    
function checkPnr($pnr)
    {    
        
// tar bort första siffrorna på årtalet text 1992 blir 92
        
$pnr substr($pnr2);
        if (
strlen($pnr) != 10) die($pnr."Felaktigt personnummer!");
        
        
$n 2;
        
// Räkna fram kontrollsumman
        
for ($i=0$i<9$i++) 
        {
            
$tmp $pnr[$i] * $n;
            (
$tmp 9) ? $sum += + ($tmp 10) : $sum += $tmp;
            (
$n == 2) ? $n $n 2;
        }
    
        
// Lägg till sista siffran (kontrollsiffran), resultatet skall bli jämt tiotal, returnera true/false
        
return !(($sum $pnr[9]) % 10);
    }


    if(isset(
$_POST['submit']) && isset($_POST['last'])){
        
$personnummer $_POST['y'].$_POST['mo'].$_POST['day'].$_POST['last'];
    
        if (
checkPnr($personnummer))
        {
            echo 
$personnummer." Korrekt personnummer!";
        }
        else
        {
            echo 
$personnummer." Felaktigt personnummer!";
        }
    }
?>
html
PHP-kod:
<form method="post">
    <select class="form-control" name="y">
    <?php 
        
for( $i=1940$i<=2014$i++ )
        {

            echo 
'<option value="'.$i.'">'.$i.'</option>';
        
        }
    
?>
    </select>
    <select class="form-control" name="mo">
    <?php 
        
for( $i=01$i<=12$i++ )
        {
            if (
$i 10){
                echo 
'<option value="0'.$i.'">0'.$i.'</option>';
            }else{
                echo 
'<option value="'.$i.'">'.$i.'</option>';
            }
        }
    
?>
    </select>
    <select class="form-control" name="day">
    <?php 
        
for( $i=01$i<=31$i++ )
        {
            if (
$i 10){
                echo 
'<option value="0'.$i.'">0'.$i.'</option>';
            }else{
                echo 
'<option value="'.$i.'">'.$i.'</option>';
            }
        }
    
?>
    </select>
    
    
    <input type="text" name="last" placeholder="Sista">
    <input type="submit" value="Kontrollera" name="submit">
</form>
ax5 besöker inte forumet just nu   Svara med citat
Svar
webForum > Artiklar och källkod > Källkod > Script - PHP

Trådverktyg
Visningsalternativ

Forumregler
Du får inte posta nya trådar
Du får inte posta svar
Du får inte bifoga filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är av
HTML-kod är av

Forumhopp


Alla tider är i GMT +1. Klockan är nu 00:09.


Powered by: vBulletin Version 3.8.6
Copyright © webForum