PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : صحت سنجی کد ملی در پی اچ پی



fara_server
August 21st, 2012, 13:30
سلام دوستان
مطلب زیر رو در سایت استاد کرامتی فر گرامی دیدم و گفتم خالی از لطف نیست اگر برای دوستان هم قرار بدم.در ذیل با نحوه اعتبار سنجی کد ملی کاربر در پی اچ پی آشنا خواهید شد.
+
همانطور که می دانید، کد ملی بعنوان یک شناسه ی منحصر به فرد (Unique ID) برای هر ایرانی محسوب می شود. در بعضی سایت ها ممکن است نیاز باشد تا کد ملی کاربر را بگیریم. بنابراین به الگوریتمی نیاز داریم تا بتوانیم از صحت کد ملی وارد شده توسط کاربر مطمئن شویم و در صورتیکه بصورت سهوی و یا عمدی اشتباه وارد شد، بتوانیم عملیات ثبت را متوقف کنیم و به کاربر اخطار دهیم.
در همین راستا، تابعی در php نوشتم که کد ملی وارد شده را می گیرد و صحت آنرا بررسی می کند. اما قبل از بررسی تابع لازم است توضیحاتی در مورد الگوریتم آن بدهم.

کد ملی یک شناسه ی 10 رقمی است که اعداد آن به سه دسته تقسیم می شوند:
1- 3 رقم اول کد محل زندگی
2- 6 رقم بعدی کد منحصر به فرد شخص
3- رقم آخر عدد کنترل (Validation Number)
الگوریتم Validation کد ملی بصورت ساده به این شرح است:
از سمت چپ هر عدد ضربدر ارزش مکانی مع*** خود می شود.
حاصل ضرب ها با هم جمع می شود.
باقیمانده تقسیم حاصل جمع ها بر عدد 11 را بدست می آوریم.
اگر عدد بدست آمده در باقیمانده ی تقسیم، کوچکتر مساوی 2 بود، همان عدد باید با Validation Number (عدد آخر کد ملی) برابر باشد.
اگر عدد بدست آمده در باقیمانده ی تقسیم، بزرگتر از 2 بود، عدد را منهای 11 می کنیم و نتیجه باید برابر Validation Number (عدد آخر کد ملی) باشد.


<?php
function CheckNationalCode($code)
{
if(strlen($code) <> 10){
echo 'کد ملی باید ده رقم باشد';
}
else
{
$codeArray = str_split($code);
$AllEq ;
foreach($codeArray as $item => $value)
{
if($codeArray[0] <> $value)
{
$AllEq = false;
break;
}
else{ $AllEq = true;}
}
if($AllEq == true) die('اعداد کد ملی نمی توانند برابر هم باشند');
$j = 10;
$sum = 0;
for($i=0; $i<=8; $i++)
{
$sum +=((int)($codeArray[$i])) * $j;
--$j;
}
$divid = $sum % 11;
if ($divid <= 2)
{
if($codeArray[9] == $divid)
{
echo "کد ملی معتبر است";
}
echo "کد ملی معتبر نیست";
}
else
{
$divid1 = 11 - $divid;
if ($codeArray[9] == $divid1)
{
echo "کد ملی معتبر است";
}
else
{
echo "کد ملی معتبر نیست";
}
}
}
}

?>

نحوه ی کار این کد به این صورت است که یک کد ملی (nccode) را توسط متد POST دریافت می کند و به تابع CheckNationalCode می دهد تا صحت آنرا بررسی کند.
این فانکشن را در قالب یک برنامه پی اچ پی که با استفاده از ajax کد ملی را Validat می کند، پیاده سازی کردم

دانلود نمونه برنامه (http://rapidshare.com/files/430817058/CheckNationalCode.rar)
مشاهده ی نمونه برنامه (http://keramatifar.ir/tests/enternc.php)


منبع : وب سایت جناب آقای کرامتی فر (http://keramatifar.ir)

hpnn.wm
August 21st, 2012, 14:09
کد ملی برادر بنده 2740995849 هست که می گه اشتباه هست در حالی که واسه مال من درست می اره
فکر نکنم الگوریتم شما درست باشه ؟

fara_server
August 21st, 2012, 14:33
سلام ،درمورد الگوریتم من 2 بار تست کردم (با چند کد ملی مختلف و پاسخ گرفتم)
شاید حق با شما باشه ، تحقیق میکنم به نتیجه ای رسیدم در اینجا قرار میدم.
با تشکر

fara_server
August 21st, 2012, 16:12
با سلام مجدد من جستجو کردم و در چند سایت این الگوریتم رو دیدم به ویژه انجمن پی اچ پی گروپ که عینا درج میکنم .

روش اعتبار سنجی کد ملی :

دهمین رقم شماره ملی را ( از سمت چپ ) به عنوان A در نظر می گیریم.
یک مقدار B در نظر می گیریم و آن را برابر با :

(اولین رقم * ۱۰) + ( دومین رقم * ۹ ) + ( سومین رقم * ۸ ) + ( چهارمین رقم * ۷ ) + ( پنجمین رقم * ۶) + ( ششمین رقم * ۵ ) + ( هفتمین رقم * ۴ ) + ( هشتمین رقم * ۳ ) + ( نهمین رقم * ۲ )


قرار می دهیم.

مقدار Cرا برابر با B – (B/11)*11 قرار می دهیم.



اگر مقدار Cبرابر با صفر باشد و مقدار Aبرابر Cباشد کد ملی صحیح است.

اگر مقدار Cبرابر با ۱ باشد و مقدار Aبرابر با ۱ باشد کد ملی صحیح است.

اگر مقدار Cبزرگتر از ۱ باشد و مقدار A برابر با ۱۱ – Cباشد کد ملی صحیح است.

همینطور یک کلاس که جناب آقای رضا شعاری نوشته بودند اینجا قرار میدم امیدوارم مفید باشه.

<?php
/** * In the name of God * * Validate National Iranian Code * * @package melliCode * @version 1.0.0 mellicode.class.php Wednesday, January 12, 2011 * @author Reza Sheari * @web http://www.Vvolf.net * @email r.sheari@gmail.com */
class melliCode{ /** * Hold National Code * * @access Protected * @var Integer */ protected static $nationalCode = int;
/** * Incorrect List * * @access Protected * @var Integer */ protected static $notNationalCode = array( "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999", "0000000000");
/** * Construct * * @access Public * @var Empty */ public function __construct() { }
/** * National Validation Code * * @access Public * @var Integer */ public function nationalCode($code) { self::$nationalCode = trim($code);
if(self::validCode()) { $melliCode = self::$nationalCode;
$subMid = self::subMidNumbers($melliCode, 10, 1);
$getNum = 0;
for($i = 1; $i < 10; $i++) $getNum += (self::subMidNumbers($melliCode, $i, 1) * (11 - $i));
$modulus = ($getNum % 11);
if((($modulus < 2) && ($subMid == $modulus)) || (($modulus >= 2) && ($subMid == (11 - $modulus)))) return true; }
return false; }
/** * Validate * * @access Protected * @var Boolean */ protected function validCode() { $melliCode = self::$nationalCode;
if((is_numeric($melliCode)) && (strlen($melliCode) == 10) && (strspn($melliCode, $melliCode[0]) != strlen($melliCode))) return true;
return false; }
/** * Get Portion of String Specified * * @access Protected * @var Integer */ protected function subMidNumbers($number, $start, $length) { $number = substr($number, ($start - 1), $length);
return $number; }}
?>

rezaonline.net
August 21st, 2012, 17:49
چرا خودتو اذیت میکنی پسر خوب .
فقط کافیه مقدار فیلد دیتابیس رو یونیک بذاری .
تعداد کاراکتر ها رو چک کنی .
از is_int استفاد کنی .

saeedjjjj
February 28th, 2014, 10:51
با سلام
من نیاز به کدی دارم که 3 رقم اول یک مجموعه عدد را بررسی کند و نمایش دهد
مثلا من یک عددی مثل 91269003260039 دارم
اگر 3 رقم اول 912 بود چاپ کند
ورودی بهمن 91
اگر 3 رقم اول 911 بود
چاپ کند ورودی مهر 91
ممنون می شوم کمکم کنید

sardarn
February 28th, 2014, 11:36
با سلام
من نیاز به کدی دارم که 3 رقم اول یک مجموعه عدد را بررسی کند و نمایش دهد
مثلا من یک عددی مثل 91269003260039 دارم
اگر 3 رقم اول 912 بود چاپ کند
ورودی بهمن 91
اگر 3 رقم اول 911 بود
چاپ کند ورودی مهر 91
ممنون می شوم کمکم کنید

سلام
این تاپیک قدیمی هست تاپیک جدید بزنید.جواب تون:

تابع substr( )این تابع می­تواند زیررشته ای را از یک رشته جدا کند، این تابع به شکل زیر استفاده می­شود.Substr(متغیر رشته ای,شروع,طول)این تابع زیر رشته ای به طول مورد نظر را با شروع از نقطه­ی مشخص شده برمی­گرداند، اگر طول مشخص نشود از شروع تا انتهای رشته برگردانده می­شود.اندیس اولین کاراکتر0 می­باشد.

mohsened
February 28th, 2014, 14:31
چرا خودتو اذیت میکنی پسر خوب .
فقط کافیه مقدار فیلد دیتابیس رو یونیک بذاری .
تعداد کاراکتر ها رو چک کنی .
از is_int استفاد کنی .
اینطوری با کد ملی اشتباه و رندوم هم میشه ثبت نام کرد اونوقت . این ولیدیشن برای اینه که مطمئن بشیم یوزر کد ملی واقعی رو وارد کرده .