1399/5/27، 09:12 عصر
به نام خـدا
سلام دوستان امیدوارم حالتون خوب باشه...
سلام دوستان امیدوارم حالتون خوب باشه...
امروز قصد دارم چند قطعه کد کاربردی زبان PHP رو با هم بررسی کنیم که ممکنه در حین ساخت پروژه تون به کارتون بیاد. در صورت تمایل میتونین سری های قبلی این تاپیک یعنی سری دوم و سری اول رو مشاهده کنین.
1- نمایش یک تصویر در قالب گرد (دایره ای):
حتماً تصاویر پروفایل رو دیدید که به شکل گرد (دایره ای) نمایش داده میشن یا اصطلاحاً به شکل دایره ای کراپ شدن. برای اینکه به وسیله خود کانستراکت بتونین گوشه های یک تصویر رو گرد کنین میتونین تا حدی این کار رو با یکسری افکت هایی که کانستراکت داره انجام بدین. به دلیل اینکه اسپرایت ها در کانستراکت جزء عناصر HTML نیستن بنابراین نمیشه با CSS بهشون استایل داد تا دایره ای شکل بشن. اگر برنامه تون آنلاینه و قصد دارین یک تصویر که در هاست یا سرورتون موجود هست (مثل تصویر پروفایل) رو در قالب دایره ای نمایش بدین میتونین از کلاس PHP زیر استفاده کنین. این کلاس PHP بر پایه کتابخانه PHP GD نوشته شده که در ورژن های جدید PHP به صورت پیشفرض موجوده.نحوه استفاده از کد PHP:
خُب طریقه استفاده از این برنامه PHP خیلی ساده است. قبل از هر چیز این برنامه PHP رو باید در دایرکتوری یا پوشه ای از هاستتون قرار بدین که تصویر یا تصاویر موردنظرتون قرار داره. برای نمایش تصویر دایره ای در کانستراکت کافیه یک اسپرایت مخصوص این کار در نظر بگیرین و شیء AJAX (اِی جَکس) رو هم به پروژه تون اضافه کنین. بعد اکشن Request URL شیء AJAX رو انتخاب کنین و به جای پارامتر Tag هر عبارت دلخواهی قرار بدین. به جای پارامتر URL هم باید آدرسی مشابه نمونه زیر رو وارد کنید:در عبارت بالا (x) بیانگر نام فایل تصویری و (y) هم بیانگر فرمت فایل تصویری موردنظر می باشد. حالا فقط یک قدم تا نمایش خروجی در اسپرایت موردنظرمون فاصله داریم. به کمک کاندیشن On Completed بیان می کنیم که هر وقت تگی که تعریف کردیم با موفقیت نتیجه اش برگشت داده شد اکشن Load Image From URL اسپرایت اجرا بشه. پارامتر URI این اکشن رو باید دقیقاً برابر با AJAX.LASTDATA قرار بدین. اگر تمایل دارین که تصویر خروجی در ابعاد واقعی خودش نمایش داده بشه پارامتر Size رو بر روی گزینه Resize to Image Size قرار بدین و اگر هم قصد دارین که تصویر خروجی محدود به ابعاد اسپرایت شما باشه مقدار پارامتر یاد شده رو برابر با Keep Current Size قرار بدین.
این برنامه PHP به صورت خودکار مشکلاتی مثل تصویری نبودن فایل موردنظر شما، موجود نبودن فایل تصویری موردنظر شما در سرور و یا خالی بودن مقدار پارامتر image رو در صورت وجود داشتن شناسایی و در خروجی نمایش میده.
2- بکاپ گرفتن از محتویات دیتابیس:
بکاپ گرفتن دوره ای اطلاعات دیتابیس اهمیت زیادی داره چرا که اگر این کار انجام بشه در صورتی که سرور یا هاست دچار مشکل بشه میتونیم خیلی سریع داده های دیتابیس یا دیتابیس های موردنظرمون رو بارگیری کنیم. برای بکاپ گرفتن از دیتابیس میتونیم از طریق سربرگ Export در phpmyadmin اقدام کنیم تا یک فایل با فرمت .sql به عنوان خروجی تحویل بگیریم. تابع PHP که در ادامه مطرح میکنیم میتونه به صورت خودکار از اطلاعات دیتابیس بکاپ بگیره بدون اینکه نیاز باشه از طریق phpmyadmin اقدام کنیم.نحوه استفاده از تـابع PHP تعریف شده:
این تابع PHP که تعریف کردیم چهار پارامتر (آرگومان) اجباری داره که عبارتند از آدرس سرور MySQL، یوزرنیم و پسورد MySQL و نام دیتابیس MySQL. پس یعنی اگر بخوایم از تمامی جداول (به بیان دیگه کل دیتابیس) خروجی بگیریم باید به شکل زیر از تابع تعریف شده استفاده کنیم:
اما به غیر از این چهار آرگومان اجباری که باید به تابع پاس بدیم میتونیم دو آرگومان غیراجباری دیگه (آرگومان های پنجم و ششم) رو هم پاس بدیم.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_img, 0, 0, 0, 0, $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($mask, 255, 0, 255);
imagecolortransparent($mask, $maskTransparent);
imagefilledellipse($mask, $this->dst_w / 2, $this->dst_h / 2, $this->dst_w, $this->dst_h, $maskTransparent);
imagecopymerge($this->dst_img, $mask, 0, 0, 0, 0, $this->dst_w, $this->dst_h, 100);
$dstTransparent = imagecolorallocate($this->dst_img, 255, 0, 255);
imagefill($this->dst_img, 0, 0, $dstTransparent);
imagefill($this->dst_img, $this->dst_w - 1, 0, $dstTransparent);
imagefill($this->dst_img, 0, $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 رو باید در دایرکتوری یا پوشه ای از هاستتون قرار بدین که تصویر یا تصاویر موردنظرتون قرار داره. برای نمایش تصویر دایره ای در کانستراکت کافیه یک اسپرایت مخصوص این کار در نظر بگیرین و شیء AJAX (اِی جَکس) رو هم به پروژه تون اضافه کنین. بعد اکشن Request URL شیء AJAX رو انتخاب کنین و به جای پارامتر Tag هر عبارت دلخواهی قرار بدین. به جای پارامتر URL هم باید آدرسی مشابه نمونه زیر رو وارد کنید:
کد:
"http://yourhost.com/file.php?image=x.y"
این برنامه PHP به صورت خودکار مشکلاتی مثل تصویری نبودن فایل موردنظر شما، موجود نبودن فایل تصویری موردنظر شما در سرور و یا خالی بودن مقدار پارامتر image رو در صورت وجود داشتن شناسایی و در خروجی نمایش میده.
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 == 0 || $st_counter == 0 ) {$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==0 && $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 که تعریف کردیم چهار پارامتر (آرگومان) اجباری داره که عبارتند از آدرس سرور 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($ip, FILTER_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", "
", " ", " ", "-", "_"), NULL, strtolower(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($ip, FILTER_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);
?>
کد:
"http://yourhost.com/file.php"
کد:
{"ip":"192.168.1.1","country":"Iran","city":"Mashhad","isp":"Telecommunication Company Of Iran","VPN":false}
کد:
JSON.Value(0,"نام عنصر موردنظر")
کد:
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 به ما برگشت میده به طور مثال به این شکله:
کد:
{"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"}
امیدوارم که این مطلب براتون مفید واقع شده باشه.
خوشحال میشم انتقادات و پیشنهاداتتون و همچنین اشتباهات احتمالی توضیحات بنده رو در ادامه به حقیر گوشزد کنین.
با آرزوی بهترین ها...