mvc در php


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

 

طرح های زیادی رو در مورد ام وی سی توی نت دیدم و نگاشون کردم و این وسط هم چند سالی هست که دارم باهاش سرو کله می زنم ... بعد از طراحی فریم ورک چیتا هم عمیقا به فکر فرو رفتم که این طرح ام وی سی که توی اکثر فریم ورک ها داره پیاده میشه ناقصه ... مثلا توی yii  وقتی از $this  استفاه می کنیم داریم به متدهای کنترلر اشاره می کنیم و این با ام وی سی در تناقضه ... بعضی ها هم می گن که ام وی سی بر اساس هر زبان برنامه نویسی باید یه سری تغییرات داشته باشه که خب اینم تقریبا قابل قبوله ...

برای مثال توی شی گرایی اگر وقتی یک متد protected میشه فقط توی کلاسهایی که از هم extend شدن میشه از اون متد استفاده کرد ولی توی اندروید(جاوا) متدهای پروتکتد برای کلاس های عضو یک پکیج(فولدر)  قابل درسترسی هستند حتی اگه اون کلاس ها از هم اکستند نشده باشن ... خب این تناقضه ولی وجود داره ...

در مورد ام وی سی های پیاده شده هم همینطور

خب یه بار ام وی سی رو بررسی می کنیم :

کنترلر : کنترلرها کلاس هایی هستند که به عنوان مغذ سیستم کار می کنن ... اونها داده ها رو از یوزر می گیرن و با استفاده از مدل اون ها رو پردازش می کنن و بعد هم توی ویو به یوزر نمایش می دن

مدل : مدل ها جای پردازش داده ها هستن و اکثرا هم فقط کار با دیتابیس رو انجام میدن ... مدل ها پردازش رو بر اساس درخواست کنترلر انجام میدن یعنی هر گاه کنترلر درخواستی داشته باشه و داده ای رو بخواد پردازش کنه اون رو پردازش می کنن و به کنترلر بر می گردونن .. چیزی که خیلی مهمه اینه که مدل ها نباید به متدهای داخل کنترلر دسترسی داشته باشن

ویو : ویو یه فایل پی اچ پی هستش که مقادیری رو که کنترلر بهش پاس داده رو به یوزر نمایش می ده ... نکته های ویو ... نباید به متدهای کنترلر و یا مدل دسترسی داشته باشه و در کل هیچ پردازشی نباید توی ویو انجام بشه و کارش صرفا نمایش اطلاعاته

خب این کلیت کار ام وی سی بود ... با این حساب $this ‌نباید توی ویو به هیچ متدی اشاره کنه .

چیزی که بیشتر وقت ها منو درگیر می کنه اینه که وقتی یه مدل به یه داده توی کنترلر نیاز داره چطوری اون رو بگیره ... خب شاید جواب این باشه که اون رو همراه با متد از کنترلر بخواد که گاهی این اتفاق شدنی نیست . این وسط چاره کار رو توی هلپر ها پیدا کردم

Helper : هلپرها یه سری کلاس هستن که پردازشهای مشترک بین مدل ویو و کنترلر رو انجام میدن و اکثرا هم برای کم کردن حجم کد استفاده میشه ... توی مجنتو هلپرها به توسط مدل و ویو و کنترلر قابل دسترسی هستن ...

توی فریم ورک چیتا هلپرها رو ایجاد کردم و به راحتی میشه اون ها رو از طریق کنترلر و یا شی اصلی فریم ورک chita::hepler فراخوانی کرد و از اون ها استفاده کرد .

در اینده در مورد بلاک هم می نویسم :)

 

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

تغییر ادرس لوکال هاست


شاید واسه شما هم پیش اومده باشه که بخایین بجای زدن ادرس localhost  با یه ادرس دیگه وارد لوکال هاستون بشن

برای این کار وارد مسیر زیر بشید

C:\WINDOWS\system32\drivers\etc

حالا فایل hosts  رو با یه ادیتور (نوت پد ) باز کنید ...

این خط رو در اخر فایل وارد کنید

127.0.0.1 pop.com

حالا به جای زدن localhost  توی مرورگردتون ادرس pop.com  رو بزنید و وارد لوکال هاستتون بشین

 

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

تغییر پورت لوکال هاست


شاید واسه شما هم پیش اومده باشه که وقتی میخاید اپاچی رو رن کنید ارور میده .. و وقتی برسی می کنید می بینید که پورت 80 که وسه لوکال هاست به کار می ره توسط یه برنامه ی دیگه (اکثرا اسکایپ) استفاده میشه

راه حل اول : قید اسکایپ رو بزنید :)

راه حل دوم پورت لوکال هاست رو تغییر بدید

من خودم از xampp  استفاده می کنم و به امید اینکه شما هم از این برنامه ی عالی استفاده کنید روش تغییر پورت رو روی این برنامه واستون توضیح میدم

نکته : نگران نباشید ... این برنامه هاlampp  یا  wampp یا  xampp  یا eaysphp  سر وته یه کرباسن فقط یکشون امکانات بیشتر و به روزتری در اختیارتون قرار می ده :)

مرحله ی 1 : وارد کنترل پنل بشین و روی دگمه ی cnofig   کلیک کنید و از اونجا فایل httpd.conf رو انتخاب کنید.

اگه این فایل رو پیدا نکردید نگران نشید وارد پوشه ی اپاچی بشین و یه کمی بگردین به احتمال زیاد همون گوشه ها باشه :)

توی این فایل دنبال این خط بگیردن

#Listen 12.34.56.78:80

Listen 80

خب فک کنم راحت باشه ... به جای عدد 80 یه عدد دیگه قرار بدین .. مثلا 81 ... از پورت های پرت مثلا 1234 استفاده کنید ،پورتی که مطمئن هستید توسط یه برنامه ی دیگه استفاده نمی شه . فایل رو ذخیره کنید ...

مرحله ی  2: این بار دنبال فایل httpd-ssl.conf بگردین ... فک کنم پیدا کردنش کاری نداره .. نه ؟

خب حالا دنبال این خط بگردین Listen 443 و عدد رو به یه عدد دیگه تغییر بدین مثلا 4434

و این فایل رو هم ذخیره کنید .

مرحله ی 3 : وارد پنل xampp  بشین و روی کانفیگ کلید کنید (همون کانفیگ اصلی ) ... حالا یه پنجره باز میشه و تو اون پنجره روی Service and Port Settings کلیک کنید ... توی سربرگ اپاچی دوتا مقداری رو که توی فایل های بالا وارد کردید وارد کنید

سپس ... اپاچی رو ریستارت کنید

فک کنم اگه مراحل رو درست رفته باشید همه چی حل باشه

______________________

apache http server has encountered a problem and needs to close xampp

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

ساخت وب سرویس


سلام

توی بیشتر ارتباط های بین دوتا وبسایت یا وبسایت و برنامه ی دسکتاپ نیاز هست یک وبسرویس نوشته بشه تا جوابگوی ارتباط بین سایت و برنامه باشه

در این اموزش سعی می کنم با زبان ساده اموزش ساختن یک وبسرویس رو اموزش بدم 

<?php
//include library file :)
require_once 'lib/nusoap.php';

//create abject from nusoap
$server= new nusoap_server();

///config WSDL file
$server->configureWSDL('new wsdl','http://localhost:81/test');

//register  function and set value type
$server->register('myFunction',
  array('value'=>'xsd:string'),///input
  array('result'=>'xsd:string'), ///out put
  'http://localhost:81/test'//name space

);
///create function
function myFunction($value)
{
  $result=$value;
  return $result;
}

// create HTTP listener
$HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';

$server->service($HTTP_RAW_POST_DATA);
exit();
?>

 

این کد واسه سمت سروره ...

اول کتاب خانه های nusoap رو اینکلود می کنیم .... اگه این کتاب خانه ها رو ندارید نگران نباشید .... در انتها همراه با فایل اموزش این کتابخانه ها رو هم قرار دادم .... 

البته میتونید از ادرس http://sourceforge.net/projects/nusoap/ کتابخانه ها رو دریافت کنید ....

مرحله ی بعد یک شی از nusoap_server می سازیم .

configureWSDL : با استفاده از این تابع واسه سیستم توضیح میدیم که میخاییم از نوع درخاست wsdl  استفاده کنیم . این تابع دو مقدار می گیره ... مقدار اول اسم تابع و دومی هم name space  هستش ... (امیدوارم بدونین name space چیه :) )

چند خط بعدی رو ول کنید ... بعد در موردشون توضیح می دم .... ما یه تابع میسازیم که می تونه یه سری ورودی بگیره و یه خروجی داشته باشه ... این تابع همون کاریه که وبسرویس ما قراره انجام بده ... مثلا ما می تونیم افراد انلاین وبسایت رو از روی یه سایت دیگه بدست بیاریم یا نه دوستان یک فرد رو ... من به صورت مثال myFunction رو تعریف کردم که یه مقدار رو می گیره و همون مقدار رو هم بر می گردونه

خب بریم سراغ اینکه بخاییم تابع رو توی سیستم ریجستر کنیم

register : با استفاده از این تابع ما تابع خودمون همچنین نوع ورودی و خروجی و name space  و ... توی وبسرویس ریجستر می کنیم .

ورودی اول اسم تابع و دومی مقادیری که تابع می گیره و نوعشون به صورت ارایه و سومی هم مقادیر خروج و نوعشون و name space

service : با استفاده از این تابع و درکل 3 خط اخر یک گوش دهنده به درخاست تعریف می کنیم

 

بریم سراغ کدهای سمت کاربر

<?php
require_once ('lib/nusoap.php');

$client=new nusoap_client('http://localhost:81/test/web.php?wsdl',true);

$result=$client->call('myFunction',array('value'=>'adffbc'));
var_dump($result);

?>

اول کتابخانه ها رو اینکلود می کنیم 

یک شی از کلاس nusoap_client میسازم... مقدار اول ادرس سرور هستش و مقدار دوم فایل wsdl ...  دقت کنید اگه میخاید از wsdl  استفاده نکنید مقدار دوم رو برابر false قرار بدین .

call : با استفاده از این تابع ، تابعی رو که به وبسرویس معرفی (ریجستر) کرده بودیم رو صدا می زنیم .

و در اخر هم از مقادریر که تابع بر می گردونه پرینت می گیریم

نمایش کد روی github

دانلود نمونه کد

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

بدست اوردن ip


با این کد ip  دقیق کاربر رو بدست بیارین ...

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
  $ip = $_SERVER['REMOTE_ADDR'];
}
echo $ip;

 

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

کار با curl


سلام

چیزی رو که چند روزه درگیرشم ایجاد یه حمله ی Ddos هستش و مشکل اصلی اینجاست که نمی دونم چجوری پس از چند دقیقه ip  رو عوض کنم تا شناسایی نشم ...

حالا اینکه این حمله رو واسه چی میخام و به چ دردم میخوره بماند ... این هم یه اموزش ساده واسه کار با توابع curl

//start curl
$curl = curl_init('http://www.example.com/submit/get.php');
//set post method for sending var
curl_setopt($curl, CURLOPT_POST, 1);
//set data for sending
curl_setopt($curl, CURLOPT_POSTFIELDS, 'example1=content_1&example=content_2&example1=content_3');
//set answer from host
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
//action curl
$result = curl_exec($curl);
/// show error
echo curl_error($curl)
//end curl
curl_close($curl);

 

curl_init : یک نشست رو شروع می کنه .

curl_setopt : بیشتر کارمون با این تابعه ... و مقادیری که می گیره باعث مدیریت نشست میشه

CURLOPT_POST : این مقدار باعث میشه که به نشست بفهمونیم که میخوایم یه سری مقادیر رو به صورت post  ارسال کنیم .

CURLOPT_POSTFIELDS : فک کنم از اسمش پیداست :) .... فیلد های post رو مشخص میکنه

CURLOPT_RETURNTRANSFER : با این مقدار به نسشت می فهمونیم که ایا از روی هاست مقداری برگشت داده بشه یا نه( در کل به نشست می فهمونیم که ایا منتظر مقدار باشه یا نه)

curl_exec : این تابع باعث میشه که نشست اجرا بشه

curl_error : خطاها رو بر می گردونه

curl_close : نشست رو می بنده ....

توضیحات بیشتر ... در اموزش های بعد

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

عکس بند انگشتی با php


با این کلاس ساده می تونین از رو عکس بزرگتر یه عکس کوچک ایجاد کنید .

با این کار جایی هایی که لزمی به استفاده از عکس اصلی نیست از عکس بند انگشتی استفاده کنید .

این کار چندتا مزیت داره ... یکی بالا بردن سرعت لود سایتتون و دومی هم بحث امنیتی اون هست .... وقتی از روی یک عکس یک کپی میزنین در صورتی که اون عکس به جای عکس یک شل باشه از اپلود شل جلوگیری می کنید

 

شل چیه و چجوری از اپلودش جلوگیری کنیم رو توی چندتا پست به صورت مفصل بحث خواهم کرد .

class Tools
{
    static function FileType($name)
    {
        $type=explode(".", strtolower($name));
        return strtolower(end($type));
    }

    static function FileThumbs($name, $DirFrame, $DirTo, $Ourheight = '128', $Ourwith = '128')
    {
        $type = self::FileType($name);
        if ($type == "png") {
            $img = imagecreatefrompng($DirFrame . $name);
            $width = imagesx($img);
            $height = imagesy($img);
            $new_width = $Ourwith;//پهنا
            $new_height = $Ourheight;//ارتفاع
            $tmp_img = imagecreatetruecolor($new_width, $new_height);
            imagecopyresized($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
            imagepng($tmp_img, $DirTo . $name);
        }
        /// jpg img //

        if ($type == "jpg") {
            $img = imagecreatefromjpeg($DirFrame . $name);
            $width = imagesx($img);
            $height = imagesy($img);
            $new_width = $Ourwith;//پهنا
            $new_height = $Ourheight;//ارتفاع
            $tmp_img = imagecreatetruecolor($new_width, $new_height);
            imagecopyresized($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
            imagejpeg($tmp_img, $DirTo . $name);
        }
}

 

نحوه ی استفاده

        Tools::FileThumbs($_FILES['img']['name'],"file/article/","file/article/tmp/");

فک کنم توضیح خاصی نخاد ... تابع اول میاد نوع تایپ رو از روی پسوند فایل بدست میاره و توی تابع دوم بسته به اینکه عکستون png باشه یا jpg  میاد از رو عکس یه کپی میزنه

دوتا متغییر اخری هم اندازه ی عکس رو مشخص می کنن که من به صورت پیش فرض روی 128*128 قرار دادم

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php

بدست اوردن زمان به صورت قبل


با استفاده از تابع زیر می تونین زمان رو به صورت قبل بدست بیارین

مثلا 18 ساعت قبل و یا ....

 function time_ago($tm, $lang = 'fa', $ashtml = true)
        {
            $local = array('style' => array('fa' => 'style="direction:rtl;"', 'en' => 'style="direction:ltr"'), 'times' => array('fa' => array('ثانیه', 'دقیقه', 'ساعت', 'روز', 'هفته', 'ماه', 'سال', 'دهه'), 'en' => array('second', 'minute', 'hour', 'day', 'week', 'month', 'year', 'decade')), 'ago' => array('fa' => 'پیش', 'en' => 'ago'));
            if (intval($tm) > 0) {
                $cur_tm = time();
                $dif = $cur_tm - $tm;
                $lngh = array(1, 60, 3600, 86400, 604800, 2630880, 31570560, 315705600);
                for ($v = sizeof($lngh) - 1; ($v >= 0) && (($no = $dif / $lngh[$v]) <= 1); $v--)
                    ;
                if ($v < 0)
                    $v = 0;
                $_tm = $cur_tm - ($dif % $lngh[$v]);
                $no = floor($no);
                if ($no <> 1 && $lang == 'en')
                    $local['times'][$lang][$v] .= 's';
                $x = sprintf("%d %s ", $no, $local['times'][$lang][$v]);
                if ($ashtml)
                    return " " . $x . ' ' . $local['ago'][$lang] . "";
                else
                    return $x . ' ' . $local['ago'][$lang];
            } else {
                return '-';
            }
        }

 

با دو زبان فارسی و انگلیسی ...فک کنم توضیح خاصی نخاد ... سوالی بود توی کامنت ها بپرسین

۱۳۴۸/۱۰/۱۱ || in category : پی اچ پی php