قطعه کدهای کاربردی PHP در پروژه های کانستراکتی - سـری دوم
#1
Lightbulb 
به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
توی هر سری از این تاپیک ها قطعه کدهای کاربردی PHP که ممکنه در پروژه تون بهشون نیاز پیدا کنید قرار داده میشه. در صورتی که مایلید سری اول این کدها رو هم ببینید میتونید به اینجا مراجعه کنید.
1- تشخیص موجود بودن یک آدرس اینترنتی (وبسایت) به کمک CURL:
شما میتونید به کمک کتابخانه CURL در PHP بررسی کنید که یک آدرس اینترنتی (وبسایت) وجود خارجی داره یا خیر. در واقع در این روش ما ساختار آدرس رو بررسی نمیکنیم بلکه به آدرس موردنظر نوعی درخواست HTTP مشابه درحواستی که مرورگر ارسال می کنه میفرستیم.
کد php:
<?php
function Visit($url)
{
    $agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
    $ch curl_init();
    curl_setopt($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_USERAGENT$agent);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_VERBOSEfalse);
    curl_setopt($chCURLOPT_TIMEOUT5);
    curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
    curl_setopt($chCURLOPT_SSLVERSION3);
    curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);
    $page curl_exec($ch);
    $httpcode curl_getinfo($chCURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($httpcode >= 200 && $httpcode 300) return true;
    else return false;
}
if (
Visit($_GET['url'])) {
    echo "found";
else {
    echo "not found";
}
?>
در کد بالا ما یک تابع به نام visit() تعریف کردیم که یک پارامتر (آرگومان) می پذیره که در واقع آدرس موردنظر ما هست. در صورتی که آدرس موردنظر ما موجود باشد مقدار بولی True و در غیر اینصورت مقدار False برگردانده می شود. پس میتونیم یک بلوک شرط (شامل if و elseif) تعریف کنیم تا در صورتی که مقدار بولی True برگردانده شد مقدار  found و در صورتی که مقدار بولی False برگردانده شد مقدار  not found چاپ شود. در کد بالا به کمک متغیر گلوبال $_GET شرایطی رو فراهم کردیم تا بتونیم به کمک اکشن Request URL شیء AJAX (اِی جَکس) و از طریق متد GET یک ریکوئست به فایل PHP موردنظر ارسال کنیم. به طور مثال آدرسی که به اون ریکوئست میزنیم میتونه به شکل زیر باشه:
کد:
"http://yourhost.com/file.php?url=http://facebook.com"
خروجی که پس از ارسال درخواست از طریق Ajax.Lastdata دریافت خواهیم کرد برابر با  found خواهد بود.
نکته: دقت کنید حتماً آدرس موردنظرتون رو به همراه پروتکل (http یا https) درج کنید.
2- دریافت آخرین زمان ویرایش (Modify) فایلهای آپلود شده در سرور یا هاست:
شاید بخواید تاریخ و ساعت آخرین باری که یک فایل در سرور ویرایش شده (منظور از لفظ ویرایش در اینجا اضافه شدن، ادیت شدن و یا هر چیزی که باعث دست بردن در اون فایل بشه هست) رو به دست بیارید که برای این منظور میتونین از کد PHP زیر استفاده کنید.
کد:
<?php
function lastmoidfy($file){
if (!file_exists($file)){
return ("File Not Found.");
}
return date("F d Y" . '|' . "H:i:s", filemtime($file));
}
echo lastmoidfy('x');
?>
در کد PHP بالا یک تابع (فانکشن) بسیار کوتاه به نام lastmodify() تعریف کردیم که تنها یک آرگومان (شامل نام یا مسیر فایل موردنظر) رو می پذیره و تاریخ و زمان آخرین بار ویرایش فایل رو به ما برمیگردونه. 
فرض کنید قصد دارید بدونید فایل  e12.png که کاربر در دایرکتوری (پوشه)  uploads سرور یا هاستتون آپلود کرده در چه تاریخ و ساعتی آپلود شده. کافیه از تابع تعریف شده به شکل زیر استفاده کنید:
کد:
echo lastmodify('uploads/e12.png');
خروجی فرضی زیر توسط تابع برگردانده می شود:
کد:
February 14 2020|19:14:11
نکته: 
  • در صورتی که فایل موردنظر در هاست یا سرور یافت نشود پیغام زیر چاپ خواهد شد:
کد:
File Not Found.

3- محاسبه فاصله بین دو مختصات جغرافیایی برحسب مایل، کیلومتر، متر و یارد:
در صورتی که نیاز دارید فاصله بین دو مختصات جغرافیایی رو محاسبه کنید میتونید از کد PHP زیر استفاده کنید.
کد php:
<?php
function getDistanceBetweenPointsNew($latitude1$longitude1$latitude2$longitude2) {
    $theta $longitude1 $longitude2;
    $miles = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
    $miles acos($miles);
    $miles rad2deg($miles);
    $miles $miles 60 1.1515;
    $feet $miles 5280;
    $yards $feet 3;
    $kilometers $miles 1.609344;
    $meters $kilometers 1000;
    return compact('miles','feet','yards','kilometers','meters');
}
?>
در کد بالا تابعی به نام getDistanceBetweenPointsNew() تعریف کردیم که فاصله بین دو نقطه داده شده در قالب یک آرایه رو برای ما محاسبه میکنه. فرض کنید طول و عرض جغرافیایی دو نقطه موردنظر به شکل زیر باشه:
کد:
نقطه اول (موزه مردم شناسی آسیا واقع در نیویورک)

طول: -73.964367
عرض: 40.770623
+++++++++++
نقطه دوم (نقطه ای واقع در قطب جنوب)

طول: -73.964367
عرض: 40.758224
برای محاسبه فاصله بین این دو نقطه برای هر نقطه یک آرایه انجمنی (دیکشنری) با نام point 1 و یا  point 2 تعریف می کنیم و طول و عرض جغرافیایی رو ثبت می کنیم. پس در اینجا باید بنویسیم:
کد:
$point1 = array('lat' => 40.770623, 'long' => -73.964367);
$point2 = array('lat' => 40.758224, 'long' => -73.917404);
حالا باید از تابع تعریف شده به شکل زیر استفاده کنیم:
کد:
$distance = getDistanceBetweenPointsNew($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);
foreach ($distance as $unit => $value) {
    echo $unit.': '.number_format($value,4).'<br />';
}
بعد از اجرای کد خروجی به شکل زیر خواهد بود:
کد:
miles: 2.603
feet: 13,741.435
yards: 4,580.478
kilometers: 4.188
meters: 4,188.389

4- دریافت تمامی فایلهای حاوی یک فرمت مشخص در دایرکتوری (پوشه):
به این منظور میتونید از کد PHP زیر استفاده کنید.
کد php:
<?php
function find($format){
    $files glob('*.' $format);
    foreach($files as $key => $value){
        echo $value '</br>';
    }
    echo sizeof($files) . ' files were found.';
}
find('x');
?>
در کد فوق ما یک تابع ساده به نام find() تعریف کردیم که با وارد کردن فرمت موردنظر (بدون درج علامت نقطه) تابع تمامی فایلهای موجود با فرمت تعریف شده رو در دایرکتوری که فایل PHP قرار داره چاپ میکنه و در نهایت تعدادشون رو هم مشخص میکنه.
به طور مثال قصد داریم فایل های PHP موجود در دایرکتوری کنونی رو به دست بیاریم. پس از تابع به شکل زیر استفاده می کنیم:
کد:
find('php);
خروجی به طور مثال به شکل زیر خواهد بود:
کد:
alexa.php
alter.php
class.php
web.php
4 files were found.
نکته: 
  • در صورتی که فرمت وارد شده در دایرکتوری کنونی موجود نباشد پیغام زیر چاپ خواهد شد:
کد:
0 files were found.
  • دقت کنید که تابع تعریف شده تنها قادر به یافتن فایلهای با فرمت تعریف شده در دایرکتوری کنونی (دایرکتوری که فایل PHP در آن قرار دارد) می باشد.

5- محاسبه قدرت پسورد:
این کد PHP به کمک بحث آنتروپی (Entropy) پسورد از صفر تا صد به یک پسورد امتیاز میده. آنتروپی پسورد در واقع فرمولی هست که مشخص میکنه یک پسورد به چه مقداری غیرقابل حدس هست. برای محاسبه آنتروپی باید از فرمول زیر استفاده کنیم:
[تصویر:  ent.png]
در فرمول بالا بیانگر آنتروپی پسورد، بیانگر مجموع کاراکترهای غیرتکراری و نیز بیانگر تعداد کل کاراکترهای پسورد موردنظر است. دلیل استفاده از لگاریتم در مبنای 2 دراین فرمول صرفاً برای به دست آوردن تعداد بیت ها است.  
کد:
<?php
    function password_strength($string){
        $h = 0;
        $size = strlen($string);
        foreach(count_chars($string, 1) as $v){
        $p = $v / $size;
        $h -= $p * log($p) / log(2);
        }
        $strength = ($h / 4) * 100;
        if($strength > 100){
        $strength = 100;
        }
        return round($strength);
        }
        echo password_strength('x');
?>
در کد PHP بالا یک تابع به نام password_strength() تعریف کردیم که کارش محاسبه آنتروپی پسورد موردنظر ماست. 
فرض کنید قصد داریم قدرت پسورد  mmd1234 رو به کمک این تابع ارزیابی کنیم. پس باید از تابع به شکل زیر استفاده کنیم:
کد:
echo password_strength('mmd1234');
آنتروپی پسوردی که تابع محاسبه می کند برابر با 53.041015908583 خواهد بود که نشان می دهد قدرت پسورد چندان قوی نیست اما آنقدر ضعیف هم نیست.
6- تشخیص صحت ساختاری شماره کارت بانکی:
قصد داریم به کمک یک کد PHP صرفاً ساختار یک شماره کارت بانکی رو بررسی کنیم. بنابراین اگر شماره کارت موردنظر منقضی شده باشد و یا باطل شده باشد چون ما دسترسی به دیتابیس بانک نداریم همچنان کارت بانکی موردنظر معتبر تلقی خواهد شد. برای این منظور میتونیم از عبارات با قاعده (Regular Expressions) و یا الگوریتم تشخیص صحت ساختار شماره کارت بانکی استفاده کنیم. البته استفاده از عبارات با قاعده به تنهایی برای تشخیص صحت ساختار شماره کارت بانکی کارساز نخواهد بود.
الگوریتم تشخیص صحت ساختار شماره کارت بانکی:
ساختار یک شماره کارت بانکی به شکل زیر است:
[تصویر:  structure.PNG]
1- برای محاسبه رقم کنترل از روی سایر ارقام ، از سمت چپ و با شروع از موقعیت 1 تا موقعیت 16 ، ارقام موقعیت فرد را در 2 و ارقام موقعیت زوج را در یک ضرب می کنیم، اگر حاصل ضرب هر مرحله بیشتر از  9 شد  9 واحد از آن کم کنید  تا یک رقمی شود و سپس اعداد حاصل را با هم جمع می کنیم.
2- اگر عدد حاصل از اجرای مرحله یک بر 10 بخش پذیر باشد ، شماره کارت صحیح قلمداد می شود در غیر اینصورت شماره کارت صحیح نمی باشد.
مثال:  آیا کد 6274129005473742  یک شماره کارت بانکی معتبر است؟
[تصویر:  example.PNG]
حاصل
 جمع ضرب ارقام کارت در الگوی مورد نظر را با توجه به روش گفته شده محاسبه می کنیم این حاصل جمع در زیر آمده است. ضمنا چون رقم کنترل را نیز باید در انتهای کار  به حاصل جمع  مورد نظر اضافه کنیم برای راحتی رقم کنترل را نیز در یک ضرب کرده و به مجموع می افزاییم. پس الگوی ضرب به صورت 16 رقمی  2121212121212121  خواهد بود که هر رقم از الگو در رقم همو موقعیت آن از شماره کارت ضرب می شود (در هر مرحله  چنانچه حاصلضرب رقم الگو ضرب در  رقم کارت  بیشتر از 9 بود 9 واحد از نتیجه حاصلضرب  کسر می کنیم). در زیر 16 مورد ضرب الگو در 16 رقم شماره کارت مورد بررسی در این مثال، نمایش داده شده است.
کد:
6*2=12   -> 12-9=3
2*1=2
7*2=14   -> 14-9=5
4*1=4
1*2=2
2*1=2
9*2=18 ->18-9=9
0*1=0
0*2=0
5*1=5
4*2=8
7*1=7
3*2=6
7*1=7
4*2=8
2*1=2

8+7+6+7+8+5+0+0+9+2+2+4+5+2+3+2=70
چون 70 بر 10 بخش پذیر است پس شماره کارت از لحاظ ساختاری معتبر می باشد.
در حاشیه: 
دقت کنید چون در این کد PHP ما تنها به الگوریتم متکی هستیم در صورتی که کاربر طرز کار الگوریتم ما رو بدونه میتونه شماره کارت های کاملاً جعلی تولید (Generate) کنه. کافیه کاربر ارقام رو به گونه ای قرار بده که شروط الگوریتم برقرار بشه. اینجاست که استفاده از عبارات با قاعده ضروری به نظر میرسه تا بتونیم به حد هر چند کمی جلوی این مسئله رو بگیریم. در واقع به کمک عبارات با قاعده مشخص می کنیم که هر بانک شماره کارت هاش با چه ارقامی شروع میشن تا بتونیم تا حدی جلوی جنریت شماره کارت های جعلی رو بگیریم. حتی با اعمال عبارات با قاعده باز هم به خانه اول بر می گردیم و نمیتونیم به طور دقیق اظهارنظر کنیم که چنین شماره کارتی موثق هست یا خیر چون ارتباطی با دیتابیس بانک نداریم.
کد php:
<?php
function bankCardCheck($card=''$irCard=true) {
    $card = (string) preg_replace('/\D/','',$card);
    $strlen strlen($card);
    if($irCard==true and $strlen!=16)
        return false;
    if($irCard!=true and ($strlen<13 or $strlen>19))
        return false;
    if(!in_array($card[0],[2,4,5,6,9]))
        return false;
    
    for
($i=0$i<$strlen$i++)
    {
        $res[$i] = $card[$i];
        if(($strlen%2)==($i%2))
        {
            $res[$i] *= 2;
            if($res[$i]>9)
                $res[$i] -= 9;        
        
}
    }
    return array_sum($res)%10==0?true:false;    
}
if(
bankCardCheck($_GET['card']))
    echo 'ok';
else
    echo 'err';
    ?>
در کد بالا تابعی به نام bankCardCheck() تعریف کردیم که به کمک اون میتونیم صحت ساختاری شماره کارت بانکی که از طریق متد GET به فایل PHP ارسال می کنیم رو بررسی کنیم. 
فرض کنید قصد داریم صحت شماره کارت 6037991199500590 رو بررسی کنیم. به کمک اکشن Request URL شیء AJAX ریکوئستی مشابه نمونه زیر ارسال می کنیم:
کد:
"http://yourhost.com/file.php?card=6037991199500590"
مقداری که Ajax.Lastdata دریافت می کند برابر با  ok خواهد بود که نشان دهنده صحت ساختار شماره کارت بانکی وارد شده است.
نکته: در صورتی که شماره کارت وارده از لحاظ ساختاری معتبر نبود خروجی کد PHP عبارت  err خواهد بود.
امیدوارم این مطلب براتون مفید واقع شده باشه.
در هر سری از این تاپیک های آموزشی مجموعاً شش قطعه کد کاربردی بررسی خواهد شد. 
در پایان خوشحال میشم که نظراتتون رو به بنده گوشزد کنین و اگر جایی اشتباهی مشاهده میشه حتماً اعلام کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: oak ، M.gh ، MohammadHadi ، shazde ، amin hosseini
#2
Very Nice  16
  پاسخ


 سپاس شده توسط:


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 77,126 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 17,898 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,188 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 7,115 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,381 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: