پی اچ پی
مکتبخانهی استاتیکیه
منابع استاتیک خواصی داره که در شرایط خاص میتونه بهینگی ایجاد کنه و گاهی نجاتبخش باشه.
منابع استاتیک رو میشه به یک متغیر داخل تابع اختصاص داد و یا در کلاسها استفاده کرد با مدل اول کاری ندارم چون به نظرم به درد نمیخوره.
در برنامهنویسی شیگرا و در کلاسها، براساس توضیح سایت PHP، منابع استاتیک امکان فراخوانی بدون نمونهگیری رو فراهم میکنه.
یعنی فقط با استفاده از نام کلاس میتونیم به یک مقدار استاتیک اون کلاس دسترسی داشته باشیم.
در زیر نکات مربوط به این کلمهی کلیدی بصورت خلاصه آورده شده:
تعریف مشخصههای استاتیک: در مقدار فقط میشه از مقادیر ثابت استفاده کرد.
class A {
static public $name = 'Amir Hossein'; // Correct!
static public $family = touppercase('hp'); // Wrong!
static public $zone = 'Asia'.'/'.'Tehran'; // Wrong!
}
فراخوانی خارج از کلاس:
class B {
static public $name = 'Amir Hossein';
}
echo B::$name; // Amir Hossein
فراخوانی متد استاتیک خارج از کلاس و تعریفش:
class C {
static public function hello($name){
echo 'Hello '.$name;
}
}
echo C::hello('Amir Hossein'); // Hello Amir Hossein
مقادیر استاتیک یک مقدار بیشتر نیستند اگر تغییر کنند همهجا تغییر میکنند. در نمونهی زیر یک مشخصه خارج از کلاس مقدارش تغییر کرده و میبینی که مقدار قبلیش دیگه وجود نداره:
class D {
static public $name = 'Amir';
static public function hello($greeting){
echo $greeting .' '. self::$name;
}
}
D::hello('Hello'); // Hello Amir
D::$name = 'Hossein';
D::hello('Hello'); // Hello Hossein
در متدهای استاتیک نمیشه از کلمهی کلیدی this$ استفاده کرد چون this$ یک مقدار داینامیکه.
class A {
static public $name;
public $gender;
public function correct(){
self::name = 'Hossein';
$this->$gender = 'Male';
}
static public function wrong(){
self::name = 'Amir Hossein';
$this->$gender = 'Male'; // Wrong!
}
}
تفاوتی نمیکنه کلمهی کلیدی static قبل یا بعد از public/protected/private قرار بگیره یا بعدش. یه سری اول میذارند تا سریع بتونند منابع استاتیک رو تشخیص بدند و یک سری ترجیح میدند برعکس عمل کنند تا سطح دسترسی رو اول ببینند.
کاربرد استانیک به این صورته که، در کلاسها وقتی تابعی نوشته میشه واقعا با جریان اطلاعات در کلاس درگیر نیست رو استاتیک میکنند تا در کارکرد PHP بهینگی ایجاد شه. مثلا در یک کلاس یک تابع Validator داریم که متغیرش رو چک میکنه که معتیر باشه. از اونجاییکه این تابع ربطی به روند کلاس نداره میتونه استاتیک باشه:
class A {
public function __construct($phone){
if( self::validate($phone) )
echo 'Valid';
else
echo 'Invalid';
}
static public function validate($int){
return is_numeric($int);
}
}
$a = new A(567); // Valid
$b = 'Boplo';
if( A::validate($b) )
echo 'OK';
کاردبرد دیگهی استانیک اینه که میتونیم از کپی شدن منابع جلوگیری کنیم. مثلا در الگوی Singleton ما کاری میکنیم تا فقط یکبار بشه از یک کلاس نمونهگیری کرد و این نمونه رو همهجا در دسترس داشت:
class A {
static public $instance;
public $name;
private function __construct(){
$this->name = 'Amir Hossein';
}
static public function getInstance(){
if(!isset(self::$instance))
self::$instance = new self;
return self::$instance;
}
}
$name = A::getInstance()->name;
echo $name; // Amir Hossein
$a = A::getInstance();
echo $a->name;
$a = new A; // ERROR
از اونجاییکه متد construct از نوع private هست نمیشه مستقیم اجراش کرد تنها راه دسترسی بهش، یک تابع درون خود کلاس هست. با این کار فقط یک نمونه از کلاس تولید میشه و همهجا در دسترسه. که البته این الگو نکاتی هم داره.
نکتهی مهم و جدید، ارثبری در منابع استاتیک هست. همونجور که میبینی با کلمهی کلیدی self به منابع استاتیک در درون کلاس دسترسی داریم:
class Father {
static public $name = 'Father';
static public say(){
echo self::$name;
}
}
class Son extends Father {
static public $name = 'Son';
}
class Baby extends Son {
static public $name = 'Baby';
}
Father::say(); // Father
Son::say(); // Father
Baby::say(); // Father
همونجور که میبینی self در اینجا معلوم نیست کدوم مقدار رو باید استفاده کنه و خب از مقدار واقعی خودش استفاده میکنه!
برای این مشکل در نسخهی 5.3 قابلیتی با عنوان Late Static Binding ایجاد شد که میگه در چنین حالتی بجای self از کلمهی static استفاده کنید تا PHP بره مقدار متتاظر رو استفاده کنه:
class Father {
static public $name = 'Father';
static public say(){
echo static::$name;
}
}
class Son extends Father {
static public $name = 'Son';
}
class Baby extends Son {
static public $name = 'Baby';
}
Father::say(); // Father
Son::say(); // Son
Baby::say(); // Baby
همونجور که میبنی در تابع say بجای self از static استفاده کردم که باعث میشه PHP هوشمندانهتر عمل کنه.
موفق باشید
برچسب ها: solution,tips
یه مشت حرف به دردبخور
من صندوقچهی فهموشعور PHPی خودم رو تکوندم یه سری نکته ازش ریخت بیرون. نکاتی که برای پیدا کردن بعضیهاش باید اینترنت رو زیر و رو کنیم یا نکاتی سادهای که ازشون خبر نداشتیم. خیلی سعی کردم هر چی به ذهنم میرسه لیست کنم. یه لیست ۴۴تایی شد که ممکنه بعدا باز هم بهش اضافه کنم.!
مقاله برای سطح دانش خاصی نیست. از نکات خیلی ساده و ابتدایی درش هست تا نمونههای تخصصی.
برای مطالعهی این نکات، به ادامهی مطلب مراجعه بفرمایید.
همچنین فهرست عناوین هم در زیر قرار گرفته:
برچسب ها: function,solution,tips
یک تابع ساده برای خلاصه سازی و کوتاه سازی متن مثل بعضی بلاگها که خلاصه متن رو در صفحه اول نمایش میدهند. کار ویژه ای که این تابع میکنه اینه متن رو تا حد امکان خراب نمی کنه.
نحوه کارش به این صورته که مثلا عدد 500 رو به عنوان تعداد کاراکتر میگیره و عدد مثلا 100 به عنوان Offset. از کاراکتر 500 شروع میکنه 100 کاراکتر به عقب برمیگرده تا به نقطه یا کاما یا خط جدید یا ... برسه (اینها نشانه های اتمام جمله هستند). وقتی پیدا کرد متن رو همونجا جدا میکنه.
اگر چیزی پیدا نکرد، 100 کاراکتر به جلو میره تا پایان جمله رو پیدا کنه. اگر چیزی پیدا نکرد نزدیکترین فاصله رو از کاراکتر 500 انتخاب میکنه.
نکته مهم اینه که این تابع از توابع ساده ی PHP برای String استفاده میکنه که با فارسی بصورت یونیکد برخورد میکنند برای نمونه تعداد کاراکترهای یک متن فارسی رو دو برابر یک متن انگلیسی در نظر میگیرند. پس باید دقت کنیم که موقع استفاده از این تابع هر تعداد کاراکتری که به عنوان limit و offset برای فارسی استفاده میکنیم باید دو برابر مقداری باشه که برای غیرفارسی بکار میبریم تا نتیجه معقول باشه.
لطفا قبل از مصرف، توضیحات و پارامترهای تابع رو کامل مطالعه بفرمایید.
/**
* Summarize text
* Author AHHP ~ Boplo.ir
*
* @param string $str Text to summarize.
* @param integer $limit Number of characters to trim.
* @param integer $offset Number of characters to
* move backward and/then forward of $limit
* for finding line/sentence/word ending.
* @param array $endlineChars Known characters as
* line/sentence/word ending characters.
* @return string Summarized string.
*
* Please note that
* Length of a latin text is NOT equal to a
* Unicode text in PHP (Farsi is Unicode).
* It means PHP counts e.g. 100 Farsi characters
* as 200 characters. So you should use bigger
* numbers as $limit and $offset parameters
* while using this function for Farsi texts.
*/
function summarize($str, $limit=600, $offset=100, $endlineChars=array('.','!','?',"\n",')',';',',','؟','،')) {
if(strlen($str)<=$limit)
return $str;
for($i=$limit; $i>$limit-$offset; $i--) {
if(in_array($str{$i}, $endlineChars)) {
$length = $i;
break;
}
if(!isset($spaceLength) && $str{$i}==' ')
$spaceLength = $i;
}
if(isset($length))
return substr($str, 0, $length+1);
for($i=$limit; $i<$limit+$offset; $i++) {
if(in_array($str{$i}, $endlineChars)) {
$length = $i;
break;
}
if(!isset($spaceLength) && $str{$i}==' ')
$spaceLength = $i;
}
if(isset($length))
return substr($str, 0, $length+1);
if(isset($spaceLength))
return substr($str, 0, $spaceLength);
return substr($str, 0, $limit+1);
}
برچسب ها: function,solution
PDO چیست؟
۱۰ بهمن ۱۳۸۹ ساعت ۰۱:۴۸
معرفی افزونه PDO برای دستیابی بهتر به دیتابیس
PDO یک افزونه سبک و قدرتمند PHP برای به دیتابیسه . از خصوصیات خوب این افزونه که از نسخه 5.1 روی PHP نصب شده موارد زیر است:
- پشتیبانی از دیتابیسهای متنوع از جمله MySQL، MsSQL، SQLite و غیره با توابع ثابت.
امکان فوق العاده PDO که اجازه میده تا بدون تغییر کدها، دیتابیس رو تغییر بدیم. یعنی مثلا اگر Applicationای با MySQL ساخته باشیم و تحت شرایطی مجبور به تغییر دیتابیس به MsSQL باشیم، اگر سینتکس کوئری ها مشکلی ایجاد نکنه، کافیه دیتابیس رو تعویض کنیم و همین. برای سیستمهای بزرگ این یک مزیت خیلی مهمه.
- پشتیبانی از Exceptionهای PHP.
Exceptionها امکان کنترل و بدست گیری خطاها رو به برنامه نویس میده. PDO امکان کنترل خطاهای دیتابیس رو هم بهمون میده.
- پشتیبانی از Prepared Statement و Stored Procedure ها و Multiple Recordset.
این سه مورد هیچ کدوم توسط توابع کثافت MySQL اجرا نمیشند. PDO مورد آخر رو در حال حاضر برای MySQL پشتیبانی نمی کنه.
- طراحی شده به شکل کلاس.
قابلیت مهمی که امکان گسترش و شخصی سازی PDO رو میده مثلا رفتار توابعش رو تغییر بدیم یا توابع جدیدی بهش اضافه کنیم و در واقع همه امکانات شی گرایی رو باهاش داشته باشیم.
PDO از سه تا کلاس تشکیل شده:
- کلاس اصلی به نام PDO که حاوی توابع اصلی مثل اجرای کوئری و اتصال و غیره است.
- کلاس با نام PDOStatement حاوی توابع برای پردازش و بهره گیری از کوئری های اجرا شده است مثل fetch.
- کلاس PDOException برای بدست گیری خطاهای رخ داده.
این موارد همه
در ادامه، به همراه آموزش ابتدایی، بیشتر توضیح داده خواهند شد.
برچسب ها: mysql,pdo,solution
تابع get_mime
تابع زیر حاوی یک آرایه شامل پرکاربردین پسوندهاست که با دادن نام فایل میتونیم MIME Content-Type فایل رو بگیریم.
این تابع دو روش استاندارد رو امتحان میکنه در صورت نتیجه نگرفتن از آرایه استفاده میکنه.
/**
* Returns MIME Content-Type By filename
*
* @param string $filename File name or path
* @return string New MIME-Type
*/
function get_mime($filename) {
if(function_exists('finfo_file')) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mime;
}
if(function_exists('mime_content_type')) {
return mime_content_type($filename);
}
$map = array(
'txt'=>'text/plain','htm'=>'text/html',
'html'=>'text/html','php'=>'text/html',
'css'=>'text/css','js'=>'application/javascript',
'json'=>'application/json','xml'=>'application/xml',
'swf'=>'application/x-shockwave-flash',
'flv'=>'video/x-flv','png'=>'image/png',
'jpe'=>'image/jpeg','jpeg'=>'image/jpeg',
'jpg'=>'image/jpeg','gif'=>'image/gif',
'bmp'=>'image/bmp','tiff'=>'image/tiff',
'ico'=>'image/vnd.microsoft.icon',
'tif'=>'image/tiff','svg'=>'image/svg+xml',
'svgz'=>'image/svg+xml','zip'=>'application/zip',
'rar'=>'application/x-rar-compressed',
'exe'=>'application/x-msdownload',
'msi'=>'application/x-msdownload',
'cab'=>'application/vnd.ms-cab-compressed',
'mp3'=>'audio/mpeg','qt'=>'video/quicktime',
'mov'=>'video/quicktime','pdf'=>'application/pdf',
'psd'=>'image/vnd.adobe.photoshop',
'ai'=>'application/postscript',
'eps'=>'application/postscript',
'ps'=>'application/postscript',
'doc'=>'application/msword','rtf'=>'application/rtf',
'xls'=>'application/vnd.ms-excel',
'ppt'=>'application/vnd.ms-powerpoint',
'odt'=>'application/vnd.oasis.opendocument.text',
'ods'=>'application/vnd.oasis.opendocument.spreadsheet'
);
$ext = end( explode('.',strtolower($filename)) );
return (array_key_exists($ext, $map) ?
$map[$ext] : 'application/octet-stream');
}
// Examples
echo get_mime('F:/Wamp/www/test.zip'); // application/zip
echo get_mime('test.flv'); // video/x-flv
echo get_mime('http://boplo.ir/path/test.css'); // text/css
با تشکر از ایشون.
برچسب ها: function,solution
YADC) Yet Another Date Converter)
من دو سال پیش تابع ()date در PHP رو به شکل یک کلاس شمسی کردم و در این سایت قرار دادم. یه سری داونلود کردند و احتمالا استفاده کردند. حالا نسخه جدید این کلاس رو با امکانات بیشتر می تونید دریافت کنید یا نمونه قدیمی خودتون رو بروز کنید. تغییرات در نسخه 2.0.0 به شکل زیر هستند:
- اضافه شدن متد جدید برای شبیه سازی تابع ()mktime
- اضافه شدن متد جدید برای شبیه سازی تابع ()getdate
- رفع باگ
- اضافه شدن امکان نمایش اعداد بصورت فارسی
نکته مهم اینکه نام کلاس و نام متد date تغییر کرده ولی این کلاس با نمونه های قبلی هم سازگاره یعنی اگر قصد بروزرسانی کلاس رو داری لازم نیست بری هرجا کلاس رو استفاده کردی، تغییر بدی. کافیه کلاس جدید رو با نمونه قبلی تعویض کنی.
کلی توضیح و تفسیر داریم که تو دنباله مطلب بخون و همونجا داونلود کن.
برچسب ها: function,solution
MVC چیست؟
۱۹ شهریور ۱۳۸۹ ساعت ۰۴:۴۲
اشنایی با مفهوم MVC
الگوهای طراحی صرفا روشهایی برای نظم دادن و ساختار بخشیدن به Applicationها هستند. وجودشون به هیچ وجه الزامی نیست ولی مفید هستند مگر اینکه روش ما روش بهتری برای خودمون و Applicationامون باشه.
MVC یکی از الگوهای پرکاربرد PHP هست که تقریبا جوابگوی هر نوع Applicationای می تونه باشه و مخفف سه کلمه View ، Model و Controller هست.
مفهوم MVC براساس جداسازی بخشهای اساسی تعریف شده. به این صورت که کدها رو به سه بخش View، Model و Controller تقسیم کنیم تا کنترل و توسعه کدها به بهترین شکل ممکن انجام بشه.
این سه بخش به این شکل تعریف میشه: کدهایی برای ارتباط با دیتابیس، کدهایی برای ساختن خروجی و کدهایی برای کنترل و دسترسی به این دو بخش.
توضیح دقیقتر این سه بخش به شرح زیر است:
- Model: کدهایی برای تبادل اطلاعات با دیتابیس. این بخش مثل یک موتور عمل می کنه. هیچ ارتباطی با اتفاقات نداره فقط ازش اطلاعات درخواست می کنیم، از دیتابیس بیرون میکشه و میده.
- View: کدهایی برای سر هم کردن اطلاعات و ساختن خروجی. این بخش به هیچ عنوان کد منطقی (کد عملیاتی، کدی که کار عملیاتی انجام میده) نداره فقط اطلاعات رو میگیره تحلیل می کنه، تحت قالب قرار میده و به Controller میفرسته تا نمایش داده بشه.
- Controller: در واقع Controller بقیه کارها رو انجام میده. اینکه چه درخواستی از کاربر رسیده، چه درخواستی از Model باید بشه، اطلاعات گرفته شده از Model چطور باید پردازش بشه، چه Viewای باید انتخاب بشه و چه اطلاعاتی به View باید ارسال بشه.
در ادامه مقاله یک مثال خیلی ساده از MVC شرح داده میشه و درباره اینکه MVC در نهایت به چه درد میخوره و چطور میشه با فریم ورکهای MVC تعامل پیدا کرد، بحث میشه.
برچسب ها: solution
نحوه پیدا کردن Path و Url اسکریپت
برای ساختن کدهای انعطاف پذیر، باید مسیر فایلها رو داینامیک تعیین کنیم که همه جا کار کنه.
چند خط کد زیر اطلاعات خوبی از موقعیت فایل رو میدهند ولی تضمینی بر اینکه همه جا کار کنند نیست! در حالت کلی تقریبا همه جا صحیح کار می کنه.
$baseurl = 'http'.(isset($_SERVER['HTTPS'])?'s':'').'://'
.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']).'/';
$basepath = str_replace('\\','/',dirname(__FILE__)).'/';
define('BASE_RELATIVE_URL',dirname($_SERVER['SCRIPT_NAME']).'/');
define('BASE_URL', $baseurl);
define('BASE_PATH', $basepath);
echo 'Base Relative Url: ' . BASE_RELATIVE_URL;
echo 'Base Url: ' . BASE_URL;
echo 'Base Path: ' . BASE_PATH;
برای نمونه، این کد رو در فایلی در Localhost با آدرس زیر قرار میدیم:
F:/Wamp/www/parent/child/test.php
همونجور که واضحه، URL این فایل به این شکل خواهد بود:
http://localhost/parent/child/test.php
در این حالت، خروجی کد بالا به این شکل خواهد بود:
/*
Base Relative Url: /parent/child/
Base Url: http://localhost/parent/child/
Base Path: F:/Wamp/www/parent/child/
*/
پینوشت: ممنون از سپهر عزیز که پیشنهاد اضافه کردن ['SERVER['HTTPS_$ رو دادند. باید دقت کرد ['SERVER['HTTPS_$ مقداری قطعی نیست و در برخی سرورها، با وجود استفاده از SSL این مقدار وجود ندارد. از کد زیر نیز میتوان استفاده کرد که مطمئنتر است ولی همچنان قطعی نیست:
$server_https = isset($_SERVER['HTTPS'])
&& $_SERVER['HTTPS'] == 'on';
$server_port = isset($_SERVER['SERVER_PORT'])
&& $_SERVER['SERVER_PORT'] != 80;
$scheme = ($server_https || $server_port) ? 'https' : 'http';
!-->
برچسب ها: solution
تابع نگو هلو بگو
در برنامه نويسي وب، گاهي لازم داريم که يک URL رو پردازش کنيم. مثلا از يه URL طولاني، domainاش رو بگيريم يا فقط آدرس صفحه اش رو بدست بياريم يا کوئريش رو بخونيم.
براي چنين کارايي برنامه نويسهاي ناآگاه سراغ Regular Expression ميرند در حاليکه PHP عزيز براي اين کار تابع داره که با هلويي هرچه تمامتر حتي fragment يا hash آدرس رو هم ميده.
تابع parse_url در حالت استاندارد يک URL ميگيره و آرايه اي حاوي اجزاي آدرس ميده شامل اين قسمتها:
- scheme: همون http يا https يا ftp و غيره
- host: دامنه اصلي مثل Boplo.ir
- port: پورت اگر باشه
- user: همون username اگر باشه
- pass: رمز يا password اگر ست شده باشه
- path: مسير آدرس بعد از دامين
- query: کوئري يعني کاراکترهاي بعد از علامت "?"
- fragment: يا hash يا کاراکترهايي که بعد از علامت "#" ميان
براي نمونه همون مثالي که خود PHP مطرح کرده:
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
/**
* Output:
* Array
* (
* [scheme] => http
* [host] => hostname
* [user] => username
* [pass] => password
* [path] => /path
* [query] => arg=value
* [fragment] => anchor
* )
*/
نکته مهم اين تابع اينه وقتي بجاي URL چرنديات تحويلش بديم، مقدار FALSE برميگردونه که ما بايد چک کنيم ولي بخاطر اينکه بيخود وقتش رو گرفتيم،
يک خطاي E_WARNING هم صادر ميکنه که اگر نمايش اين دسته خطاها فعال باشه، خطا ميگيرم که مي تونيم اين مشکل رو با @ حل کنيم:
if( $url = @parse_url("chetoty googooli?") ) {
echo "Host: " . $url['host'];
} else {
echo "Invalid URL entered!";
}
از نسخه 5.1.2 به اين تابع يک پارامتر دوم اضافه شده که ميشه باهاش بجاي اينکه آرايه بگيريم، فقط بخش مورد نظر رو بصورت String بگيريم. مثلا اگر ميخوايم فقط کوئري آدرس رو بگيريم پارامتر دوم رو برابر PHP_URL_QUERY قرار ميديم. نمونه:
$url = "http://boplo.ir/?loveBoplo=absolutely&loveAmirHossein=dige_poroo_nasho
echo parse_url($url, PHP_URL_QUERY);
/**
* Output:
* loveBoplo=absolutely&loveAmirHossein=dige_poroo_nasho
*/
واسه اينکه موضوع کامل بشه، وقتي به کوئري يک تابع نياز داريم، معمولا اينکه مقدار هر کليد در اون کوئري چيه به درد ميخوره. پردازش کوئري کار خيلي ساده ايه ولي براي همون کار ساده ي چند خطي هم تابعي وجود داره به نام parse_str. مثلا براي پردازش کوئري مثال قبل، اينجوري لذت ميبريم:
$url = "http://boplo.ir/?loveBoplo=absolutely&loveAmirHossein=dige_poroo_nasho
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $array);
print_r($array);
/**
* Output:
* Array
* (
* [loveBoplo] => absolutely
* [loveAmirHossein] => dige_poroo_nasho
* )
*/
از PHP لذت ببريم.
برچسب ها: function
بیرون کشیدن لیست Enum و Set از دیتابیس
یکی از روشهای ذخیره اطلاعات در MySQL استفاده از لیست از قبل تعیین شده است که کنترل کنیم فقط کلمات خاصی قابل ذخیره و بازیابی باشند. مثلا جدول زیر:
CREATE TABLE boplo_categories (
`id` INT(10) AUTO_INCREMENT PRIMARY_KEY,
`categories` ENUM('PHP', 'Web Design', 'MODx', 'IT', 'Scratch'),
`tags` SET('Solution', 'API', 'AJAX', 'CSS', 'Javascript')
)
در این جدول، ستون categories که از نوع ENUM تعیین شده، حتما با یکی از مقادیر مشخص شده می تونه پر بشه.
و ستون tags که از نوع SET ایجاد شده مانند ENUM عمل می کنه با این تفاوت که در این ستون میشه بیشتر از یکی از موارد لیست رو ثبت کرد مثلا هم CSS و هم Solution ولی ENUM فقط یک مقدار میتونه داشته باشه.
کار با ENUM و SET خیلی لذتبخشه غیر از موقعی که بخوایم لیستی که در ENUM یا SET مشخص شده رو در برنامه امون داشته باشیم. معمولترین کاردبردش ساختن <SELECT> براساس مقادیر مشخص شده است. برای اینکار باید ابتدا لیست مقادیری که بصورت ENUM یا SET مشخص شده رو توسط یک کوئری بدست بیاریم و سپس کلمات لیست رو از این مقدار خارج کنیم. در ادامه پست میخوایم لیست کلمات مشخص شده برای ستون categories که بالا قرار دادم رو بدست بیاریم.
برچسب ها: function,mysql,solution
سر و کله زدن با همه نوع ورودی فرمها در PHP
سر و کله زدن با فرم در PHP از اون مبحثهایی هست که زیاد درباره اش سوال پیش میاد مخصوصا برای کاربران تازه کار. توی این مقاله میخوایم همه سوراخ سمبه های فرمها رو با PHP کشف کنیم.
انواع فیلد و ورودی رو معرفی می کنم و شیوه دسترسی به مقدارشون در PHP رو هم توضیح میدم.
فرم زیر رو ببین. این فرم همه جور فیلد و ورودی به دردبخور رو به انواع مختلف داره. میخوایم در ادامه مقاله، این فرم رو در PHP پردازش کنیم.
<form action="submit.php" method="POST" enctype="multipart/form-data">
<input type="text" name="field_text" value="" />
<input type="password" name="field_password" value="" />
<textarea name="textarea"></textarea>
<input type="submit" name="button_submit" value="Submit Form" />
<select name="select_single">
<option value="option 1">Opt1</option>
<option value="option 2">Opt2</option>
<option value="option 3">Opt3</option>
<option value="option 4">Opt4</option>
</select>
<input type="hidden" name="field_hidden" value="some hidden data" />
<input type="checkbox" name="field_checkbox_single" value="checkbox single value" />
<input type="radio" name="field_radio" value="radio value 1" />
<input type="radio" name="field_radio" value="radio value 2" />
<input type="radio" name="field_radio" value="radio value 3" />
<input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 1" />
<input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 2" />
<input type="checkbox" name="field_checkbox_multiple[]" value="checkbox multiple value 3" />
<input type="checkbox" name="chkbx_multiple_with_key[parent]" value="chkbx mltpl with key1" />
<input type="checkbox" name="chkbx_multiple_with_key[parent]" value="chkbx mltpl with key2" />
<select name="select_mulitple[]" multiple="multiple">
<option value="option 1">Opt1</option>
<option value="option 2">Opt2</option>
<option value="option 3">Opt3</option>
<option value="option 4">Opt4</option>
</select>
<input type="file" name="field_file" MAX_FILE_SIZE="2000000" />
<input type="file" name="field_file_multiple[]" MAX_FILE_SIZE="2000000" />
<input type="file" name="field_file_multiple[]" MAX_FILE_SIZE="2000000" />
<input type="reset" name="field_reset" value="Reset" />
<input type="image" name="field_img" value="Image" />
<input type="button" name="field_button" value="Button To Click" />
</form>
برچسب ها: آموزش
شیوه نامتعارفی برای نمایش زمان
یه روش نمایش زمان، مدل چند وقت پیشه که مثلا بجای فلان زمان بنویسیم: 23 روز و 19 ساعت و 45 دقیقه پیش.
تابع زیر همین کار رو می کنه. تاریخ Timestamp میگیره و مدل "چند وقت پیش" تحویل میده. میشه توسط پارامترهاش تعیین کنیم که از سال تا ثانیه چه واحدهایی رو نمایش بده. یعنی مثلا سال و ماه و روز رو فقط نشون بده یا مثلا دقیقه و ثانیه رو نمایش نده و ....
نمونه:
$time = time() - 15*60;
echo getPastTime($time);
خروجی این خواهد بود:
15 دقیقه پیش
/**
* getPastTime : Get Past Time in String
*
*
* Author : AHHP(Amir Hossein Hodjaty Pour) ~ Boplo@Boplo.ir
* License : GPL
* Version : 1
* Created on : 1388/11/20 11:55 pm
*
* @param integer $time Unix Timestamp to parse
* @param bool $year Set to FALSE to remove Year from output. optional default to TRUE.
* @param bool $month Set to FALSE to remove Month from output. optional default to TRUE.
* @param bool $day Set to FALSE to remove Day from output. optional default to TRUE.
* @param bool $hour Set to FALSE to remove Hour from output. optional default to TRUE.
* @param bool $minute Set to FALSE to remove Minute from output. optional default to TRUE.
* @param bool $second Set to TRUE to remove Second from output. optional default to FALSE.
* @return string Formatted string
*/
function getPastTime($time, $year=true, $month=true, $day=true, $hour=true, $minute=true, $second=false) { }
برچسب ها: date,function,solution
یک تابع جمع و جور
همونطور که از عنوان مشخصه، یه تابع ساده برای inject یا تزریق مقدار در یک آرایه.
/**
* Injects input to array
*
* @param array $array Original array
* @param integer $index Index to inject into
* @param mixed $input Mixed input to be injected
* @return array New array
*/
function array_inject($array, $index, $input) {
$start = array_slice($array, 0, $index);
$inject = is_array($input) ? $input : array($input);
$end = array_slice($array, $index);
return array_merge($start, $inject, $end);
}
// Example
print_r(array_inject($arr, 2, $arr));
print_r(array_inject($arr, 2, 'an input'));
برچسب ها: array,function,solution
تبدیل خرچنگ قورباغه به آدم خوش تیپ
بازگردوندن کاراکترهای ISO-Western به فارسی یا تبدیل "Ø§Ù…ÛŒØ±ØØ³ÛŒÙ†" به "امیرحسین"
امیرحسین (اینجانب) عضو تیم پشتیبانی فارسی مادایکس به آدرس http://MODxCMS.ir هستم. خیلی وقت پیش یه کرم اینترنتی پخش شد که به محتوای فایلها، کدهای تخریبی اضافه می کرد که دامن این سایت رو گرفت و ما هم اومدیم درستش کنیم زدیم جفت چشماش رو کور کردیم و محتوای کل دیتابیس بصورت Western اینکد (Encode) شد (مثلا به این شکل: "Ø§Ù…ÛŒØ±ØØ³ÛŒÙ†") و دیگه تاریخ پیوست.
تا اینکه چند وقت پیش یکی از اعضای فروم سایت زحمت کشیدند و فایلهای سایت از جمله بخش آموزش رو که قبلا ذخیره کرده بودند رو مرتب کردند، به من دادند تا توی سایت بذارم.
قصه کافیه، من یه تابع PHP نوشتم که این کاراکترها رو به فارسی برمیگردونه. این تابع، این کاراکترهای کج و کوله رو به عنوان پارامتر میگیره و فارسی روان تحویل میده.
از این که بگذریم، من در حین تست این تابع یه روش دیگه برای برگردوندن این کاراکترها پیدا کردم که راستش خیلی ساده تر از این تابع است.
کافیه یه Notepad باز کنیم و این کاراکترها رو توش کپی کنیم بعد از ذخیره، وقتی دوباره این فایل رو باز کنیم، چی میبینیم؟ فارسی!
نظرت چیه؟
برچسب ها: function,Persian,solution
خروجی فایلهای PHP در اسکریپت
می دونید که include کردن یه فایل، درست مثل کپی کردن محتویات اون فایله.
این مدل یه مشکل کوچیک داره و اون اینه که این تابع خروجی رو return نمی کنه که بشه توی یک متغیر قرارش داد.
مثلا میخوایم کدهای جاوااسکریپت رو با PHP ایجاد کنیم. تو این حالت یک فایل php میسازیم و کدهای JS رو توش قرار میدیم و بخشهایی که لازمه رو با php تعیین می کنیم.
اگر محتویات این فایل رو مستقیم چاپ کنیم، کدهای php هم مستقیما بصورت text-plain چاپ میشن. اگر این فایل رو include کنیم، همون نقطه از فایل چاپ میشه.
با روش زیر هم کدهایی PHP رو اجرا می کنیم و هم محتویات رو توی یک متغیر میریزیم:
ob_start();
include "js.php";
$jsCodes = ob_get_contents();
ob_end_clean();
به همین زیبایی می تونید یک سری کد JS داینامیک رو از یه فایل جداگانه بگیرید! البته این یک مثال بود. میشه به سادگی فایل جاوااسکریپت رو توسط فایل PHP ایجاد کرد و در صفحه قرار داد.
برچسب ها: content,include,require
بررسی پس و پیشی ارسال Header
PHP یه بخشی داره به نام HTTP Header که این بخش به بیماری سرطان مبتلاست و متاسفانه درد این سرطانش دامن کاربرها رو میگیره.
جریان از این قراره که هر سند PHP با یک سری Header شروع میشه که شامل اطلاعات اساسی اون سند یا پرونده است از جمله فرمت یا نوع مثل text/html یا image/jpeg یا ....
وقتی کاربر headerی رو تعیین می کنه یا اطلاعاتی رو چاپ می کنه، اطلاعات Header به بافر ارسال میشه و تا به کلاینت یا بازدیدکننده فرستاده شه.
مشکل زمانی بوجود میاد که ما بخوایم بعد از ارسال خروجی به بافر، header جدید تعیین کنیم که در اون صورت با error معروف زیر مواجه میشیم:
Warning: Cannot modify header information - headers already sent by
(output started at /.../sent.php:1) in /.../current.php on line 10
که میگه: داری تو خط 10 فایل current.php یه header ایجاد می کنی در حالیکه فایل sent.php قبلا ایجاد کرده و فرستاده جیگر!
برای حل این مشکل .......
برچسب ها: header,redirect,solution
مرتب کردن براساس الفبای فارسی
توی برنامه نویسی پیش میاد که بخوایم یه سری اطلاعات فارسی رو براساس الفبای فارسی مرتب کنیم. من می دونستم که PHP با فارسی میونه خوبی نداره ولی نمی دونستم چقدر. فکر می کردم mbstring یا iconv این مشکلات رو حل کردند ولی تازه فهمیدم اشتباه فکر می کردم که PHP با فارسی (یونیکد) میونه خوبی نداره در واقع اصلا میونه ای بینشون نیست که بخواد خوب یا بد باشه!
در PHP6 ظاهرا قراره یه کارایی انجام بدن که تو سرشون بخوره! همین الان خیلی از هاستینگها حاضر نیستند PHP5 نصب کنند، PHP6 برای End-user ایرانی شیرین حواله 10 ساله دیگه است!
اخیرا به یک مبحثی در رابطه با Sort کردن سطرهای MySQL برخوردم. خواستم این مشکل رو با خود MySQL حل کنم، دیدم حدود یک میلیارد حلقه و کوئری MySQL نیاز داره تازه نیاز به تجسم این یک میلیارد عملیات داشت که از ظرفیت ذهن اینجانب خارج می باشد.
دنبال راه حل جدید میگشتم که ذهنم رفت سراغ توابع دقیق Sorting برای الفبای انگلیسی. گفتم اینا تو بلاد کفر به چه راحتی Sort می کنند خوب بیام یه جوری الفبای فارسی رو با الفبای انگلیسی متناظر کنم و ترتیب رو ازش خارج کنم (اگه متوجه شدی، زود بگو چی گفتم؟! چون خودم دقیق نفهمیدم!)
خلاصه، یه تابع به نام psort نوشتم که آرایه میگیره و براساس الفبای فارسی مرتب می کنه. به این صورت که اول اعداد فارسی، بعد حروف فارسی و بعد اعداد و حروف انگلیسی....حسن این تابع به توابع خود PHP اینه که شما می تونید ترتیب الفبا رو هر جور دوست دارید تغییر بدید مثلا همزه رو اول یا آخر الفبا قرار بدید و غیره و ذالک.
array psort($input_arr [, $function="asort"])
باقی ماجرا....
برچسب ها: array,function,Persian,psort,solution,Sort
یک نکته کوچیک از کلاسهای PHP
جدیدا متوجه شدم که اگر یک کلاسی، یک کلاس دیگه رو extend کنه، نمی تونه Propertyهای کلاس والد که static نیستند رو مستقیما بگیره. یعنی اینجوری جواب نمیده:
class childClass extends parentClass {
.....
$a = parent::memberVariable;
.....
}
توی اینترنت گشتم چیزی جالبی پیدا نکردم ولی خودم یه روش باحال کشف کردم.
برای گرفتن Property کلاس والد میشه یک متد توی کلاس والد ایجاد کرد که بیاد Property رو return کنه. مثل این:
class parentClass {
.....
function getProperty($property)
{
return $this->$property;
}
.....
}
حالا توی کلاس پایین دستی میتونید هر مشخصه ای رو از کلاس والد بگیرید (البته با مقدار کنونی)
class childClass extends parentClass {
.....
$a = parent::getProperty("memberVariable");
// $a equals to parent::memberVariable
.....
}
دلیل اینکه چنین قابلیتی تعریف نشده کاملا مشخصه. Propertyهای یک کلاس اگر static نباشند، بسته به متدهای کلاس تغییر می کنند و نمیشه با قطعیت مقدار نهایی ازشون گرفت.
برچسب ها: Object Oriented,solution