<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های حسین باقری</title><link>https://virgool.ir/feed/@py98ir</link><description></description><language>fa</language><pubDate>2026-11-12 00:35:02</pubDate><image><url>https://files.virgool.ir/upload/users/1094344/avatar/DaYtVW.jpeg</url><title>حسین باقری</title><link>https://virgool.ir/@py98ir</link></image><item><title>ساخت اسلایدر شیک و حرفه ای در جاوا اسکریپت</title><link>https://virgool.ir/@py98ir/how-to-make-slider-js-gg4pjdb21sps</link><description>در این آموزش قصد دارم با 2 روش نحوه پیاده سازی اسلایدر را به شما آموزش دهم در روش اول از 0 تا 100 را خودمان کد نویسی کرده و اسلایدر را می سازیم ذدر روش دوم از کتابخانه splide.js استفاده کرده و 9 اسلایدر مختلف را پیاده سازی می کنیدویدیوی روش اول https://cdn1.rapidcode.ir/videos2/how-to-create-slider-in-js.mp4 ویدیوی روش دوم https://cdn1.rapidcode.ir/videos2/how-to-use-splide.js.mp4 منبع</description><category>حسین باقری</category><author>حسین باقری</author><pubDate>Mon, 07 Nov 2022 15:49:32 +0330</pubDate></item><item><title>کار با متغیر ها در جاوا اسکریپت</title><link>https://virgool.ir/@py98ir/how-to-work-with-data-types-js-qpcwgaz4hlka</link><description>نوع داده در JSآموزش انواع داده در جاوا اسکریپت – در زبان های برنامه نویسی نوع داده یا دیتا تایپ نقش مهمی را در ذخیره داده ، آن هم به شکل های مختلف ایفا می کند .انواع مختلفی از داده ها وجود دارد که با توجه به نیاز و کاربرد آن در برنامه مورد استفاده قرار می گیرد که در پایین لیست شده است :شامل 8 نوع داده یا همان data types در زبان برنامه نویسی جاوا اسکریپتnumber : عددیBigInt : اعداد صحیح کلانstring : رشته ای ( نوشته )boolean : منطقی ( true / false )null : پوچundefined : مقداردهی نشدهobject : شی ( آرایه ، دیگر مقادیر complex )symbol : منحصر به فرد برای debug0- ابتدا با پیشوندهای تعریفی const , let , var آشنا شویماین 3 پیشوند تاثیر به سزایی در ساختار برنامه مان خواهد داشت پس در هنگام تعریف باید آگاهی کافی نسبت به کارایی شان داشت :پیشوند constهمانطور که از اسمش پیداست ثابت است و فقط یک declare ( تعریف ) و assign ( مقدار دهی ) می شود .const myConstant = 3.14; // 3.14&#xA;const myConstant = 3.14; // SyntaxError: has already been declared&#xA;myConstant = 3.14; // TypeError: Assignment to constant variable.پیشوند letاین یکی فقط باید یک بار declare شود ولی به طور نامحدودی می تواند reassign شود .let userID = 1377; // 1377&#xA;let userID = 1378; // SyntaxError: has already been declared&#xA;userID = 1379; // 1379پیشوند varمی تواند هم declare و reassign شود آن هم به طور نامحدودیvar number = 1999; // 1999&#xA; &#xA;var number = 2000; // 2000&#xA; &#xA;number = 2001; // 20011- نوع داده number (عددی)می تواند به انواع مختلفی از عدد باشد همانند : صحیح مثبت و منفی ، اعشاریvar num1 = 199;&#xA;var num2 = -199;&#xA;var num3 = 1.798456456;2 نوع عددی ویژه با نام های Infinity و NaN در جاوا اسکریپت وجود دارد .عددی Infinityنامحدود . زمانی که عددی تقسیم بر صفر شود یا موارد دیگر با این نوع روبرو می شویم همچنین اگر بخواهیم آن را تشخیص دهیم تابع isFinite نیازمان می شود .var myInfinity = 999 / 0;&#xA; &#xA;console.log(myInfinity); // Infinity&#xA; &#xA;if(isFinite(myInfinity) === false)&#xA;console.log(&#34;your number is infinite&#34;);عددی NaNمخفف Not A Number می باشد و در زمانی رخ می دهد که یک عمل ریاضی به جز + با عدد و رشته انجام دهیم .var myNan = 2 - &#34;mens&#34;&#xA; &#xA;console.log(myNan); // NaN&#xA; &#xA;// #1-روش اشتباه تشخیص&#xA;if(myNan == NaN) console.log(&#34;your number is NaN&#34;)&#xA; &#xA;// #2-روش صحیح تشخیص&#xA;if(isNaN(myNan)) console.log(&#34;your number is NaN&#34;)2- نوع داده BigInt اعداد صحیح کلانبه طور طبیعی اعداد صحیح تا عدد 9,007,199,254,740,991 یا عدد 2 به توان 53 منها 1 قابل پشتیبانی می باشد اما اعداد بزرگ تر از آن عضو نوع داده BigInt محسوب می شوند .var max_safe_int = Number.MAX_SAFE_INTEGER; // 9007199254740991 # (Math.pow(2,53))-1روش تعریف BigIntبه 2 روش می توان تعریف کرد که در کد زیر مشاهده می کنید :var myBigInt1 = BigInt(9007199254740993);&#xA;var myBigInt2 = 9007199254740992n;حل مشکل مقایسهموردی که توجه من رو به خودش جلب کرد این بود که در هنگام مقایسه نتیجه اشتباهی رو دریافت کردم :console.log(myBigInt1 == myBigInt2); // trueاین مشکل برمی گردد به متغیر myBigInt1 که باید آن را به صورت عدد داخل رشته وارد سازی کنیم و مشکل حل خواهد شد :var myBigInt1 = BigInt(&#34;9007199254740993&#34;);&#xA;var myBigInt2 = 9007199254740992n;&#xA; &#xA;console.log(myBigInt1 == myBigInt2); // falseBigInt ها در مرورگر های Firefox/Chrome/Edge/Safari پشتیبانی می شود اما در IE این امکان وجود ندارد .3- نوع داده string رشته ای ( نوشته )این نوع می تواند به 3 شکل تعریف شود با :1- دابل کوت2- سینگل کوت3- بک تیک ( قابلیت های زیادی می دهد )var string1 = &#34;welcome&#34;&#xA;var string2 = &#39;arman&#39;;&#xA; &#xA;function sayMyName(){&#xA;  return &#34;&#39;RapidCoDe.iR&#39;&#34;&#xA;}&#xA; &#xA;var welcome = `${string1} ${string2} ${1+1} ${sayMyName()}`; &#xA;console.log(welcome); // welcome arman 2 &#39;RapidCoDe.iR&#39;یک روش برای برعکس نمایش دادن رشتهvar reverseString = (&#34;edocdipar&#34;).split(&#34;&#34;).reverse().join(&#34;&#34;);&#xA;console.log(reverseString); // rapidcode4- نوع داده boolean منطقی ( true / false )این نوع داده فقط می تواند 2 مقدار داشته باشد یا true(1) یا false(0) و محض اطلاع boolean نیز در مای اس کیو ال به عنوان (1)tinyint هم شناخته می شود .var myBoolean1 = true;&#xA;var myBoolean2 = false;&#xA;var myBoolean3 = 1 == &#34;1&#34; // true5- نوع داده null ( پوچ )این نوع داده را با undefined اشتباه نگیرید زمانی که به یک متغیر مقدار null می دهید درواقع مقدار ناشناخته یا پوچ را می دهید .var fullname = null;&#xA; &#xA;if(fullname == null) console.log(&#34;your Name is Unknown&#34;);6- نوع داده undefined (مقداردهی نشده)زمانی که مقدار undefined می گذاریم اعلام می کنیم که متغیر تعریف شده اما مقداری برای آن تعریف نشد یا اگر بخواهیم به مقدار یک index تعریف نشده از آرایه دسترسی پیدا کنیم .var myUndefined;&#xA;myUndefined = undefined; // same as above&#xA; &#xA;var arrayList = [1,2];&#xA; &#xA;console.log(myUndefined); // undefined&#xA; &#xA;console.log(arrayList[2]); // undefined7- نوع داده object (شی ( آرایه ، دیگر مقادیر complex ))آرایه ها و object ها از وجود چند نوع داده ی مختلف به وجود می آیند که complex یا چندمنظوره نامید می شوند .در واقع آرایه ها هم عضوی از object محسوب می شوند .const myArray = [120, &#34;arMan&#34;, true, null, undefined , function(name){return &#34;hi &#34; + name }];&#xA; &#xA;const func = myArray[5];&#xA; &#xA;console.log(func(myArray[1])) // hi arManمثلا اگر بخواهیم به مقدار arMan دسترسی پیدا کنیم از myArray[1] استفاده می کنیم حال اگر بخواهیم به جای عدد 1 از نام استفاده کنیم از object استفاده می کنیم و می توانیم به مقدار آن دست پیدا کنیم .وتعریف آن به شکل زیر است :var myObject = {&#xA;  username : &#34;aryan&#34;,&#xA;  age : 33 ,&#xA;  showBio : function(){&#xA;    return `${this.username} ${this.age} years old from ${this.city}`;&#xA;  }&#xA;}&#xA;myObject.age = 21;&#xA;myObject.city = &#34;Meshad (:&#34;&#xA;myObject[&#39;city&#39;] = &#34;Meshad (:&#34; // same as aboveیا به شکلی دیگر هم می توان آن را تعریف کرد ( ;var myObject = new Object();&#xA;myObject.username = &#34;aryan&#34;&#xA;myObject.age = &#34;21&#34;&#xA;myObject.city = &#34;Meshad (:&#34;&#xA;myObject.showBio = function(){&#xA;  return `${this.username} ${this.age} years old from ${this.city}`;&#xA;};هم چنین می توانیم با تابع به مقدار آبجکت دسترسی پیدا کنیم :console.log(myObject.showBio()); // &#34;aryan 21 years old from Meshad (:&#34;نمونه گیری آبجکت از تابعمی توانیم تابع را طوری تعریف کنیم که بتوانیم از آن آبجکت نمونه گیری کنیم به شکل زیر :var myObject = function(username, age, city){&#xA;  this.username = username;&#xA;  this.age = age;&#xA;  this.city = city;&#xA;  this.showBio = function(){&#xA;    return `${this.username} ${this.age} years old from ${this.city}`;&#xA;  }&#xA;}&#xA; &#xA;const object1 = new myObject(&#34;Poorya&#34; , 23 , &#34;tehran&#34;);&#xA;console.log(object1.showBio()); // Poorya 23 years old from tehranترفند های جالب Objectاگر بخواهیم به کلیدواژه های شی یا همان object دسترسی پیدا کنیم می توانیم از متود های زیر استفاده کنیم :console.log(Object.keys(object1)); // [&#34;username&#34;, &#34;age&#34;, &#34;city&#34;, &#34;showBio&#34;]&#xA;console.log(Object.getOwnPropertyNames(object1)); // [&#34;username&#34;, &#34;age&#34;, &#34;city&#34;, &#34;showBio&#34;]همچنین می توانیم از object داخل حلقه بهره ببریم :for(var key in object1){&#xA;  console.log(key + &#34; -&gt; &#34; + object1[key])&#xA;}8- Symbol : منحصر به فرد برای debugهمانطور که از اسمش پیداست اَشکال برای علامت گذاشتن است و با استفاده از این نوع داده می توانیم در بخش های مختلفی از برنامه علامت گذاری کرده و آن را رفع خطا کنیم .const mySymbol1 = Symbol(&#34;line&#34;);&#xA;const mySymbol2 = Symbol(&#34;line&#34;);&#xA;  &#xA;console.log(mySymbol1 === mySymbol2) // false&#xA;  &#xA;console.log(mySymbol1.description) // line&#xA;  &#xA;console.log(mySymbol1.toString()) // Symbol(line)معرفی تابع و عملگر typeoftypeof در واقع هم یک تابع و هم عملگر است یعنی می توانیم به صورت :typeof val&#xA;typeof (val)استفاده کنیم .و با آن می توانیم نوع داده متغیر را بدست آوریم و خیلی کاربردی می باشد و نوع را به صورت رشته برمی گرداند :typeof 0 // &#34;number&#34;&#xA; &#xA;typeof 10n // &#34;bigint&#34;&#xA; &#xA;typeof undefined // &#34;undefined&#34;&#xA; &#xA;typeof false // &#34;boolean&#34;&#xA; &#xA;typeof &#34;arMan&#34; // &#34;string&#34;&#xA; &#xA;typeof Symbol(&#34;line&#34;) // &#34;symbol&#34;&#xA; &#xA;typeof new Date // &#34;object&#34;&#xA; &#xA;typeof(null) // &#34;object&#34; &#xA; &#xA;typeof console.log // &#34;function&#34;و در پایان variable handlingکلاس های از پیش ساخته javascript وجود دارد که می توان به صورت تابع هم از آن استفاده کرد و می توانیم داده های مختلفی را به آن نوع داده مدنظر مان تبدیل کنیم :Number(&#34;1.75&#34;)// 1.75&#xA; &#xA;Number(false) //0&#xA; &#xA;Number(true) //1&#xA; &#xA;===============&#xA; &#xA;String(1.5) // &#34;1.5&#34;&#xA; &#xA;String(true) // &#34;true&#34;&#xA; &#xA;String({}) // [object Object]&#xA; &#xA;===============&#xA; &#xA;Boolean(1) // true&#xA; &#xA;Boolean(0) // false&#xA; &#xA;Boolean(&#34;&#34;) // false&#xA; &#xA;Boolean(&#34;0&#34;) // true&#xA; &#xA;Boolean(null) // false&#xA; &#xA;Boolean(undefined) // false&#xA; &#xA;=============&#xA; &#xA;Object(true) // Boolean {true}&#xA; &#xA;Object(&#34;arMan&#34;) // String {&#34;arMan&#34;}&#xA; &#xA;Object(1489948454) // Number {1489948454}&#xA; &#xA;Object(null) {}&#xA; &#xA;Object(undefined) {}لینک مقاله</description><category>حسین باقری</category><author>حسین باقری</author><pubDate>Wed, 05 Jan 2022 10:28:39 +0330</pubDate></item><item><title>کوتاه کننده لینک با پی اچ پی و MYSQL</title><link>https://virgool.ir/@py98ir/کوتاه-کننده-لینک-با-پی-اچ-پی-و-mysql-fprfosj5mecz</link><description>کوتاه کننده لینک با پی اچ پی و MYSQLکوتاه کننده لینک با PHP ، مای اس کیو ال و Javascript – ساخت یک انتقال دهنده لینک نیازمند این است که راه حلی را داشته باشیم که بتوانیم یک آدرس طولانی را به یک آدرس کوتاه تبدیل کنیم .در این آموزش یک URL Shortener نیمه حرفه ای را خواهیم ساخت که از تکنولوژی Ajax پشتیبانی می کند .فایل index.phpخط 18 : از اونجایی که فرم ajax خواهد بود زمانی که آدرس وارد شد و کاربر ENTER زد نمی خواهیم هدایت بشیم بنابراین با  مقدار false برمی گردانیم کــــه ریدایرکت نشیم .خط 19 : pattern را برای ورودی http و https تنظیم می کنیم که با یکی از این 2 شروع شود .&lt;?php&#xA;require_once &#34;functions.php&#34;&#xA;require_once &#34;func.actions.php&#34;&#xA;if(!empty($_GET[&#39;u&#39;]))require_once &#34;redirect.php&#34;&#xA;?&gt;&#xA;&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;fa&#34;&gt;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;title&gt;Rapidcode.iR - سورس کد&lt;/title&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;static/css/main.css&#34;&gt;&#xA;&lt;/head&gt;&#xA; &#xA;&lt;body&gt;&#xA;    &lt;div class=&#34;container&#34;&gt;&#xA;        &lt;a id=&#34;introduce&#34; href=&#34;https://rapidcode.ir&#34; target=&#34;_blank&#34;&gt;رپید کد • کتابخانه مجازی برنامه نویسان&lt;/a&gt;&#xA; &#xA;        &lt;form =&#34;return false;&#34;&gt;&#xA;            &lt;input autofocus pattern=&#34;https:\/\/.*|http:\/\/.*&#34; type=&#34;url&#34; name=&#34;url-inp&#34; id=&#34;url-inp&#34;&#xA;                placeholder=&#34;لینک مورد نظر برای کوتاه شدن&#34;&gt;&lt;br&gt;&lt;br&gt;&#xA;            &lt;input type=&#34;button&#34; id=&#34;submit&#34; value=&#34;کوتاه کن&#34;&gt;&#xA;        &lt;/form&gt;&#xA; &#xA;        &lt;?php if(isset($GLOBALS[&#39;is_url_correct&#39;]) &amp;&amp; !$GLOBALS[&#39;is_url_correct&#39;]) echo generate_html_message(&#34;آدرس مورد نظر در پایگاه داده یافت نشد .&#34; , &#34;warning&#34;) ?&gt;&#xA;        &lt;?php if(!empty($GLOBALS[&#39;info_msg&#39;])) echo $GLOBALS[&#39;info_msg&#39;] ?&gt;&#xA; &#xA;        &lt;div class=&#34;short-link-wrapper&#34;&gt;&#xA;            &lt;button id=&#34;copy-short-link&#34; data-clipboard-target=&#34;#short-link-copy&#34;&gt;&#xA;                &lt;img src=&#34;static/img/clippy.svg&#34; alt=&#34;copy text&#34;&gt;&#xA;            &lt;/button&gt;&#xA;            &lt;input id=&#34;short-link-copy&#34; type=&#34;url&#34; readonly placeholder=&#34;short link goes here (;&#34; dir=&#34;ltr&#34;&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA; &#xA;    &lt;script src=static/js/lib/clipboard.min.js&gt; &#xA;    &lt;script src=&#34;static/js/app.js&#34;&gt;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;فایل contants.php برای اطلاعات ثابت مثل دیتابیس&lt;?php&#xA; &#xA;define(&#34;HOST&#34; , &#34;localhost&#34;);&#xA;define(&#34;USERNAME&#34; , &#34;root&#34;);&#xA;define(&#34;PASSWORD&#34; , &#34;&#34;);&#xA;define(&#34;DB&#34; , &#34;link_db&#34;);&#xA;define(&#34;CURRENT_TIME&#34; , date(&#34;Y/m/d H:i:s&#34;));&#xA; &#xA;?&gt;فایل functions.php برای تابع های دیتابیس&lt;?php&#xA; &#xA;require_once &#34;constants.php&#34;&#xA;$table = &#34;link_tbl&#34;&#xA; &#xA;function validate_url(string $url)&#xA;{   &#xA;    $url_list = parse_url($url);&#xA;    $host = $url_list[&#39;host&#39;];&#xA;    $path = $url_list[&#39;path&#39;];&#xA;    $url = str_ireplace($path , urlencode($path) , $url);&#xA;    $url = str_ireplace($host . &#34;%2f&#34; , $host . &#34;/&#34; , $url);&#xA;    $url = filter_var($url, FILTER_VALIDATE_URL);&#xA;    return $url;&#xA;}&#xA; &#xA;function show_json_message($array_data)&#xA;{&#xA;    return json_encode($array_data);&#xA;}&#xA; &#xA;function generate_url_token($url)&#xA;{&#xA;    $crc32_number = crc32($url);&#xA;    $encoded_url = base_convert($crc32_number, 10, 36);&#xA;    $encoded_url_list = str_split($encoded_url, 1);&#xA;    $encoded_url = &#34;&#34;&#xA; &#xA;    for ($i = 0; $i &lt; sizeof($encoded_url_list); $i++) {&#xA;        $current_index = $encoded_url_list[$i];&#xA;        $letter = is_numeric($current_index) ? $current_index : strtoupper($current_index);&#xA;        $encoded_url .= $letter;&#xA;    }&#xA; &#xA;    return $encoded_url;&#xA;}&#xA; &#xA;function generate_html_message($message = &#34;&#34;, $type = &#34;notice&#34;)&#xA;{&#xA;    return &#34;&lt;div class=\&#34;msg {$type}\&#34;&gt;&lt;p&gt;{$message}&lt;/p&gt;&lt;/div&gt;&#34;&#xA;}&#xA; &#xA;function remove_end_slash($url)&#xA;{&#xA;    $url = strrev($url);&#xA;    $url = str_split($url, 1);&#xA; &#xA;    if ($url[0] == &#34;/&#34;) unset($url[0]);&#xA; &#xA;    $url = join($url);&#xA;    $url = strrev($url);&#xA; &#xA;    return $url;&#xA;}&#xA; &#xA;function update_views($column, $short_url)&#xA;{&#xA; &#xA;    $mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB);&#xA;    $current_time = CURRENT_TIME;&#xA;    $row_updated = 0;&#xA; &#xA;    $mysqli-&gt;set_charset(&#34;utf8&#34;);&#xA;    $stmt = $mysqli-&gt;stmt_init();&#xA;    $query = &#34;UPDATE `{$GLOBALS[&#39;table&#39;]}` SET `views` = views + 1 , `date_last_view` = ? WHERE {$column} = ?&#34;&#xA; &#xA;    $stmt-&gt;prepare($query);&#xA;    $stmt-&gt;bind_param(&#39;ss&#39;, $current_time, $short_url);&#xA; &#xA;    if ($stmt-&gt;execute()) {&#xA;        $row_updated = $stmt-&gt;affected_rows ? $stmt-&gt;insert_id : 0;&#xA;    }&#xA; &#xA;    $stmt-&gt;close();&#xA;    $mysqli-&gt;close();&#xA; &#xA;    return $row_updated;&#xA;}&#xA; &#xA;function row_select($user_query, $column, $select = &#34;*&#34;)&#xA;{&#xA; &#xA;    $mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB);&#xA;    $row = 0;&#xA; &#xA;    $mysqli-&gt;set_charset(&#34;utf8&#34;);&#xA;    $stmt = $mysqli-&gt;stmt_init();&#xA;    $query = &#34;SELECT {$select} FROM `{$GLOBALS[&#39;table&#39;]}` WHERE {$column}=?&#34;&#xA; &#xA;    $stmt-&gt;prepare($query);&#xA;    $stmt-&gt;bind_param(&#34;s&#34;, $user_query);&#xA; &#xA;    if ($stmt-&gt;execute() &amp;&amp; $res = $stmt-&gt;get_result()) {&#xA;        if ($stmt-&gt;affected_rows || $res-&gt;num_rows) {&#xA;            $row = $res-&gt;fetch_assoc();&#xA;        }&#xA;    }&#xA; &#xA;    $stmt-&gt;close();&#xA;    $mysqli-&gt;close();&#xA; &#xA;    return $row;&#xA;}&#xA; &#xA;function row_insert($url)&#xA;{&#xA;    $mysqli = new mysqli(HOST, USERNAME, PASSWORD, DB);&#xA;    $views = 0;&#xA;    $token_url = generate_url_token($url);&#xA;    $inserted_id = 0;&#xA;    $current_time = CURRENT_TIME;&#xA; &#xA;    $mysqli-&gt;set_charset(&#34;utf8&#34;);&#xA;    $stmt = $mysqli-&gt;stmt_init();&#xA; &#xA;    $query = &#34;INSERT INTO `{$GLOBALS[&#39;table&#39;]}` (link_original , link_short , date_submitted , date_last_view , views) VALUES (? , ? , ? , ? , ?)&#34;&#xA; &#xA;    $stmt-&gt;prepare($query);&#xA;    $stmt-&gt;bind_param(&#39;ssssi&#39;, $url, $token_url, $current_time, $current_time, $views);&#xA; &#xA;    if ($stmt-&gt;execute()) {&#xA;        $inserted_id = $stmt-&gt;affected_rows ? $stmt-&gt;insert_id : 0;&#xA;    }&#xA; &#xA;    $stmt-&gt;close();&#xA;    $mysqli-&gt;close();&#xA; &#xA;    return $inserted_id;&#xA;}فایل func.actions.phpاین فایل شامل 3 تابع است که 3 عمل اصلی را هم انجام می دهد :فانشکن func_action_submit : برای زمانی که لینکی را ثبت می کنیم .فانشکن func_action_redirect : کاربر را با لینک کوتاه به لینک اصلی هدایت می کند .فانشکن func_action_redirect_info : اطلاعاتی از لینک کوتاه ثبت شده به ما می دهد شامل تاریخ ثبت لینک ، تاریخ آخرین ارجاع یا بازدید از لینک ، تعداد بازدید .&lt;?php&#xA; &#xA;function func_action_submit($response_list, $user_url)&#xA;{&#xA;     $row = row_select($user_url, &#34;link_original&#34;);&#xA;     if (empty($row)) {&#xA;          $row = row_insert($user_url);&#xA;          if (empty($row)) {&#xA;               $response_list[&#39;status&#39;] = 0;&#xA;               $response_list[&#39;msg&#39;] = &#34;خطایی در هنگام ثبت داده در دیتابیس رخ داده .&#34;&#xA;               die(show_json_message($response_list));&#xA;          } else {&#xA;               $response_list[&#39;status&#39;] = 1;&#xA;               $response_list[&#39;msg&#39;] = &#34;آدرس مورد نظر با موفقیت ثبت گردید .&#34;&#xA;               $response_list[&#39;data&#39;] = json_encode(row_select($row, &#34;id&#34;, &#34;link_short&#34;));&#xA;               die(show_json_message($response_list));&#xA;          }&#xA;     } else {&#xA;          $response_list[&#39;msg&#39;] = &#34;این آدرس از قبل ثبت شده&#34;&#xA;          $response_list[&#39;data&#39;] = json_encode([&#34;link_short&#34; =&gt; $row[&#39;link_short&#39;]]);&#xA;          die(show_json_message($response_list));&#xA;     }&#xA;}&#xA; &#xA;function func_action_redirect($user_url)&#xA;{&#xA;     $url_data = row_select($user_url, &#34;link_short&#34;, &#34;link_original&#34;);&#xA;     $GLOBALS[&#39;is_url_correct&#39;] = false;&#xA;     if (!empty($url_data)) {&#xA;          update_views(&#34;link_short&#34;, $user_url);&#xA; &#xA;          header(&#34;Location: {$url_data[&#39;link_original&#39;]}&#34;);&#xA;          $GLOBALS[&#39;is_url_correct&#39;] = true;&#xA;     }&#xA;}&#xA; &#xA;function func_action_redirect_info($user_url)&#xA;{&#xA;     $url_data = row_select($user_url, &#34;link_short&#34;, &#34;*&#34;);&#xA;     $url_data[&#39;link_original&#39;] = urldecode($url_data[&#39;link_original&#39;]);&#xA;     $GLOBALS[&#39;is_url_correct&#39;] = false;&#xA;     if (!empty($url_data)) {&#xA;          $GLOBALS[&#39;info_msg&#39;] = &#34;&lt;div style=\&#34;direction: ltr;font-size:25px\&#34; class=\&#34;msg success\&#34;&gt;&lt;p&gt;{$url_data[&#39;link_original&#39;]}&lt;/p&gt;&lt;/div&gt;&lt;table id=\&#34;statistics\&#34;&gt;&lt;tr&gt;&lt;td&gt;تاریخ ثبت لینک : &lt;/td&gt;&lt;td&gt;{$url_data[&#39;date_submitted&#39;]}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;تاریخ آخرین ارجاع لینک : &lt;/td&gt;&lt;td&gt;{$url_data[&#39;date_last_view&#39;]}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;تعداد ارجاع : &lt;/td&gt;&lt;td&gt;{$url_data[&#39;views&#39;]}&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#34;&#xA;          $GLOBALS[&#39;is_url_correct&#39;] = true;&#xA;     }&#xA;}فایل redirect.phpاین تابع مشخص می کند که کاربر با لینک کوتاهی که وارد کرده است می خواهد به لینک اصلی وارد شود یا آمار لینک را مشاهده کند .&lt;?php&#xA; &#xA;if($_GET[&#39;u&#39;] &amp;&amp; !empty($_GET[&#39;info&#39;])){&#xA;    func_action_redirect_info($_GET[&#39;u&#39;]);&#xA;}else if($_GET[&#39;u&#39;]){&#xA;    func_action_redirect($_GET[&#39;u&#39;]);&#xA;}&#xA; &#xA;?&gt;فایل api.phpاز اسمی که دارد برای endpoint استفاده می شود که درخواست های ajax به این فایل ختم می شود .&lt;?php&#xA; &#xA;header(&#34;Content-Type: application/json&#34;);&#xA;require_once &#34;functions.php&#34;&#xA;require_once &#34;func.actions.php&#34;&#xA; &#xA;$response_list = [&#xA;    &#34;status&#34; =&gt; 0,&#xA;    &#34;msg&#34; =&gt; &#34;&#34;,&#xA;    &#34;data&#34; =&gt; []&#xA;];&#xA; &#xA;$action_list = [&#xA;    &#34;submit&#34;,&#xA;];&#xA; &#xA;$user_url = @$_POST[&#39;inp-url&#39;];&#xA;$action = @$_POST[&#39;action&#39;];&#xA; &#xA;if(empty($action) || !in_array($action , $action_list)){&#xA;    $response_list[&#39;msg&#39;] = &#34;پارامتر action معتبر نمی باشد .&#34;&#xA;    die(show_json_message($response_list));&#xA;}&#xA; &#xA;$user_url = remove_end_slash($user_url);&#xA; &#xA;if(empty($user_url) || !validate_url($user_url)){&#xA;    $response_list[&#39;msg&#39;] = &#34;لینک معتبری وارد نشده است .&#34;&#xA;    die(show_json_message($response_list));&#xA;}&#xA; &#xA;$user_url = urldecode($user_url);&#xA;call_user_func(&#34;func_action_&#34; . $action , $response_list , $user_url);&#xA; &#xA;?&gt;فایل app.jsconst clipboardJS = new ClipboardJS(&#39;#copy-short-link&#39;);&#xA; &#xA;const submitDOM = document.getElementById(&#34;submit&#34;);&#xA;const urlInput = document.getElementById(&#34;url-inp&#34;);&#xA;const shortLinkWrapper = document.getElementsByClassName(&#34;short-link-wrapper&#34;)[0];&#xA; &#xA; &#xA;submitDOM.addEventListener(&#34;click&#34;, handlerSubmit);&#xA; &#xA; &#xA;function handlerSubmit() {&#xA;    if (!urlInput.checkValidity()) {&#xA;        alert(&#34;آدرس داده شده معتبر نمی باشد .&#34;);&#xA;        return false;&#xA;    }&#xA; &#xA;    submitDOM.setAttribute(&#34;disabled&#34;, &#34;disabled&#34;);&#xA;    submitDOM.value = &#34;در حال دریافت لینک ...&#34;&#xA; &#xA;    funcPostRequest(function (xhr) {&#xA;        const response = xhr.currentTarget.response;&#xA;        let data = response.data;&#xA; &#xA;        if(typeof data == &#34;string&#34;) data = JSON.parse(data);&#xA; &#xA;         &#xA;        window.alert(response.msg);&#xA;        if (data[&#39;link_short&#39;]) {&#xA;            shortLinkWrapper.classList.add(&#34;active&#34;);&#xA;            submitDOM.removeAttribute(&#34;disabled&#34;);&#xA;            submitDOM.value = &#34;کوتاه کن&#34;&#xA;            shortLinkWrapper.querySelector(&#34;#short-link-copy&#34;).value = location.origin + &#34;?u=&#34;+ data[&#39;link_short&#39;];&#xA;        }&#xA; &#xA; &#xA; &#xA;    }, function () {&#xA;        alert(&#34;خطایی رخ داده برای جزئیات بیشتر تب console را باز کنید&#34;)&#xA;        console.warn(&#34;[XHR Error]&#34;);&#xA; &#xA;        submitDOM.removeAttribute(&#34;disabled&#34;);&#xA;        submitDOM.value = &#34;کوتاه کن&#34;&#xA;    });&#xA; &#xA;}&#xA; &#xA; &#xA;function funcPostRequest(cbOnload, cbOnerror) {&#xA;    const xhr = new XMLHttpRequest();&#xA;    xhr.responseType = &#34;json&#34;&#xA; &#xA;    const params = new FormData;&#xA;    params.append(&#34;action&#34;, &#34;submit&#34;);&#xA;    params.append(&#34;inp-url&#34;, urlInput.value);&#xA; &#xA;    xhr.open(&#34;POST&#34;, location.origin + &#34;/api.php&#34;);&#xA; &#xA;    xhr. = cbOnload;&#xA;    xhr. = cbOnerror;&#xA; &#xA;    xhr.send(params);&#xA;}فایل main.cssbody{&#xA;    background-image: url(../img/sea.jpg);&#xA;    background-size: cover;&#xA;}&#xA; &#xA;.active{&#xA;    display: block !important;&#xA;}&#xA; &#xA;#url-inp{&#xA;    transition: 0.3s all;&#xA;    width: 40%;&#xA;    border: none;&#xA;    outline: none;&#xA;    padding: 10px;&#xA;    border-radius: 25px;&#xA;    text-align: center;&#xA;    font-weight: bold;&#xA;}&#xA; &#xA;#url-inp:focus{&#xA;    width: 50%;&#xA;    border: 1px solid #000;&#xA;}&#xA; &#xA;#submit{&#xA;    border: none;&#xA;    background-color: #2196f3;&#xA;    color: white;&#xA;    font-weight: bold;&#xA;    font-size: 25px;&#xA;    padding: 10px 50px;&#xA;    border-radius: 25px;&#xA;    cursor: pointer;&#xA;}&#xA; &#xA;#submit:hover{&#xA;    background-color: #137dd3;&#xA;}&#xA; &#xA;.msg{&#xA;    background-color: silver;&#xA;    color: #000;&#xA;    border-radius: 15px;&#xA;    display: inline-block;&#xA;    padding: 5px 35px;&#xA;    margin: 15px auto;&#xA;    font-weight: bold;&#xA;}&#xA; &#xA;.msg.warning{&#xA;    background-color: #ffa500;&#xA;}&#xA; &#xA;.msg.success{&#xA;    background-color: #3f51b5;&#xA;    color: white;&#xA;}&#xA; &#xA;#statistics{&#xA;    font-weight: bold;&#xA;    background-color: rgb(255 255 255 / 79%);&#xA;    border-radius: 4px;&#xA;    width: 50%;&#xA;    margin: 0 25%;&#xA;}&#xA; &#xA;#statistics td{&#xA;    padding: 12px;&#xA;}&#xA; &#xA;.short-link-wrapper{&#xA;    display: none;&#xA;}&#xA; &#xA;#short-link-copy{&#xA;    margin-top: 50px;&#xA;    font-size: 24px;&#xA;    background-color: #4caf50;&#xA;    border: 3px #fff solid;&#xA;    outline: none;&#xA;    color: white;&#xA;    padding: 3px 10px;&#xA;    border-radius: 15px;&#xA;}&#xA; &#xA;.short-link-wrapper button{&#xA;    height: 25px;&#xA;}&#xA; &#xA;.short-link-wrapper button img{&#xA;    width: 15px;&#xA;}لینک دانلود برنامه</description><category>حسین باقری</category><author>حسین باقری</author><pubDate>Mon, 18 Oct 2021 11:42:01 +0330</pubDate></item><item><title>آموزش جدا کردن سه رقم اعداد در جاوا اسکریپت</title><link>https://virgool.ir/@py98ir/آموزش-جدا-کردن-سه-رقم-اعداد-در-جاوا-اسکریپت-l4ibmccvnheq</link><description>جدا کردن سه رقم اعداد جاوا اسکریپت – در بسیاری از پروژه ها نیاز است که برای خوانایی بهتر ارقام را به صورت 3 رقم 3 رقم از یکدیگر جدا کنیم .در این آموزش یاد خواهیم گرفت که چگونه با استفاده از وانیلا جی اس ( جاوا اسکریپت خام ) رقم های بیشتر از 3 رقم مانند 2000 را به صورت 2,000 نمایش دهیم .فایل index.html برای ورودی عدد&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;fa&#34;&gt;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;title&gt;Rapidcode.iR - سورس کد&lt;/title&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;static/css/main.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA; &#xA; &#xA;    &lt;div class=&#34;container&#34;&gt;&#xA;        &lt;a id=&#34;introduce&#34; href=&#34;https://rapidcode.ir&#34; target=&#34;_blank&#34;&gt;رپید کد • کتابخانه مجازی برنامه نویسان&lt;/a&gt;&#xA; &#xA;        &lt;input dir=&#34;ltr&#34; type=&#34;text&#34; id=&#34;my-decimal-number&#34; name=&#34;my-decimal-number&#34; placeholder=&#34;123,985,659&#34;&gt;&#xA; &#xA;        &#xA;    &lt;/div&gt;&#xA; &#xA; &#xA; &#xA;    &lt;script src=&#34;static/js/app.js&#34;&gt;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;اسکریپت app.js جهت جدا کردن ارقامدر اسکریپت پایین از ایونت keyup استفاده می کنیم که به صورت همگام هر ورودی که کاربر از روی کیبرد وارد می کند را به ما برمی گرداند .از آنجایی که نوع input را بر روی text تنظیم کردیم کاربر امکان اینکه بتواند به جز عدد ( حروف و اَشکال وارد کند ) را دارد بنابراین با تابع Number ورودی را بررسی می کنیم که آیا عدد وارد کرده یا خیر .در صورتی که کاربرعدد وارد نکرده بود تابع عدد را پردازش نخواهد کرد .const inpNumber = document.getElementById(&#34;my-decimal-number&#34;);&#xA;inpNumber.addEventListener(&#34;keyup&#34;, handlerSeparateNumbers)&#xA; &#xA;// functions&#xA;function funcReverseString(str) {&#xA;    return str.split(&#39;&#39;).reverse().join(&#39;&#39;);&#xA;}&#xA; &#xA;// event handlers&#xA;function handlerSeparateNumbers(e) {&#xA;    const thisElement = e.target;&#xA;    let thisElementValue = thisElement.value;&#xA; &#xA;    thisElementValue = thisElementValue.replace(/,/g, &#34;&#34;);&#xA; &#xA;    if (isNaN(Number(thisElementValue))) {&#xA;        alert(&#34;لطفا از وارد کردن حروف خودداری فرمایید !&#34;)&#xA;        return false;&#xA;    }&#xA; &#xA;    let seperatedNumber = thisElementValue.toString();&#xA;    seperatedNumber = funcReverseString(seperatedNumber);&#xA;    seperatedNumber = seperatedNumber.split(&#34;&#34;);&#xA; &#xA;    let tmpSeperatedNumber = &#34;&#34;&#xA; &#xA;    j = 0;&#xA;    for (let i = 0; i &lt; seperatedNumber.length; i++) {&#xA;        tmpSeperatedNumber += seperatedNumber[i];&#xA;        j++;&#xA;        if (j == 3) {&#xA;            tmpSeperatedNumber += &#34;,&#34;&#xA;            j = 0;&#xA;        }&#xA;    }&#xA; &#xA;    seperatedNumber = funcReverseString(tmpSeperatedNumber);&#xA;    if(seperatedNumber[0] === &#34;,&#34;) seperatedNumber = seperatedNumber.replace(&#34;,&#34; , &#34;&#34;);&#xA;    thisElement.value = seperatedNumber;&#xA;}دموی برنامهجدا کردن سه رقم اعداد جاوا اسکریپتدانلود برنامه جداسازی رقم ها با JSمبنع مقالهجیست</description><category>حسین باقری</category><author>حسین باقری</author><pubDate>Mon, 09 Aug 2021 15:32:56 +0430</pubDate></item><item><title>انتقال فایل های هاست به هاست دیگر با PHP , Js ( استفاده از فناوری Ajax )</title><link>https://virgool.ir/@py98ir/انتقال-فایل-های-هاست-به-هاست-دیگر-با-php-js-استفاده-از-فناوری-ajax-gfkkv0ky0oig</link><description>انتقال سریع فایل از هاست به هاست دیگر ، یکی از مهم ترین مشکلات اصلی مدیران سایت انتقال فایل ( داده ) از سرور قبلی به سرور جدید می باشد .به جز قالب و ماژول هایی روی هاست قبلی نصب است و نیاز به انتقال و نصب روی هاست جدید دارد 2 بخش اصلی از اطلاعات وبسایت مانند :1- داده های دیتابیس2- فایل و پرونده های دانلود روی هاست دانلود ( در این آموزش روی این موضوع متمرکز خواهیم شد )نیازمند انتقال است .index.php صفحه HTML برای دریافت لینک فایل هاصفحه ای با فرمی را خواهیم داشت که می تواند لینک های فایل ها را دریافت و پس از ارسال درخواست POST به آدرس داخلی file-transfer.php نتیجه در جدول خود نمایش دهد .&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;fa&#34;&gt;&#xA;&lt;head&gt;&#xA;    &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;    &lt;title&gt;Rapidcode.iR - انتقال فایل بین 2 هاست مختلف&lt;/title&gt;&#xA;    &lt;link rel=&#34;stylesheet&#34; href=&#34;static/css/main.css&#34;&gt;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;    &lt;div class=&#34;container&#34;&gt;&#xA;        &lt;a id=&#34;introduce&#34; href=&#34;https://rapidcode.ir&#34; target=&#34;_blank&#34;&gt;رپید کد • کتابخانه مجازی برنامه نویسان&lt;/a&gt;&#xA; &#xA;        &lt;form dir=&#34;ltr&#34; id=&#34;form-host-info&#34;&gt;&#xA;            &lt;textarea name=&#34;remote-file&#34; id=&#34;remote-file&#34; rows=&#34;10&#34; placeholder=&#34;لینک فایلی که میخواهید انتقال دهید&#34;&gt;&lt;/textarea&gt;&#xA;            &lt;input type=&#34;button&#34; id=&#34;send&#34; value=&#34;انتقال&#34;&gt;&#xA;        &lt;/form&gt;&#xA; &#xA;        &lt;table id=&#34;logger&#34;&gt;&#xA;            &lt;thead&gt;&#xA;                &lt;tr&gt;&#xA;                    &lt;th&gt;تاریخ و زمان&lt;/th&gt;&#xA;                    &lt;th&gt;پیغام&lt;/th&gt;&#xA;                &lt;/tr&gt;&#xA;            &lt;/thead&gt;&#xA;            &lt;tbody&gt;&#xA;                 &#xA;            &lt;/tbody&gt;&#xA;        &lt;/table&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;script src=&#34;static/js/lib/farvardin.min.js&#34;&gt;&#xA;    &lt;script src=&#34;static/js/app.js&#34;&gt;&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;&lt;!DOCTYPE html&gt;فایل main.css استایل برنامه.container {&#xA;    margin: 0 auto;&#xA;    width: 80%;&#xA;    text-align: center;&#xA;    direction: rtl;&#xA;}&#xA; &#xA;#introduce {&#xA;    display: block;&#xA;    width: 100%;&#xA;    font-size: 35px;&#xA;    font-weight: bold;&#xA;    color: white;&#xA;    padding-bottom: 5px;&#xA;    background-color: #4CAF50;&#xA;    text-decoration: none;&#xA;    margin-bottom: 15px;&#xA;}&#xA; &#xA;/* Page Style */&#xA; &#xA;#logger {&#xA;    border-collapse: collapse;&#xA;    width: 100%;&#xA;    margin-top: 35px;&#xA;}&#xA; &#xA;#logger th,&#xA;#logger td {&#xA;    border: 1px solid green;&#xA;    padding: 5px 10px;&#xA;}&#xA; &#xA;#logger td {&#xA;    direction: ltr;&#xA;}&#xA; &#xA;#logger th:first-child {&#xA;    width: 35%;&#xA;}&#xA; &#xA;#success {&#xA;    background-color: green;&#xA;    color: white;&#xA;    border-radius: 5px;&#xA;    display: inline-block;&#xA;    padding: 5px;&#xA;}اسکریپت file-transfer.php برای دریافت فایل از سرور قدیمی و انتقال آن به سرور جدیدmax_execution_time حداکثر زمان برای اجرا اسکریپت php که default روی 30 ثانیه است ولی با قرار دادن عدد صفر آن را روی نامحدود تنظیم می کنیم یعنی تا زمانی که دانلود و انتقال پرونده زمان می برد اسکریپت اجرا شود .&lt;?php&#xA; &#xA;ini_set(&#34;max_execution_time&#34;, 0); # در صورتی که از محیط شل استفاده می کنید نیازی به این نیست&#xA; &#xA;class TransferFileHosts&#xA;{&#xA; &#xA;    private $transfer_rate = 8192; // max chunk size 8192&#xA; &#xA;    public $remote_link = &#34;&#34;&#xA;    public $path_to_save = &#34;&#34;&#xA;    public $file_basename = &#34;&#34;&#xA;    public $file_extension = &#34;&#34;&#xA;    public $filename = &#34;&#34;&#xA;    public $file_size = 0;&#xA; &#xA; &#xA;    public function __construct($remote_link = null, $path_to_save = null)&#xA;    {&#xA;        if (!$remote_link) return false;&#xA; &#xA;        if (!is_dir($path_to_save)) mkdir($path_to_save);&#xA; &#xA;        $this-&gt;remote_link = $remote_link;&#xA;        $this-&gt;path_to_save = $path_to_save;&#xA;        $fileinfo = pathinfo($this-&gt;remote_link);&#xA;        $this-&gt;file_basename = $fileinfo[&#34;basename&#34;];&#xA;        $this-&gt;file_extension = $fileinfo[&#34;extension&#34;];&#xA;        $this-&gt;filename = $fileinfo[&#34;filename&#34;];&#xA;        $this-&gt;file_size = $this-&gt;get_remote_filesize($this-&gt;remote_link, false);&#xA;    }&#xA; &#xA;    public function get_remote_filesize($remote_link = null, $convert_to_mb = true)&#xA;    {&#xA;        $tmp_remote_link = $remote_link;&#xA;        if (!$tmp_remote_link) $tmp_remote_link = $this-&gt;remote_link;&#xA;        $headers_data = get_headers($tmp_remote_link, true);&#xA;        $filesize = $headers_data[&#39;Content-Length&#39;];&#xA;        $filesize = $convert_to_mb ? $this-&gt;convert_byte_to_mb($filesize) : $filesize;&#xA;        return $filesize;&#xA;    }&#xA; &#xA;    public function convert_byte_to_mb(int $byte)&#xA;    {&#xA;        $mb = $byte / 1048576;&#xA;        $mb = round($mb, 2);&#xA;        return $mb;&#xA;    }&#xA; &#xA;    public function download_file()&#xA;    {&#xA;        $progress_percent = 0;&#xA;        $filesize = $this-&gt;convert_byte_to_mb($this-&gt;file_size);&#xA;        $path_to_save = &#34;{$this-&gt;path_to_save}{$this-&gt;file_basename}&#34;&#xA;        echo &#34;&lt;p id=\&#34;download\&#34;&gt;Downloading {$this-&gt;file_basename} with size : {$filesize} MB&lt;p&gt;&#34;&#xA;        $fp_server = fopen($this-&gt;remote_link, &#34;rb&#34;);&#xA;        $fp_local = fopen($path_to_save, &#34;wb&#34;);&#xA; &#xA; &#xA;        while (!feof($fp_server) &amp;&amp; $content = fread($fp_server, $this-&gt;transfer_rate)) {&#xA;            $progress_percent += strlen($content) / $this-&gt;file_size * 100;&#xA;            fwrite($fp_local, $content);&#xA;        }&#xA; &#xA;        echo &#34;&lt;p id=\&#34;transfer\&#34;&gt;file &lt;strong id=\&#34;filename\&#34;&gt;{$this-&gt;file_basename} &lt;/strong&gt;&lt;span id=\&#34;success\&#34;&gt; successfully&lt;/span&gt; transferred to {$path_to_save}&lt;p&gt;&#34;&#xA;    }&#xA;}&#xA; &#xA;$save_path = __DIR__ . &#34;/server/&#34;&#xA;$link = @$_POST[&#39;remote-file&#39;];&#xA; &#xA;if (!$link) {&#xA;    die(&#34;&lt;p id=\&#34;error\&#34;&gt;no remote file passed !&lt;/p&gt;&#34;);&#xA;}&#xA; &#xA;$transfer_agent = new TransferFileHosts($link, $save_path);&#xA;$transfer_agent-&gt;download_file();توضیحات لازم برای کلاس TransferFileHostsدر ابتدا که ویژگی مورد نظر مان را با توجه به کاربرد و سطح دسترسی شان تعریف می کنیم :transfer_rate ← نرخ انتقال اطلاعات از آنجایی که تابع fread حداکثر تا 8192 بایت امکان دریافت داده دارد .remote_link ← لینک فایلی که می خواهیم دانلود و به هاست جدید انتقال داده شود .path_to_save ← مسیری که می خواهیم فایل دانلود شده روی آن ذخیره شود .file_basename ← نام فایل + پسوند ( این متغیر پس از وارد کردن لینک فایل مقدار دهی خواهد شد )file_extension ← پسوند فایل ( *.x )filename ← نام فایل ( x.* )file_size ← حجم فایل ( برحسب بایت )متد __constructپس از وارد کردن آدرس لینک فایل و مسیر ذخیره این متد شروع می کند به مقدار دهی .با کمک تابع pathinfo می توانیم کلی جزئیات از نام فایل داشته باشیم .متد get_remote_filesizeاین متد پس از وارد کردن لینک فایل حجم آن را با تابع get_headers با ما می دهد همچنین اگر دومین پارامتر آن true باشد حجم آن را به مگابایت تبدیل می کند .متد convert_byte_to_mbاز نام آن مشخص هست تبدیل واحد بایت به مگابایت .متد download_fileprogress_percent درصد دریافت اطلاعات را به ما می دهد در صورتی که این پروژه را بر روی shell اجرا می کنید به کارتان خواهد آمد .fp_server : فایل پوینتری هست برای دریافت اطلاعات از لینک داده شده . مود rb خواندن داده به صورت باینریfp_local : فایل پوینتری برای ذخیره فایل دانلود شده از هاست بر روی مسیر داده شده . مود wb ذخیره داده به صورت باینریتابع fread : آرگومان دوم این است که در هر درخواست چه میزان از داده را بخواند ( برحسب بایت ) که روی حداکثر 8192 تنظیم کردیم .تابع feof : بررسی می کند به پایان داده فایل رسیده است یا خیر .در آخر لینک فایل را که به صورت متد POST ارسال می گردد را دریافت و با مسیر ذخیره به کلاس TransferFileHosts می دهیم و با متد download_file انتقال و ذخیره سازی را آغاز می کند .اسکریپت app.js ارسال درخواست POSTjs بازها می دونند که دیگه کار های Dom manipulation و xhr رو با این فایل انجام می دیم ( کار های ساده )let url = location.href + &#34;file-transfer.php&#34;&#xA;var itemCounter = 0;&#xA;let remoteFiles = [];&#xA; &#xA;const btnSend = document.getElementById(&#34;send&#34;);&#xA;const inpRemoteFileUrl = document.getElementById(&#34;remote-file&#34;);&#xA; &#xA;// Register Event Listener&#xA;btnSend.addEventListener(&#34;click&#34; , handlerSendTransferRequest);&#xA; &#xA; &#xA; &#xA;// functions&#xA;function funcGetPersianDate(){&#xA;    const date = new Date();&#xA;    const fullDate = [date.getFullYear() , date.getMonth() , date.getDate()];&#xA;    const persianDate = farvardin.gregorianToSolar(fullDate[0] , fullDate[1] , fullDate[2] , &#34;string&#34;) + &#34; # &#34; + date.getHours() + &#34;:&#34; + date.getMinutes() + &#34;:&#34; + date.getSeconds();&#xA;     &#xA;    return persianDate;&#xA;}&#xA; &#xA;function funcInsertToTable(tableDom  , domData){&#xA;    tableDom.querySelector(&#34;tbody&#34;) += domData;&#xA;}&#xA; &#xA;function funcShowMessageResponse(response){&#xA;     &#xA;    itemCounter++;&#xA;    const table = document.getElementById(&#34;logger&#34;);&#xA;    const html = new DOMParser().parseFromString(response , &#34;text/html&#34;);&#xA;    let downloadDom = html.getElementById(&#34;download&#34;);&#xA;    let transferDom = html.getElementById(&#34;transfer&#34;);&#xA;    const persianDate = funcGetPersianDate();&#xA;    const tableRowDom = `&lt;tr&gt;&lt;td&gt;${persianDate}&lt;/td&gt;&lt;td id=&#34;dl-${itemCounter}&#34;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;${persianDate}&lt;/td&gt;&lt;td id=&#34;tr-${itemCounter}&#34;&gt;&lt;/td&gt;&lt;/tr&gt;`;&#xA;    funcInsertToTable(table , tableRowDom);&#xA;    document.getElementById(&#34;dl-&#34;+itemCounter)(downloadDom);&#xA;    document.getElementById(&#34;tr-&#34;+itemCounter)(transferDom);&#xA;}&#xA; &#xA;function funcSendPostRequest(url){&#xA;     &#xA;    if(!remoteFiles[0]) return false;&#xA;    btnSend.setAttribute(&#34;disabled&#34; , &#34;true&#34;);&#xA; &#xA;    const xhr = new XMLHttpRequest();&#xA;    xhr.open(&#34;POST&#34; , url);&#xA; &#xA;    const form = new FormData();&#xA;    form.append(&#34;remote-file&#34; , remoteFiles[0]);&#xA; &#xA;    xhr. = function(){&#xA;        if(this.status === 200){&#xA;            const response = this.response;&#xA;            funcShowMessageResponse(response);&#xA;            remoteFiles.shift();&#xA;            if(remoteFiles[0]) funcSendPostRequest(url);&#xA;            else btnSend.removeAttribute(&#34;disabled&#34;);&#xA;        }else{&#xA;            alert(&#34;خطایی از سمت سرور میزبان دریافت گردید&#34;)&#xA;        }&#xA;    }&#xA; &#xA;    xhr. = function(e){&#xA;        alert(&#34;خطای شبکه&#34;);&#xA;        console.warn(e);&#xA;    }&#xA; &#xA;    xhr.send(form);&#xA;}&#xA; &#xA; &#xA;// handler functions&#xA;function handlerSendTransferRequest(wedontneedthiseventLoL){&#xA;    const remoteFile = inpRemoteFileUrl.value.split(&#34;\n&#34;);&#xA;    if(!remoteFile) {&#xA;        alert(&#34;یک آدرس معتبر برای انتقال فایل وارد کنید !&#34;);&#xA;        return false;&#xA;    }&#xA;    remoteFiles = remoteFile;&#xA;    funcSendPostRequest(url);&#xA;}دانلود سورس انتقال هاست به هاستمنبع : RaPiDcoDe.iRآموزش ویدیویی این مقاله</description><category>حسین باقری</category><author>حسین باقری</author><pubDate>Sat, 07 Aug 2021 18:22:30 +0430</pubDate></item><item><title>آموزش Namespaces در php پی اچ پی</title><link>https://virgool.ir/@py98ir/how-to-use-namespace-in-php-nismdvodxd2w</link><description>namespace-in-phpدر خیلی از زبان های برنامه نویسی سطح بالا namespace ها وجود دارند .فضای نام یا namespace ها مشخص کننده هویت کلاس و تابع می شوند و به نوعی باعث سازماندهی کلاس ها با توجه به ویژگی هایشان می شوند .دلایل استفاده از Namespacesسازماندهی کلاس ها با توجه به ویژگی هایشاننظم بخشیدن قابل توجه به ساختار برنامهجلوگیری از تکرار نام کلاسمورد 1 : سازماندهی کلاس ها با توجه به ویژگی هایشانکد زیر توضیح دهنده مورد 1 هست :&lt;?php&#xA; &#xA;namespace Posts;&#xA; &#xA;class Article{&#xA;    const publisher = &#34;RapidCode.iR&#34;&#xA;    public $ID = 0;&#xA;    public $title = &#34;&#34;&#xA;    public $content = &#34;&#34;&#xA;     &#xA;    public function create_article(int $id ,string $title ,string $content){&#xA;        $this-&gt;ID = $id;&#xA;        $this-&gt;title = $title;&#xA;        $this-&gt;content = $content;&#xA;    }&#xA;     &#xA;    public function get_article(int $id){&#xA;        if($this-&gt;ID != $id)&#xA;            return &#34;Article Not Found !&#34;&#xA;         &#xA;        return &#34;{$this-&gt;title} : {$this-&gt;content}&#34;&#xA;    }&#xA;     &#xA;    public static function get_publisher(){&#xA;        return self::publisher;&#xA;    }&#xA;}&#xA; &#xA;class Product{&#xA;   // می تواند علاوه بر ویژگی های بالا ویژگی های دیگری هم داشته باشد .&#xA;}&#xA; &#xA;?&gt;مورد 2 : نظم بخشیدن قابل توجه به ساختار برنامهبا توجه به مورد 2 : همانطور که مشاهده می کنید namespace با نام posts داریم که به عنوان سردسته می باشد و زیر دسته های آن کلاس های Article و Product می باشد . و زمان استفاده خیلی منظم و با توجه به نامی که دارند خیلی مرتبط و با نظم استفاده می شود .مورد 3 : جلوگیری از تکرار نام کلاسبه طور عادی اگر 2 کلاس هم نام داشته باشیم پس از اجرای آن با خطای :Cannot declare class * because the name is already in use inکلاس مورد نظر از قبل تعریف شده است مواجه می شویم .همانند کد زیر :فایل a.php&lt;?php&#xA; &#xA;class Admin{&#xA;    // بخش مدیریت وبلاگ&#xA;    const url = &#34;https://blog.rapidcode.ir&#34;&#xA;}&#xA; &#xA; &#xA;?&gt;فایل b.php&lt;?php&#xA; &#xA;class Admin{&#xA;    // بخش مدیریت فروشگاه&#xA;    const url = &#34;https://shop.rapidcode.ir&#34;&#xA;}&#xA; &#xA; &#xA;?&gt;و در پایان که 2 فایل بالا را در index.php استفاده می کنیمفایل index.php ( خطای تکرار نام )require_once &#34;a.php&#34;&#xA;require_once &#34;b.php&#34;راه حل : از تگ php فایل a.php و b.php فضای نام Blog و Shop را همانند زیر اضافه کنید .فایل a.php :namespace Blog;فایل b.php :namespace Shop;توجه : باید namespace را در بالا اسکریپت خود استفاده کنید .فایل index.php ( به درستی اجرا خواهد شد )&lt;?php&#xA; &#xA;require_once &#34;a.php&#34;&#xA;require_once &#34;b.php&#34;&#xA; &#xA;$admin_blog = new Blog\Admin();&#xA;$admin_shop = new Shop\Admin();&#xA; &#xA;echo $admin_blog::url; #https://blog.rapidcode.ir&#xA;echo &#34;\n&#34;&#xA;echo $admin_shop::url; #https://shop.rapidcode.ir&#xA; &#xA;?&gt;آشنایی بیشتر با namespace و useفایلی با نام posts.php داریم .فایل posts.php&lt;?php&#xA; &#xA;namespace Posts;&#xA; &#xA;function vprint($name){&#xA;    return &#34;hello {$name}&#34;&#xA;}&#xA; &#xA;class Article{&#xA;    const publisher = &#34;RapidCode.iR&#34;&#xA;    public $ID = 0;&#xA;    public $title = &#34;&#34;&#xA;    public $content = &#34;&#34;&#xA;     &#xA;    public function create_article(int $id ,string $title ,string $content)    {&#xA;        $this-&gt;ID = $id;&#xA;        $this-&gt;title = $title;&#xA;        $this-&gt;content = $content;&#xA;    }&#xA;    public function get_article(int $id){&#xA;        if($this-&gt;ID != $id)&#xA;            return &#34;Article Not Found !&#34;&#xA;         &#xA;        return &#34;{$this-&gt;title} : {$this-&gt;content}&#34;&#xA;    }&#xA;    public static function get_publisher(){&#xA;        return self::publisher;&#xA;    }&#xA;}&#xA;?&gt;روش استفاده از namespace و useدر صورتی که بخواهیم از کلاس Article استفاده کنیم ابتدا باید namespace آن را وارد کنیم برای اینکار 2 راه داریم یا از خود کلیدواژه namespace استفاده کنیم یا use .بهتر است از use استفاده کنید ، خیلی انعطاف پذیر تر از namespace است .استفاده از namespace&lt;?php&#xA;namespace Posts; // واردسازی فضای نام posts&#xA;require_once &#34;posts.php&#34;&#xA; &#xA;$article = new Article();&#xA;?&gt;استفاده از useuse Posts\Article;&#xA;$article = new Article();امکان استفاده از نام مستعار هم وجود دارد :use Posts\Article as article;&#xA;$article = new article();&#xA; &#xA;echo article::publisher; // RapidCode.iR&#xA;echo $article::publisher; // همان خروجیمی توان بدون use و namespace از کلاس و تابع بهره برداستفاده از تابع که زیر مجموعه فضای نامی است :echo Posts\vprint(&#34;@rman&#34;); // hello @rmanنحوه استفاده از کلاس :$article = new Posts\Article;&#xA;$article-&gt;create_article(23 , &#34;مقاله ی جدید&#34;, &#34;محتوای مقاله جدید&#34;);&#xA;echo $article-&gt;get_article(23); // مقاله ی جدید : محتوای مقاله جدیداستفاده از تابع static و ثابت ها :echo Posts\Article::get_publisher(); // RapidCode.iR&#xA;echo &#34;&lt;br&gt;&#34;&#xA;echo Posts\Article::publisher; // RapidCode.iRثابت __NAMESPACE__&lt;?php&#xA; &#xA;namespace Posts;&#xA; &#xA;class Article{&#xA;    public static function get_namespace(){&#xA;        return __NAMESPACE__;&#xA;    }&#xA;}&#xA; &#xA;$article = new Article();&#xA;echo Article::get_namespace(); // Posts&#xA; &#xA;?&gt;منبعآموزش ویدیویی همین آموزش</description><category>حسین باقری</category><author>حسین باقری</author><pubDate>Thu, 05 Aug 2021 13:51:08 +0430</pubDate></item></channel></rss>