انجمن تخصّصی کانستراکت

نسخه‌ی کامل: قطعه کدهای کاربردی PHP در پروژه های کانستراکتی - سـری سـوم
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
به نام خـدا
سلام دوستان امیدوارم حالتون خوب باشه...
امروز قصد دارم چند قطعه کد کاربردی زبان PHP رو با هم بررسی کنیم که ممکنه در حین ساخت پروژه تون به کارتون بیاد. در صورت تمایل میتونین سری های قبلی این تاپیک یعنی سری دوم و سری اول رو مشاهده کنین.
1- نمایش یک تصویر در قالب گرد (دایره ای):
حتماً تصاویر پروفایل رو دیدید که به شکل گرد (دایره ای) نمایش داده میشن یا اصطلاحاً به شکل دایره ای کراپ شدن. برای اینکه به وسیله خود کانستراکت بتونین گوشه های یک تصویر رو گرد کنین میتونین تا حدی این کار رو با یکسری افکت هایی که کانستراکت داره انجام بدین. به دلیل اینکه اسپرایت ها در کانستراکت جزء عناصر HTML نیستن بنابراین نمیشه با CSS بهشون استایل داد تا دایره ای شکل بشن. اگر برنامه تون آنلاینه و قصد دارین یک تصویر که در هاست یا سرورتون موجود هست (مثل تصویر پروفایل) رو در قالب دایره ای نمایش بدین میتونین از کلاس PHP زیر استفاده کنین. این کلاس PHP بر پایه کتابخانه PHP GD نوشته شده که در ورژن های جدید PHP به صورت پیشفرض موجوده.
کد php:
<?php
    class CircleCrop
    
{

        private $src_img;
        private $src_w;
        private $src_h;
        private $dst_img;
        private $dst_w;
        private $dst_h;

        public function __construct($img$dstWidth$dstHeight)
        {
            $this->src_img $img;
            $this->src_w imagesx($img);
            $this->src_h imagesy($img);
            $this->dst_w $dstWidth;
            $this->dst_h $dstHeight;
        }

        public function __destruct()
        {
            if (is_resource($this->dst_img))
            {
                imagedestroy($this->dst_img);
            }
        }

        public function display()
        {
          $f md5(openssl_random_pseudo_bytes(8451251)) . ".png";
            while (file_exists($f)){
              $f md5(openssl_random_pseudo_bytes(8451251)) . ".png";
            }
            imagepng($this->dst_img $f);
            echo  "data:image/png;base64," base64_encode(file_get_contents($f));
            unlink($f);
        }
        public function reset()
        {
            if (is_resource(($this->dst_img)))
            {
                imagedestroy($this->dst_img);
            }
            $this->dst_img imagecreatetruecolor($this->dst_w$this->dst_h);
            imagecopy($this->dst_img$this->src_img0000$this->dst_w$this->dst_h);
            return $this;
        }

        public function size($dstWidth$dstHeight)
        {
            $this->dst_w $dstWidth;
            $this->dst_h $dstHeight;
            return $this->reset();
        }

        public function crop()
        {
            $this->reset();

               $mask imagecreatetruecolor($this->dst_w$this->dst_h);
            $maskTransparent imagecolorallocate($mask2550255);
            imagecolortransparent($mask$maskTransparent);
            imagefilledellipse($mask$this->dst_w 2$this->dst_h 2$this->dst_w$this->dst_h$maskTransparent);
            
            imagecopymerge
($this->dst_img$mask0000$this->dst_w$this->dst_h100);

            $dstTransparent imagecolorallocate($this->dst_img2550255);
            imagefill($this->dst_img00$dstTransparent);
            imagefill($this->dst_img$this->dst_w 10$dstTransparent);
            imagefill($this->dst_img0$this->dst_h 1$dstTransparent);
            imagefill($this->dst_img$this->dst_w 1$this->dst_h 1$dstTransparent);
            imagecolortransparent($this->dst_img$dstTransparent);

            return $this;
        }

    }
    $errors = array(
    "e1" => "data:image/png;base64," base64_encode(file_get_contents("http://s10.picofile.com/file/8405872668/er1.png")) ,
    "e2" => "data:image/png;base64," base64_encode(file_get_contents("http://s10.picofile.com/file/8405874026/e2.png")) ,
    "e3" => "data:image/png;base64," base64_encode(file_get_contents("http://s10.picofile.com/file/8405874592/e3.png"))
    );
    if(!empty($_GET['image']) && file_exists($_GET['image']) && @is_array(getimagesize($_GET['image'])) ) {
        $path $_GET["image"];
        $image imagecreatefromjpeg($path);
        $width imagesx($image);
        $height imagesy($image);
        $crop = new CircleCrop($image,$width,$height);
        $crop->crop()->display();
        }elseif (empty($_GET['image'])){
            echo $errors["e2"];
            }elseif (!file_exists($_GET['image'])){
              echo $errors["e1"];
              }else{
                echo $errors["e3"];
              }
?>
نحوه استفاده از کد PHP:
خُب طریقه استفاده از این برنامه PHP خیلی ساده است. قبل از هر چیز این برنامه PHP رو باید در دایرکتوری یا پوشه ای از هاستتون قرار بدین که تصویر یا تصاویر موردنظرتون قرار داره. برای نمایش تصویر دایره ای در کانستراکت کافیه یک اسپرایت مخصوص این کار در نظر بگیرین و شیء AJAX (اِی جَکس) رو هم به پروژه تون اضافه کنین. بعد اکشن Request URL شیء AJAX رو انتخاب کنین و به جای پارامتر  Tag هر عبارت دلخواهی قرار بدین. به جای پارامتر  URL هم باید آدرسی مشابه نمونه زیر رو وارد کنید:
کد:
"http://yourhost.com/file.php?image=x.y"
در عبارت بالا (x) بیانگر نام فایل تصویری و (y) هم بیانگر فرمت فایل تصویری موردنظر می باشد. حالا فقط یک قدم تا نمایش خروجی در اسپرایت موردنظرمون فاصله داریم. به کمک کاندیشن On Completed بیان می کنیم که هر وقت تگی که تعریف کردیم با موفقیت نتیجه اش برگشت داده شد اکشن Load Image From URL اسپرایت اجرا بشه. پارامتر  URI این اکشن رو باید دقیقاً برابر با  AJAX.LASTDATA قرار بدین. اگر تمایل دارین که تصویر خروجی در ابعاد واقعی خودش نمایش داده بشه پارامتر  Size رو بر روی گزینه  Resize to Image Size قرار بدین و اگر هم قصد دارین که تصویر خروجی محدود به ابعاد اسپرایت شما باشه مقدار پارامتر یاد شده رو برابر با  Keep Current Size قرار بدین.
این برنامه PHP به صورت خودکار مشکلاتی مثل تصویری نبودن فایل موردنظر شما، موجود نبودن فایل تصویری موردنظر شما در سرور و یا خالی بودن مقدار پارامتر image رو در صورت وجود داشتن شناسایی و در خروجی نمایش میده. 
[تصویر:  ex101.png]
2- بکاپ گرفتن از محتویات دیتابیس:
بکاپ گرفتن دوره ای اطلاعات دیتابیس اهمیت زیادی داره چرا که اگر این کار انجام بشه در صورتی که سرور یا هاست دچار مشکل بشه میتونیم خیلی سریع داده های دیتابیس یا دیتابیس های موردنظرمون رو بارگیری کنیم. برای بکاپ گرفتن از دیتابیس میتونیم از طریق سربرگ Export در phpmyadmin اقدام کنیم تا یک فایل با فرمت  .sql به عنوان خروجی تحویل بگیریم. تابع PHP که در ادامه مطرح میکنیم میتونه به صورت خودکار از اطلاعات دیتابیس بکاپ بگیره بدون اینکه نیاز باشه از طریق phpmyadmin اقدام کنیم.
کد php:
<?php
function EXPORT_DATABASE($host,$user,$pass,$name$tables=false$backup_name=false)
{
    set_time_limit(3000); $mysqli = new mysqli($host,$user,$pass,$name); $mysqli->select_db($name); $mysqli->query("SET NAMES 'utf8'");
    $queryTables $mysqli->query('SHOW TABLES'); while($row $queryTables->fetch_row()) { $target_tables $row[0]; }    if($tables !== false) { $target_tables array_intersect$target_tables$tables); }
    $content "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\nSET time_zone = \"+00:00\";\r\n\r\n\r\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r\n/*!40101 SET NAMES utf8 */;\r\n--\r\n-- Database: `".$name."`\r\n--\r\n\r\n\r\n";
    foreach($target_tables as $table){
        if (empty($table)){ continue; }
        $result    $mysqli->query('SELECT * FROM `'.$table.'`');      $fields_amount=$result->field_count;  $rows_num=$mysqli->affected_rows    $res $mysqli->query('SHOW CREATE TABLE '.$table);    $TableMLine=$res->fetch_row();
        $content .= "\n\n".$TableMLine[1].";\n\n";   $TableMLine[1]=str_ireplace('CREATE TABLE `','CREATE TABLE IF NOT EXISTS `',$TableMLine[1]);
        for ($i 0$st_counter 0$i $fields_amount;   $i++, $st_counter=0) {
            while($row $result->fetch_row())    //when started (and every after 100 command cycle):
                if ($st_counter%100 == || $st_counter == )    {$content .= "\nINSERT INTO ".$table." VALUES";}
                    $content .= "\n(";    for($j=0$j<$fields_amount$j++){ $row[$j] = str_replace("\n","\\n"addslashes($row[$j]) ); if (isset($row[$j])){$content .= '"'.$row[$j].'"' ;}  else{$content .= '""';}       if ($j<($fields_amount-1)){$content.= ',';}   }        $content .=")";
                //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler
                if ( (($st_counter+1)%100==&& $st_counter!=0) || $st_counter+1==$rows_num) {$content .= ";";} else {$content .= ",";}    $st_counter=$st_counter+1;
            }
        $content .="\n\n\n";
    }
    $content .= "\r\n\r\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;";
    $backup_name $backup_name $backup_name $name.'___('.date('H-i-s').'_'.date('d-m-Y').').sql';
    ob_get_clean(); header('Content-Type: application/octet-stream');  header("Content-Transfer-Encoding: Binary");  header('Content-Length: '. (function_exists('mb_strlen') ? mb_strlen($content'8bit'): strlen($content)) );    header("Content-disposition: attachment; filename=\"".$backup_name."\"");
    echo $content; exit;
}
?>
نحوه استفاده از تـابع PHP تعریف شده:
این تابع PHP که تعریف کردیم چهار پارامتر (آرگومان) اجباری داره که عبارتند از آدرس سرور MySQL، یوزرنیم و پسورد MySQL و نام دیتابیس MySQL. پس یعنی اگر بخوایم از تمامی جداول (به بیان دیگه کل دیتابیس) خروجی بگیریم باید به شکل زیر از تابع تعریف شده استفاده کنیم:
کد:
EXPORT_DATABASE("serveraddress","user","pass","db_name" );
اما به غیر از این چهار آرگومان اجباری که باید به تابع پاس بدیم میتونیم دو آرگومان غیراجباری دیگه (آرگومان های پنجم و ششم) رو هم پاس بدیم.
آرگومان پنجم برای خروجی گرفتن تنها از یکسری جداول خاص دیتابیس به کار میره و باید جداول موردنیازمون رو در قالب یک آرایه مشابه نمونه زیر تعریف کنیم:
کد:
EXPORT_DATABASE("serveraddress","user","pass","db_name" , array("mytable1","mytable2") );
آرگومان ششم هم نام دلخواه شما برای فایل خروجی رو مشخص میکنه که در صورت نیاز میتونین واردش کنین.
3- دریافت آدرس، کشور، شهر و ارائه دهنده خدمات اینترنت (ISP) آی پی کاربر + تشخیص فعال بودن VPN:
ممکنه توی پروژه تون نیاز به دریافت اطلاعات شناسه آی پی کاربر داشته باشید. کد PHP زیر آدرس آی پی، نام شهر، شرکت ارائه دهنده سرویس اینترنت و کشور را به صورت جیسون برگشت می دهد. همچنین این کد PHP به سادگی با تشخیص کشوری غیر از ایران برای یک آدرس آی پی آن آدرس آی پی را غیر ایرانی تلقی می کند و به نوعی تشخیص می دهد که کاربر از ابزارهای تغییر آی پی استفاده می کند. دقت کنید که کد زیر به دلیل عدم وجود مکانیزم دریافت آی پی در لوکال هاست عملکرد صحیح نخواهد داشت.
کد php:
<?php
function ip_info($ip NULL$purpose "location"$deep_detect TRUE) {
   $output NULL;
   if (filter_var($ipFILTER_VALIDATE_IP) === FALSE) {
       $ip $_SERVER["REMOTE_ADDR"];
       if ($deep_detect) {
           if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
               $ip $_SERVER['HTTP_X_FORWARDED_FOR'];
           if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
               $ip $_SERVER['HTTP_CLIENT_IP'];
       }
   }
   $purpose    str_replace(array("name""
"
"    "" ""-""_"), NULLstrtolower(trim($purpose)));
   $support    = array("country""countrycode""state""region""city""location""address");
   $continents = array(
       "AF" => "Africa",
       "AN" => "Antarctica",
       "AS" => "Asia",
       "EU" => "Europe",
       "OC" => "Australia (Oceania)",
       "NA" => "North America",
       "SA" => "South America"
   );
   if (filter_var($ipFILTER_VALIDATE_IP) && in_array($purpose$support)) {
       $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" $ip));
       if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
           switch ($purpose) {
               case "location":
                   $output = array(
                       "country"        => @$ipdat->geoplugin_countryName,
                       "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)]
                   );
                   break;
               case "address":
                   $address = array($ipdat->geoplugin_countryName);
                   if (@strlen($ipdat->geoplugin_regionName) >= 1)
                       $address $ipdat->geoplugin_regionName;
                   if (@strlen($ipdat->geoplugin_city) >= 1)
                       $address $ipdat->geoplugin_city;
                   $output implode(", "array_reverse($address));
                   break;
               case "city":
                   $output = @$ipdat->geoplugin_city;
                   break;
               case "state":
                   $output = @$ipdat->geoplugin_regionName;
                   break;
               case "region":
                   $output = @$ipdat->geoplugin_regionName;
                   break;
               case "country":
                   $output = @$ipdat->geoplugin_countryName;
                   break;
               case "countrycode":
                   $output = @$ipdat->geoplugin_countryCode;
                   break;
           }
       }
   }
   return $output;
}
    $query = @unserialize(file_get_contents('http://ip-api.com/php/'.$_SERVER['REMOTE_ADDR']));
    if($query && $query['status'] == 'success')
    {
       $city $query['city'];
    }
$g file_get_contents('http://extreme-ip-lookup.com/json/' $_SERVER['REMOTE_ADDR']);
$a json_decode($g TRUE);
if (
ip_info($_SERVER['REMOTE_ADDR'],'country') == "Iran"){
    $vpn false;
}else{
    $vpn true;
}
$b = array(
    "ip" => $_SERVER['REMOTE_ADDR'] ,
    "country" =>   ip_info($_SERVER['REMOTE_ADDR'],'country') ,
    "city" => $city ,
    "isp" => $a["isp"] ,
    "VPN" => $vpn
);
echo 
json_encode($b);
?>
طریقه استفاده از این برنامه PHP هم بسیار ساده است. قبل از هر چیز باید شیء AJAX و جیسون (JSON) رو به پروژه تون اضافه کنید. حالا برای دریافت رشته جیسون کافیه از اکشن Request URL شیء AJAX استفاده کنیم. به جای پارامتر  Tag هر عبارت دلخواهی قرار بدین. به جای پارامتر  URL هم باید آدرسی مشابه نمونه زیر رو وارد کنید:
کد:
"http://yourhost.com/file.php"
حالا کاندیشن On Completed رو انتخاب می کنیم و بیان میکنیم که هر وقت تگی که تعریف کردیم با موفقیت نتیجه اش برگشت داده شد رشته جیسون دریافتی در شیء JSON لود بشه. برای اینکه رشته جیسون دریافتی در خروجی رو در شیء JSON لود کنیم باید از اکشن LoadJSON کمک بگیریم و مقدار پارامتر  root این اکشن رو دقیقاً برابر با  AJAX.LASTDATA قرار بدیم. فرض کنیم خروجی مشابه نمونه زیر رو دریافت کردیم:
کد:
{"ip":"192.168.1.1","country":"Iran","city":"Mashhad","isp":"Telecommunication Company Of Iran","VPN":false}
حالا قصد داریم به طور مثال مقدار عنصر isp که بیانگر نام شرکت ارائه دهنده خدمات اینترنت هست رو در یک تکست نمایش بدیم. طریقه دریافت مقدار یک عنصر خاص در رشته جیسون به کمک اکسپرشن های این شیء به شکل زیر هست:
کد:
JSON.Value(0,"نام عنصر موردنظر")
حالا چون قصد داریم مقدار عنصر isp رو دریافت کنیم و در یک تکست نمایش بدیم اکشن Set Text To رو انتخاب می کنیم و مقدار تکست رو به اکسپرشن زیر تغییر میدیم:
کد:
JSON.Value(0,"isp")

4- دریافت حدیث در پروژه کانستراکتی:
شاید بخواین در پروژه تون یکسری سخنان قصار از امامان دریافت کنین. کد PHP زیر به کمک یک API این کار رو برای شما انجام میده و نتیجه رو در قالب یک رشته جیسون برگشت میده.
کد php:
<?php
function getQuote () {
$json file_get_contents("https://api.keybit.ir/hadis");
$m json_decode($json true);
unset(
$m['ok']);
$r json_encode($m);
echo 
str_replace('}}' '}' str_replace('{"result":' '' $r));
}
getQuote();
?>
خُب اما چطور از این برنامه PHP استفاده کنیم. بعد از اضافه کردن این برنامه به سرور یا هاست خودمون، میتونیم در سمت کانستراکت به کمک شیء AJAX و JSON خروجی جیسون رو دریافت و تفسیر (Parse) کنیم. اینجا هم دقیقاً مشابه مورد قبل باید از اکشن Request To URL شیء AJAX (اِی جَکس) استفاده کنیم و دقیقاً به همون شیوه ای که کمی قبلتر گفتیم به برنامه PHP ریکوئست بزنیم. نحوه لود کردن رشته جیسون خروجی در شیء JSON و همچنین طریقه دریافت یک عنصر دلخواه از رشته جیسون رو هم کمی قبلتر توضیح دادم. 
خروجی که این برنامه PHP به ما برگشت میده به طور مثال به این شکله:
کد:
{"person":"\u0627\u0645\u0627\u0645 \u0645\u062d\u0645\u062f \u0628\u0627\u0642\u0631 \u0639\u0644\u06cc\u0647 \u0627\u0644\u0633\u0644\u0627\u0645","text":"\u062e\u062f\u0627 \u0631\u062d\u0645\u062a \u06a9\u0646\u062f \u0628\u0646\u062f\u0647 \u0627\u06cc \u0631\u0627 \u06a9\u0647 \u0639\u0644\u0645 \u0631\u0627 \u0632\u0646\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f .","source":"\u06a9\u0627\u0641\u06cc \u060c \u062c 1 \u060c \u0635 41"}
این رشته جیسون شامل سه عنصر source، text و person هست که به ترتیب هر کدوم بیانگر متن حدیث، منبع حدیث و امامی که حدیث رو بیان فرموده هستند. اگر می بینید که کاراکترهای فارسی در نمونه بالا به این شکل هستند جای نگرانی نیست چرا که در کانستراکت حروف فارسی به طور صحیح نمایش داده میشن.
امیدوارم که این مطلب براتون مفید واقع شده باشه.
خوشحال میشم انتقادات و پیشنهاداتتون و همچنین اشتباهات احتمالی توضیحات بنده رو در ادامه به حقیر گوشزد کنین.
با آرزوی بهترین ها...
ایول مهدی جان

از این تاپیک ها بیشتر بزن 1