اعتبارسنجی اعداد در php
در هنگام برنامهنویسی با php گاهی لازم است تا کاربر حتما مقادیر عددی را به سرور ارسال کند ولی اعتماد به صحت عملکرد کاربر یا حتی اعتماد به بررسی فیلدها در سمت کلاینت با استفاده از جاوااسکریپت و jQuery کافی نیست و لازم است تا فیلدها در سمت سرور هم بررسی شوند.
اعتبارسنجی فیلدها برای عددی بودن با استفاده از چند روش زیر قابل انجام است:
۱- با استفاده از توابع تبدیل نوع
گاهی که اعتبارسنجی در سمت کلاینت به انجام میرسد یا فیلدهای در اختیار کاربر از نوع عددی هستند، ممکن است بخواهیم، صرفا مقادیر ارسال شده را به عدد تبدیل کنیم و آن را در پایگاه داده ذخیره نماییم. این کاری هنگامی مناسب است که کاربر به صورت عادی نمیتواند چیزی غیر از عدد در سمت کلاینت وارد کند و اگر مقداری غیر از عدد به سرور ارسال شده است، این مقادیر ممکن است با هدف خرابکاری بوده است و در نتیجه بدون نمایش پیام خطا، صرفا مقادیر با به عدد تبدیل میکنیم و آن را ذخیره میکنیم:
1 2 |
$number1 = intval( $_POST[ 'number1' ] ); $number2 = floatval( $_POST[ 'number2' ] ); |
دو دستور intval و floatval به ما کمک میکنند تا تنها مقادیر عددی را در متغیر ذخیره کنیم. اگر مقادیر ورودی قابل تبدیل به عدد نباشند، خروجی صفر خواهد بود.
۲- با استفاده از دستور filter_val
تابع filter_val به دو شکل قابل فراخوانی است. در شکل اول، بررسی میکند که آیا مقدار وارد شده، دارای فرمت مورد نظر است یا نه و در صورت بروز خطا، مقدار false را برمیگرداند:
1 2 3 4 5 6 |
$number1 = filter_var( $_POST[ 'number1' ], FILTER_VALIDATE_INT ); $number2 = filter_var( $_POST[ 'number2' ], FILTER_VALIDATE_FLOAT ); if( $number1 === false || $number2 === false ) { echo 'error'; } |
شکل دوم فراخوانی تابع filter_val برای پاکسازی حروف غیرمجاز کاربرد دارد و عبارت ارسال شده توسط کاربر را تا حد امکان استانداردسازی میکند:
1 2 3 |
$user_input = '123abc456'; $number1 = filter_var( $user_input, FILTER_SANITIZE_NUMBER_INT ); // $number1 => '123456' |
با توجه به اینکه در شکل دوم، بررسی کاملی روی عدد انجام نمیشود و تنها حروف غیرمجاز از خروجی حذف میشوند ممکن است نتیجه با آنچه مورد انتظار است تفاوت داشته باشد و بهتر است از این روش استفاده نکنید.
۳- با استفاده از عبارتهای با قاعده یا Regex
بررسی عددی بودن متغیر ورودی کاربر با استفاده از عبارتهای باقاعده هم به شکل زیر امکان پذیر است:
1 2 3 4 5 |
$is_number = ( 1 == preg_match( '/^\d+$/', $_POST[ 'number1' ] ) ); if( false == $is_number ) { echo 'error'; } |
۴- با استفاده از عملگرهای مقایسه عددها
با استفاده از تبدیل نوع ضمنی، میتوانیم بررسی کنیم که آیا مقدار وارد شده عددی بزرگتر از صفر است یا نه. این روش برای بررسی عدد صفر قابل استفاده نیست:
1 2 3 4 5 |
$user_input = 'abc'; if( $user_input <= 0 ) { echo 'error'; } |