سه شنبه ۰۱ تیر ۱۴۰۰

Tuesday, June 22, 2021 GMT +4:30

» آموزش برنامه نویسی وب با PHP

php

در طی مسیر فراگیری دانش و توسعه مهارتهای برنامه نویسی وب پس از آموختن کلیاتی از CSS, HTML و JavaScript دیر یا زود اسمی از یک زبان برنامه نویسی سمت سرور مانند PHP به گوشمان خواهد خورد، ساختار وب به گونه ای است که از دو بخش سمت کاربر (مرورگر) و سمت سرور (جایی که صفحه وب یا برنامه تحت وب در آن قرار دارد) تشکیل شده و لذا صرف آشنایی با آنچه تا کنون آموخته ایم نمی تواند برای انجام فعالیت های حرفه ای و طراحی سیستم های پیشرفته کافی باشد و لزوما باید یک زبان برنامه نویسی سمت سرور مانند PHP را فرا بگیریم، با PHP می توانیم به صورت پویا آنچه را که کاربر باید در صفحه مرورگر خود ببیند مدیریت کنیم، به طور مثال اگر فرم اولیه ورود به سایت با HTML و CSS طراحی شده باشد، پس از ارسال نام کاربری و کلمه عبور به سرور، این PHP است که وظیفه تطبیق اطلاعات با پایگاه داده و صدور اجازه یا عدم اجازه دسترسی به پنل مدیریت را بر عهده دارد، با PHP می توانیم تقریبا هر خواسته ای که از سرور داشته باشیم را عملی و صفحات وب داینامیک و برنامه های تحت وب حرفه ای طراحی کنیم.

تعریف PHP به زبان ساده


اگر بخواهیم PHP را به زبان ساده تعریف کنیم می توانیم آن را زبان برنامه نویسی اسکریپتی چند منظوره بنامیم که به طور خاص برای وب توسعه یافته و جهت نوشتن برنامه های تحت وب کاربرد تخصصی دارد، این تعریف ترجمه ساده از عبارتی است که در سایت php.net درج شده است:
PHP is a popular general-purpose scripting language that is especially suited to web development.
این زبان در سال 1994 میلادی توسط Rasmus Lerdorf با هدف نمایش آنلاین اطلاعات و رزومه شخصی به زبان C نوشته شد که به همین دلیل در ابتدا آن را Personal Home Page نامیدند که PHP مخففی از سرواژه های این عبارت است، بعدها با پیشرفت PHP عبارت توضیحی HyperText Preprocessor (پیش پردازنده ابرمتن) جایگزین عبارت فوق شد، منظور از پیش پردازنده ابرمتن این است که PHP ابتدا کدها و دستورات را با مفسر خود پردازش کرده و سپس خروجی را به مرورگر کاربر ارسال می کند.
نکته: منظور از اسکریپتی بودن PHP این است که کدهای آن در مفسر سرور پردازش شده و مانند برنامه های رایج در قالب یک بسته نرم افزاری کامپایل نمی شوند.

چرا PHP بیاموزیم و با PHP برنامه نویسی کنیم؟


اغلب علاقمندان به فراگیری دانش برنامه نویسی وب پس از اینکه از مرحله زبان های سمت کاربر عبور می کنند در دو یا بعضا چندراهی انتخاب یک زبان برنامه نویسی سمت سرور به شک و تردید دچار می شوند، محدودیت های زمانی، انرژی و حوصله ای که برای فراگیری یک زبان برنامه نویسی صرف می شود این انتخاب را بیش از پیش حساستر کرده و حتی آینده حرفه ای ما را رقم می زند، اگر در وب عباراتی مانند "PHP یا ASP کدام بهتر است؟!" را جستجو کنید، ملاحظه می کنید که اغلب بین برنامه نویسان در این خصوص که کدام زبان مناسب تر است بحث های طولانی و بعضا متعصبانه رخ داده و هر کسی با دید خود به این قضیه نگاه می کند، اما واقعیت این است که هیچ زبانی کامل و بی نقص نیست و ما هم قصد نداریم PHP را با زبان های دیگر مقایسه کنیم چرا که هیچ محدودیتی از این نظر که بتوانیم از چند زبان برنامه نویسی استفاده کنیم وجود ندارد و در واقع مرزی برایمان به عنوان برنامه نویس نباید ترسیم کنیم، PHP را می آموزیم چون متخصص در امر وب است و تمام نیازهایمان را به خوبی پوشش می دهد، چون ساده و در عین حال قدرتمند، سریع و امن است، رایگان، کم دردسر و در دسترس است، کدنویسی با PHP اغلب به درک بهتر ساختار و پیچیدگی های وب کمک می کند، PHP از شیوه های برنامه نویسی معمولی و شی گرا به خوبی پشتیبانی می کند، برای کار با پایگاه داده اکستنشن های قوی و تخصصی دارد، PHP متن باز (Open-source) است و آنگونه که توسعه محصولات شرکت های بزرگ به پدیدآورنده محدود می شود وابسته به شرکت خاصی نیست، اغلب برنامه های رایگان و پرکاربرد مدیریت محتوای وب (CMS) به زبان PHP نوشته شده اند مانند وردپرس، جوملا، دروپال و...، PHP توسط گروهی حرفه ای از برنامه نویسان وب پشتیبانی می شود، وجود سایت مرجع php.net و جامعه وسیعی از کاربران در سطح وب خود نویدبخش رشد شتابان PHP و رفع نواقص احتمالی نسبت به زبان های مشابه و آینده روشن است، لذا می توان PHP را یکی از مناسبترین گزینه ها برای برنامه نویسی سمت سرور به شمار آورد.

فراگیری PHP، آسان و شیرین!


شاید در نگاه اول آموختن PHP کاری پیچیده به نظر برسد اما اصولا برای یادگیری زبان های برنامه نویسی کافیست ایده های ذهنی مان را خط به خط روی کاغذ بنویسیم و سپس با توجه به دستورالعمل و شیوه نگارش (Syntax) هر زبانی به دنبال راه حل تبدیل و فهماندن ایده به سیستم شویم (تبدیل زبان انسان به زبان ماشین)، این روند در مورد PHP نیز صادق است و خوشبختانه می توان این زبان را جزء آسانترین و شیرین ترین زبان های برنامه نویسی قلمداد کرد که در عین قدرتمندی از سادگی و روانی خاص خود برخوردار است، یادآور می شویم PHP یک زبان برنامه نویسی است و قاعدتا مباحث آن به هم مرتبط و حالت سلسله مراتبی خواهند داشت، لذا اکیدا توصیه می کنیم آموزش ها را گام به گام، آهسته و پیوسته و با تمرین کافی فرا بگیرید تا شیرینی کدنویسی با این زبان را به بهترین نحو تجربه کنید.

برای کدنویسی PHP از چه برنامه ای استفاده کنیم؟


اکنون که با کلیات برنامه نویسی با PHP آشنا شدیم نوبت به ورود عملی به این مسیر است، در اولین گام این سوال مطرح می شود که برای کدنویسی PHP از چه برنامه ای باید استفاده کنیم؟ در پاسخ می توان چند برنامه قوی و کاربردی مختلف را پیشنهاد داد از جمله برنامه قدرتمند و مناسب PhpStorm (توصیه می کنیم برای شروع از این برنامه استفاده کنید)، برنامه شرکت ادوبی با نام Adobe Dreamweaver، برنامه رایگان و متن باز NetBeans IDE - PHP Development با محیط کدنویسی قوی و پشتیبانی مناسب، در کنار این برنامه ها استفاده از ویرایشگرهای به ظاهر ساده مانند ++Notepad برای کار با فایل های PHP ضروری خواهد بود، خوشبختانه تمام موارد نامبرده با یک جستجوی کوتاه در وب در دسترس می باشند.

اجرای کدهای PHP در سیستم عامل


از آنجایی که PHP یک زبان سمت سرور (Server-side) است برای اجرای آن در سیستم خود نیاز به برنامه هایی تحت عنوان سرور مجازی (Localhost) داریم که اغلب به صورت رایگان در دسترس هستند، برای نمونه یکی از بهترین ها در آدرس زیر قابل دریافت است:
wampserver.com
همچنین:
appservnetwork.com
و همچنین:
apachefriends.org
پس از نصب هر یک از برنامه های WampServer، AppServ یا XAMPP اکنون شما قادر به اجرای فایل های PHP بر روی سیستم خودتان خواهید بود (توصیه می کنیم یکی از نسخه های برنامه WampServer را متناسب با سیستم خود انتخاب کرده و نصب نمائید)، پس از نصب و اجرای برنامه به آیکن مربوطه که معمولا در نوار وظیفه سیستم عامل مشخص است دقت نمائید، به طور مثال برنامه WampServer در حالت عادی آیکنی سبزرنگ را نمایش می دهد و این یعنی سرور مجازی شما فعال و آماده به کار است، اکنون برنامه ویرایشگر فایل های PHP خود (به طور مثال PhpStorm) را اجرا و فایلی با نام example.php (فایل فرضی و نام دلخواه) در فولدر www محل نصب سرور مجازی ذخیره نمائید، به فرض اگر برنامه WampServer را در درایو C در فولدر Wamp قرار داده باشید، ریشه سرور مجازی شما به صورت نمونه زیر خواهد بود:
C:\Wamp\www
فایل example.php را درون این فولدر قرار دهید، بهتر است این فایل با نمونه کدهای ساده HTML کدنویسی شده باشد تا در هنگام گرفتن خروجی نتیجه مشخص شود، در نهایت مرورگرتان را اجرا کرده و عبارت http://localhost/example.php را در قسمت نوار آدرس نوشته، دکمه Enter را در صفحه کلید بزنید تا فایل از فولدر www فراخوانی شود، اگر همه چیز صحیح باشد صفحه وب شما در مرورگر نمایش داده خواهد شد درست مانند اینکه یک سایت آنلاین بر روی سرور واقعی برپا کرده باشید (در سرور آنلاین نیز معمولا ریشه سایت فولدر public_html یا www است).

چند مثال ساده با PHP


فلسفه پیدایش PHP (سال 1994 میلادی توسط Rasmus Lerdorf) ایجاد صفحات داینامیک و استفاده از آن در وب بوده (هرچند PHP را می توان به صورت General-purpose استفاده کرد) لذا می توان دستورات این زبان را در کنار کدهای ساده HTML درج و اجرا کرد (در اصطلاح PHP را HTML-embedded می گویند) این قابلیت یکی از نقاط قوت PHP محسوب شده و یادگیری آن را ساده تر می کند، برای شروع و آشنایی بیشتر کدها و مثال هایی ساده از این زبان را مرور می کنیم:
<?php
echo "اولین کد PHP من!";
?>
توضیح:
- کدهای PHP با تگ علامت سوال ، php شروع و با علامت سوال بسته می شوند (شیوه استاندارد).
- دستور echo مقادیر را به خروجی ارسال و در مرورگر چاپ می کند.
حال به کد زیر توجه کنید:
<?php
$text = "اولین کد PHP من!";
echo $text;
?>
پیش نمایش
توضیح:
- در کد بالا عبارت اولین کد PHP من! به جای اینکه مستقیما به echo داده شود، ابتدا به یک متغیر (در آینده در این رابطه مفصل خواهیم گفت) نسبت داده شده و سپس مقادیر متغیر با دستور echo به خروجی داده می شود (علامت $ در PHP نشان دهنده متغیر است).
حال به مثال زیر توجه کنید:
<?php
$num1 = 20;
$num2 = 50;
$total = $num1 + $num2;
echo $total;
?>
پیش نمایش
توضیح:
- کد بالا مقدار متغیر total را به خروجی خواهد داد و متغیر total برابر است با حاصل جمع دو متغیر num1 و num2 که اعدادی به دلخواه به آنها داده ایم.
- ملاحظه می کنید که PHP قدرت محاسبه منطقی دارد و می توان با آن از ترکیب چند مقدار یک مقدار جدید به دست آورد، این مثال ها اولیه و ساده هستند اما ما را با دنیای جدیدی آشنا می کنند که همان داشتن تفکر و هوش منطقی است و رفته رفته ذهنمان را برای نوشتن برنامه های سیستماتیک، طراحی الگوریتم ها و ساختارهای پیچیده تر وب آماده می کنند.
مثالی دیگر:
<?php
$name = 'Webgoo';
if ($name == 'Webgoo'){
    $hi = 'سلام وبگو!';
}
else{
    $hi = 'سلام، لطفا در سایت عضو شوید!';
}
echo $hi;
?>
پیش نمایش
توضیح:
- if (اگر) و else (در غیر اینصورت) برای ایجاد شرط منطقی به کار می روند و علامت == نشان دهنده برابری دو طرف آن است، اینها ابزارهایی است که در دنیای برنامه نویسی به کارمان می آیند و می توانیم به کمک آنها زبان انسان را به زبان ماشین تبدیل کنیم، در تفسیر کد بالا ابتدا متغیر name را با مقادیر از پیش تعریف شده Webgoo مقدار دهی کرده ایم (می تواند هر چیز دیگری باشد)، سپس با شرط if بررسی کرده ایم که اگر متغیر name برابر با مقدار Webgoo باشد، دستور echo داخل شرط if که بین دو علامت {} مشخص است اجرا شود، در غیر اینصورت قسمت else اجرا خواهد شد.
تقریبا هر آنچه که از وب بخواهید با PHP دستیافتنی است، در ادامه مطالب بخش آموزش های مقدماتی PHP در این باره بیشتر خواهیم گفت.
دسته بندی: آموزش مقدماتی » PHP
related مطالب بیشتر:
» دستور switch و case در PHP
» توابع (Functions) در PHP
» توابع کار با آرایه در PHP - بخش سوم
» توابع کار با آرایه در PHP - بخش دوم
» دستورات شرطی (Conditional Statements) در PHP
commentنظرات (۱۵۸ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: امیرحسین
۰۸:۴۰ ۱۳۹۶/۰۵/۱۴
سلام مجدد
سوال دومی هم داشتم که لطفا نمونه کدی بدین برای ارسال سشن با استفاده از URL ها
پاسخ: 
برای دریافت سشن از طریق URL و متد GET ابتدا باید این قابلیت فعال شود:
ini_set('session.use_trans_sid', 1);
توجه کنید که این روش در مقایسه با استفاده از کوکی می تواند یک ریسک باشد، لذا اولیت همیشه با روش کوکی است.
با فعال شدن این قابلیت PHP یک پارامتر با نام پیش فرض PHPSESSID به URL اضافه می کند که بین صفحات مختلف مقدار Session ID را به اشتراک می گذارد، این نام پیش فرض با استفاده از تابع session_name قابل تغییر است، قاعدتا برای دریافت مقادیر سشن باید از متد GET استفاده کنید.
<?php
ini_set("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
session_name('test');
session_start();
?>
<form action="<?php echo htmlspecialchars(SID); ?>" method="post">
<input type="submit" value="send">
</form>
نویسنده: امیرحسین
۱۱:۱۱ ۱۳۹۶/۰۵/۱۴
سلام استاد ممنون بابت راهنمایی هاتون لطفا در مورد واسط کاربری لحاظ کنم بیشتر توضیح بدین یعنی ممکن است آیپی ها عوض بشوند ؟ من تایم سشن را 15 دقیقه درنظر گرفتم و اگر این تایم تمام شود کاربر به بیرون صفحه هدایت میشود تا دوباره لاگین انجام دهد.
نقل قول از وبگو: "در قسمت بررسی IP بهتر است واسط کاربری را هم لحاظ کنید، در PHP واسط کاربری با کد زیر بدست می آید:
$_SERVER['HTTP_USER_AGENT']
دقت داشته باشید که کاربران به صورت بالقوه ممکن است از قابلیت اینترنت چند دستگاه به صورت گردشی استفاده کنند و IP آنها بین چند مورد دائم در نوسان باشد که در این حالت به مشکل برخواهند خورد! "
من این موارد را که فرمودین اصلا متوجه نشدم. میشه بیشتر توضیح بدین ؟
پاسخ: 
واسط کاربری در واقع اطلاعات مرورگر کاربر است، این اطلاعات به صورت معمولا در هر درخواست به سرور اعلام می شود و معمولا همواره ثابت است لذا در طی بررسی اگر مغایرتی وجود داشته باشد می توانیم سشن را خاتمه دهیم، منظور از IP گردشی نیز زمانی است که برخی کاربران با استفاده از سخت افزارهای شبکه از چند منبع مختلف به صورت هم زمان اینترنت خود را تامین می کنند و به همین دلیل IP آنها ممکن است در هر درخواست، IP یکی از این راههای اتصال اینترنت باشد، به فرض اینترنت ADSL و Wireless دو شرکت مختلف به یک روتر وصل باشند و هم زمان کاربر از هر دو استفاده کند، در این حالت ممکن است با هر چند درخواست، IP تغییر کند و لذا بررسی آن روش مطمئنی نیست.
نکته: استفاده از روش اتصال چندگانه بیشتر یک احتمال است که باید به آن توجه کنیم و به فرض یک سیستم هشدار برای کاربر در این حالت طراحی کنیم، در عمل خیلی به ندرت چنین مواردی دیده می شود.
نویسنده: مجتبی
۲۳:۰۰ ۱۳۹۶/۰۵/۱۴
سلام
نمیدونم چرا تگ php برامن کار نمیکنه و رنگش قرمز هست؟
پاسخ: 
فرمت فایل php است؟؟ کدها در سرور یا لوکال هاست اجرا می شوند؟؟
نویسنده: امیرحسین
۱۷:۳۶ ۱۳۹۶/۰۵/۲۳
سلام استاد عزیز وقت بخیر.
یه سوال جالب داشتم که ممنون میشم جواب منو بدین..
حذف شد
اولا این عکس رو برین نگاه کنید یه جدول صف هستش که ساختم این جدول صف های منه خب این جدوله که قراره کرون جاب هر 2 دقیقه یا 3 دقیقه میره یکیشو میخونه و انجام میده حالا اینجا من گفتم هر جا تو جدول فیلد date_send تایم استمپش از تایم کنونی کمتر بود اجرا کن از اونجایی که همه شون تایماشون یکی هست یه لیمیت گذاشتم که یدونه رو فقط بگیره خب الان یدونه رو کرون جاب از این جدول میگیره میخونه بعد گفتم... بعد گفتم قسمت فیلد post_id که شماره ایدی اون عکسی که قراره تو سرور تلگرام اپلود بشه هستش بعد به gc_id هم دقت کنید که برنامه از این قراره هر 3 دقیقه میره یدونه فیلم که حجمش 8 مگ هست یا عکسی که حجمش 1 مگ هست یا فیلمای دیگه میره تو سرور تلگرام اپلود میکنه بعد به کانالی که ایدی کانالش در قسمت gc_id مشخص شده میفرسته.
از اونجایی که حجم عکس کمتر هست مشکلی برای عکس ها وجود نداره اما فیلم که حجمش 8 مگ هست لوپ بیشتری نیاز داره بعد صفحه دوباره ریفرش میشه برنامه با خطا مواجعه میشه مثلا برای اپلود فیلمی که 8 مگ هست لوپ 2 دقیقه ای نیاز داره به طور مثال... اگه لوپش از 1 دقیقه بیشتر میشه صفحه رو ریفرش میکنه و دوباره انجام میشه یعنی یه فیلمو در کانال 2 بار یا شایدم 3 بار میفرسته در حالی که من میخوام 1 بار بفرسته... در مورد عکسا این مشکل وجود نداره در مورد فیلم هایی که کمتر از 1 مگ هست هم مشکلی نداره اما فیلمایی که حجمشون زیاد هست صفحه ریفرش میشه و چندین بار ارسال میشه.
چگونه از ریفرش شدن صفحه جلوگیری کنم ؟
پاسخ: 
دقیقا متوجه ساختار برنامه نشدیم اما باید ببینید متناسب با ساختار کدام روش می تواند از بروز خطا جلوگیری کند، به طور مثال اگر با فراخوانی مجدد صفحه، باعث اختلال در کارکرد فعلی آن می شود، می توانید اسکریپت اصلی را در یک فایل دیگر بنویسید و یک فایل برای بررسی وضعیت فایل اصلی داشته باشید، به طور مثال زمانی که فایل اصلی هنوز در حال انجام کار است یک فیلد در دیتابیس داشته باشید که به فرض مقدار 1 داشته باشد، بعد از پایان کار به 0 تغییر کند، در زمانی که Cron job اسکریپت اولیه را فراخوانی می کند، ابتدا وضعیت را چک کنید، اما اگر مشکل در Timeout شدن اجرای فایل PHP باشد، باید به تنظیمات سرور (فایل php.ini) دسترسی داشته باشید و این زمان را افزایش دهید:
upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
;also, higher if you must - sets the maximum time in seconds
تابع set_time_limit را نیز امتحان کنید:
http://php.net/manual/en/function.set-time-limit.php
نویسنده: امیرحسین
۱۳:۰۲ ۱۳۹۶/۰۵/۲۴
عزیز فرق این تابع
set_time_limit
با این تنظیم ini
max_execution_time
در چیه ؟
پاسخ: 
در ماهیت و نتیجه کار فرق خاصی ندارند، صرفا در نحوه تنظیم و استفاده با هم متفاوت هستند به طور مثال تابع set_time_limit اگر با مشکل مواجه شود چیزی برنمی گرداند، اما توابع ini_set در صورتی که با مشکل مواجه شوند نتیجه را false برمی گردانند.
نویسنده: امیرحسین
۱۳:۱۳ ۱۳۹۶/۰۵/۲۴
استاد عزیز این تابع هایی هم که معرفی کردین رو گذاشتم ولی بازم هنگام ارسال ویدئو حدود 40 مگ در سرور تلگرام هاست با این ارور مواجه میشه
The connection was reset
The connection to the server was reset while the page was loading.
The site could be temporarily unavailable or too busy. Try again in a few moments.
If you are unable to load any pages, check your computer’s network connection.
If your computer or network is protected by a firewall or proxy, make sure that Waterfox is permitted to access the Web.
اما در لوکال این مشکل وجود نداره با مرورگر دیگه هم این ارور رو میده
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request
پاسخ: 
ظاهرا اطلاعات ورود به پنل تغییر کرده، امکان بررسی میسر نیست! در هر صورت برای رفع این موارد دسترسی به تنظیمات سرور نیاز است به طور مثال بررسی اینکه توابع PHP به درستی عمل می کنند یا خیر، ممکن است نیاز به اعمال تغییراتی از جانب پشتیبانی سرور باشد.
نویسنده: امیرحسین
۰۵:۰۹ ۱۳۹۶/۰۵/۲۹
سلام استاد عزیز صبح عالی بخیر و امیدوارم حال شما خوب باشه
یه سوال داشتم.
چگونه میتوانم 24 ساعت قبل را به صورت تایم استمپ به دست بیارم من در پنل مدیریت برای هر پست زمان ثبت شده ش ثبت شده و میخوام اگر کاربر مطالب امروز را درخواست کرد از سرور بگم هر پستی که تایم استمپش از ساعت 12 دیشب بیشتر بود نمایش بده یعنی از ساعت 12 دیشب تا 12 شب امروز هرچی پست جدید بود میشن مطالب امروز من اون 12 شب دیشب رو چطوری میتونم تایم استمپشو بدست بیارم ؟ با چه فرمولی از تابع time کم و تفریق انجام بدم تا بدست بیاورم؟ ایا از jdf استفاده کنم بهتره؟ و نمیدونم دستور jdf ش چی میشه لطفا بهترین روش را با نمونه کد بدین ممنون میشم
پاسخ: 
برای این کار نیازی به استفاده از jdf نیست، این توابع برای تبدیل تاریخ استفاده می شوند! برای هدف شما بستگی دارد تاریخ و زمان را با چه فرمتی در دیتابیس ذخیره کرده باشید، اگر به فرض تاریخ و زمان به صورت میلادی و با فرمت نمونه زیر باشد:
1999-11-11 12:00:00
کار ساده است، با پرس و جوی زیر می توانید مطالب امروز را SELECT کنید:
 SELECT * FROM tbl WHERE DATE(col_name) = DATE(NOW())
باید نام ستون Date را جایگزین عبارت col_name کنید.
در حالت های دیگر بسته به فرمتی که تاریخ را در دیتابیس ذخیره می کنید شرایط فرق دارد، ممکن است نیاز به کدنویسی بیشتر و محاسبات باشد.
نویسنده: امیرحسین
۱۴:۳۳ ۱۳۹۶/۰۵/۲۹
استاد عزیز این کدی که دادین کار نکرد فکر کنم منظور منو متوجه نشده باشید در این کدا گفته شده که تمام تایم هایی که از تایم الان کوچیکتر یا مساوی باشند را انتخاب کنه
$r = $conn->query("SELECT * FROM tbl_send_time_post WHERE DATE(`date`) <= DATE(NOW())");
ولی من میخوام کدی را داشته باشم که تمام تایم هایی که از ساعت 0 دیشب بزرگتر باشه را انتخاب کنه یعنی از ساعت 12 بامداد دیشب تا الان هر پست جدیدی فرستاده شده را انتخاب کنه:
$time_dirooz = mktime (0, 0,0, date("n") , date("j") , date("Y"));
به جوابم رسیدم استاد عزیز همین کد را میخواستم که پیداش کردم با تشکر
پاسخ: 
در پاسخ از علامت = استفاده شده اما در کد شما علامت => درج شده که با هم متفاوت هستند، کد درج شده در پاسخ به طور کلی مشکلی ندارد و اگر فرمت تاریخ ذخیره شده در دیتابیس مطابق نمونه باشد به درستی عمل می کند، اما گویا فرمت ذخیره شده شما به صورت عددی و برچسب زمان (Timestamp) است (به این موضوع اشاره داشته اید، عدم دقت از جانب ما بوده!) که در این صورت تاریخ ها ابتدا باید تبدیل به برچسب زمان شوند که شما با تابع mktime این کار را انجام داده اید، در واقع هر دو کد تاریخ امروز (از ساعت 0 دیشب) را SELECT می کنند منتها فرمت تاریخ های ذخیره شده در دیتابیس متفاوت است!
نویسنده: هادی
۰۰:۵۵ ۱۳۹۶/۰۹/۱۰
درود
من سایتی را در لوکال طراحی کرده ام ولی بعد از آپلود به هاست متاسفانه صفحاتش اجرا نمی شود و ارور 500 میدهد
آیا بایست کار خاصی انجام دهم ؟
پاسخ: 
دریافت خطای 500 یعنی اشکالی در تنظیمات داخلی سرور وجود دارد، این اشکال می تواند ناشی از دستورات فایل های htaccess نیز باشد، لذا باید تنظیمات سرور و فایل ها بررسی شوند.
نویسنده: امیرحسین
۰۳:۰۰ ۱۳۹۶/۱۱/۰۱
سلام استاد عزیز
من یه سوال داشتم
که یک ساعت دارم که زمان شروع و پایانش مشخصه و گام حرکتشم مشخصه و میخوام داخل حلقه با یه گام حرکتی به من نشون داده بشه
یک ارایه دارم
$ar = array(
'start' => '17',
'finish' => '19'
);
$step = 30;
که استارت یعنی زمان شروع هست و فینیش هم یعنی زمان پایان و step هم یعنی گام حرکت ساعت هست حالا میخوام یک حلقه ای داشته باشم که این خروجی ها رو به من بده
17:00
17:30
18:00
18:30
19:00
والا موندم چه نوع حلقه فوری برای این بنویسم از ریاضی خوشم میاد ولی خلاقیت ندارم ولی واسم جذابه اینو بفهمم و کارمم گیر کرده پشت همین ممنون میشم جواب بدین
درضمن این 17 یا 19 قراره تغییر بکنه و گام حرکت نیز قابل تغییر هست و وقتی نوشته شده که پایانش 19 هست یعنی از ساعت 19:00 به بالا چیز دیگه ای نباید اکو بشه
پاسخ: 
با توجه به اینکه مدت زمان هر گام به دقیقه است اما زمان شروع و پایان به ساعت، باید ابتدا تمام مقادیر را به ثانیه تبدیل کنیم تا یک استاندارد مشترک داشته باشیم (هر ساعت برابر است با 60 دقیقه و هر دقیقه برابر است با 60 ثانیه):
<?php
$ar = array(
'start' => '17',
'finish' => '19'
);
$step = 30;

for($i = ($ar['start'] * 60 * 60); $i <= ($ar['finish'] * 60 * 60); $i = ($i + $step * 60)){
$hours = floor($i / 3600);
$mins = floor($i / 60 % 60);
$secs = floor($i % 60);

$time_format = sprintf('%02d:%02d:%02d', $hours, $mins, $secs);
echo $time_format . '<br>';
}
?>
نویسنده: امیرحسین
۰۶:۵۲ ۱۳۹۶/۱۱/۱۹
سلام استاد عزیز
new CURLFILE()
لطفا اموزش بدید که این تابع کارش چیه و نحوه عملکردش چگونه است و به صورت کامل همه چیشو بی زحمت اگه لطف کنید توضیح بدید من بدونم ؛ من فقط استفاده میکنم و نمیدونم پشت صحنه این دستور چه کاری میکنه و میخوام بدونم
پاسخ: 
CURLFILE یک کلاس در PHP برای آپلود فایل از طریق تابع curl است، با توجه به اینکه شیوه قبلی آپلود فایل در این تابع یعنی درج مستقیم مقادیر دریافتی از متد FILES در حال حاضر منسوخ شده است، مثال:
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file_name' => '@'.$_FILES['file_input']['tmp_name'])); 
در کدهای جدید از کلاس CURLFILE برای ساخت آبجکت مورد نیاز تابع curl_setopt استفاده می شود، این کار نیز معمولا به جهت حفظ استاندارهای امنیتی جدید، انعطاف پذیری بیشتر و... است، برای ساخت آبجکت از فایل ها دو روش وجود دارد.
- استفاده از حالت شی گراء، مثال:
<?php
$ch = curl_init('http://yoursite.com/upload.php');
$cfile = new CURLFile($_FILES['file_input']['tmp_name'],'image/jpeg','file_name');
$data = array('file_input' => $cfile);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>
- استفاده از حالت رویه ای:
<?php
$ch = curl_init('http://yoursite.com/upload.php');
$cfile = curl_file_create($_FILES['file_input']['tmp_name'],'image/jpeg','file_name');
$data = array('file_input' => $cfile);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>
نکته 1: با استفاده از دستور print_r می توانید از مقادیر آرایه data خروجی بگیرید:
print_r($data);
نکته 2: این روش از نسخه 5.5 PHP قابل استفاده است.
نویسنده: امیرحسین
۱۲:۴۳ ۱۳۹۶/۱۱/۲۰
بسیار ممنون توضیحات مفیدی بود استفاده کردم و یه سوال دیگه من دارم یه ربات تلگرامی مینویسم که از کاربر عکس میگیرم مثلا کاربر 200 تا عکس میفرسته به ربات بعد که 200 تا عکس ذخیره شدن رو سرور میام با یه حلقه 200 تا رو میفرستم به تلگرام تا استیکر کنه این میاد 6 تا میفرسته و تکراری میفرسته در کل این مدلیه یا مثلا
for($i = 1; $i <= 100; $i++){
sleep(1);
$telegram->sendMessage(array(
'chat_id' => ADMIN_ID,
'text' => "salam"
));
}
من با این دستور گفتم ربات تلگرام 100 بار یه پیام به من بفرسته ولی میاد 700 بار میفرسته یا 2000 بار متن "salam" رو میفرسته بعضی وقتا بینهایت هم میشه هی تند تند میفرسته تا اینکه من فایل index.php رو از رو سرور پاک میکنم اونوقت یه 100 بار ارسال میشه بعد متوقف میشه انگار که فایل من تو سرور کش میشه و کدای منو بینهایت اجرا میکنه اگه مثلا تو کدا چیزی باشه که وارد حلقه بشه و اون حلقه بینهایت بشه کدای من چندین بار یا ممکنه بینهایت بار اجرا شه چطور جلو این کار رو بگیرم و من حتما نیاز دارم 100 تا پیامو بفرستم و تلگرام هم 1 بار فایل منو اجرا کنه چون هر پیامی که میفرسته کاربر یه جیسونی به هاست من فرستاده میشه ببینید استاد عزیز
من تو فایلم این کدو اضافه کردم
if($chat_id == ADMIN_ID && $text == 'salam'){
for($i = 1; $i <= 100; $i++){
sleep(1);
$handle = fopen('ab.txt','a');
fwrite($handle,'_'.$i);
fclose($handle);
}
}
به رباته گفتم اگه ادمین ربات بهت پیام داد و متن پیامش سلام بود این کدا رو اجرا کن میاد یک فایل ایجاد میکنه و هی اضافه میشه ما الان انتظار داریم اینطوری تو فایل اکو بشه
_1_2_3_4..._100
ولی میبینم که بی نهایت اجرا میشه فایلو که میبینم اینطوری اکو شده
_1_2_3..._60_1_2_61_3_4_62_65_66_..._1_67_5
پس نتیجه میشه گرفت که این حلقه فور تا 65 اینا میره دوباره برنامه خاتمه داده میشه و چون ناقص کار کرده خود هاست دوباره اون فایلو اجرا میکنه و دوباره از 1 شروع میشه همینطور الا اخر تا بینهایت هی اجرا میشه اولش فکر کردم مشکل از تلگرامه ولی مشکل از هاستمه در این مورد مطمعن شدم یوقت فکر نکنید مشکل از تلگرامه
پاسخ: 
به نظر می رسد فایل شما در هنگام اجرا مجددا توسط خودتان یا کاربر دیگری فراخوانی می شود (احتمالا از طریق ارسال درخواست در ربات، برای اطمینان دور حلقه را به 10 مورد کاهش دهید و امتحان کنید) که این باعث اختلال در دورهای حلقه قبلی و حلقه های جدید می شود (sleep در اجرای دستورات وقفه یک ثانیه ای ایجاد می کند و برای اجرای یک درخواست حداقل 100 ثانیه زمان نیاز است، در این 100 ثانیه ممکن است مجددا درخواست ارسال شود) لذا این شیوه برای کارتان توصیه نمی شود چون باعث اختلال و کندی عملکرد سرور می شود، به نظر اینچنین سیستمی باید مبتنی بر فایل ZIP باشد یعنی تمام تصاویر حداقل بین سرور شما و تلگرام به صورت ZIP شده رد و بدل شوند (مطمئن نیستیم تلگرام از چنین قابلیتی پشتیبانی می کند یا نه!)، بحث دیگر حداکثر زمان اجرای اسکریپت در سرور است که معمولا مقدار 30 ثانیه در نظر گرفته می شود و بعد از آن به صورت خودکار اجرای کد متوقف می گردد.
نویسنده: امیرحسین
۱۹:۲۴ ۱۳۹۶/۱۱/۲۱
سلام استاد
در مورد سوال اخرم شما گفتی به نظر میرسه که هنگام اجرا مجددا توسط خودم یا کاربر دیگه اجرا میشه
این صحبتا درسته ولی من برای همین این شرطو گذاشتم
if($chat_id == ADMIN_ID && $text == 'salam'){
گفتم اگه کاربری که پیام داد فقط خودم باشم و متن پیامش هم حتما سلام باشه پس در این صورت فقط من پیام بدم و اگه متن پیامم "سلام" بود اون حلقه اجرا میشه درسته من اسلیپ رو برای تست همین گذاشتم اگه حلقه مثلا 20 بار اجرا بشه و 20 تا پیام بدون sleep بفرسته به درستی کار میکنه ولی اگه من کاری کنم که این حلقه مدت زمان بیشتری اجرا بشه مثلا 1 دقیقه یا 2 دقیقه حالا اگه مدت زمان حلقه بیشتر بشه و این دستور max_execution_time = 0 رو هم اول کدام با ini_set اعمال کنم این اتفاق میوفته :
مثلا من یه حلقه گذاشتم که از 1 تا 100 اجرا شه یعنی 100 بار و یه اسلیپ ده ثانیه ای هم میزارم که در کل میشه هر 10 ثانیه یک بار اجرا میشه تا 100 دور و در کل میشه هر 100 ثانیه یک پیام به من داده بشه که این مورد پیش میاد:
حلقه میگیره مثلا 10 تا پیام میده بعد برنامه خاتمه داده میشه و مجددا اجرا میشه توسط خود سرور و چون برنامه رو ناقص اجرا کرده میفهمه که باید مجدد اجرا کنه و دوباره حلقه از 1 تا 20 اجرا میشه و دوباره خاتمه داده میشه و همینطور الا اخر مثلا حتی اگه تلگرام هم نباشه من بخوام حلقه رو یکبار اجرا کنم بگم یه فایل متنی رو واسه من درونش هر یک ثانیه یک متنی بریز اینطوری میشه
_1_2_3_4_5_6_7_8_9_10_1_11_2_3_12_4_5_6_13_14_1_2_7_15_16_17_7_8_9_10_5_6
همین طور الا اخر انگار که حلقه همینطور وارد بینهایت میشه و تا یه دوری اجرا میشه و متوقف میشه و مجدد از 1 شروع میشه و همون دور قبلی رو هم ادامه میده به نظر من انگار متوقف نمیشه چندین بار هی اجرا میشه اگه به شماره ها دقت کنید میبینید که چند بار از 1 شروع شده و شماره های قبلی هم ادامه داده میشن تنها راهی ک به نظر من میرسه اینه که از کرون جاب استفاده کنم و بگم هر 10 ثانیه پیام بفرسته اخه چرا باید برنامه من چندین بار اجرا بشه درحالی که هیچ کاربری ربات من رو نمیشناسه و نمیتونه استفاده کنه برای اطمینان هم من حتی اینکارو کردم که اگه کاربر دیگه ای پیام داد همون ابتدا کدها die بشن بابت توضیحات زیاد معذرت امیدوارم مشکل من حل شود واقعا ممنون میشم
پاسخ: 
با توجه به توضیحات و اینکه در ثانیه های پائین مشکلی وجود ندارد، ایراد باید از تداخل اجرای دو یا چند فراخوانی فایل PHP توسط سرور باشد، ممکن است این مشکل به طور کلی قابل رفع نباشد چون به عملکرد سرور مربوط می شود، اما در هر صورت پاسخ قطعی با بررسی بیشتر در سرور به صورت آزمایش و خطا مشخص می شود، در هر حال استفاده از sleep برای هدف شما توصیه نمی شود چون تا زمانی که sleep اجرا می شود کد در سرور در حال اجرا است و فرآیند بسته نمی شود، اگر تعداد این موارد زیاد شوند به شدت بر عملکرد سرور تاثیر منفی خواهد داشت، باید یک راه حل دیگر پیدا کنید!
نویسنده: امیرحسین
۱۸:۳۹ ۱۳۹۶/۱۲/۰۸
سلام استاد
فرق این مورد
<?php
$ch = curl_init('http://yoursite.com/upload.php');
$cfile = new CURLFile($_FILES['file_input']['tmp_name'],'image/jpeg','file_name');
$data = array('file_input' => $cfile);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>
با
<?php
$ch = curl_init('http://yoursite.com/upload.php');
$cfile = new CURLFile(realpath('3.jpg'));
$data = array('file_input' => $cfile);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>
در چیه چون که جفتش به خوبی کار میکنه
پاسخ: 
کد اول فایل را در هنگام آپلود از سمت کاربر دریافت و آماده می کند اما در کد دوم فایل از قبل روی سرور قرار دارد و آدرس دهی بر همین اساس صورت می گیرد.
نویسنده: امیرحسین
۲۱:۰۲ ۱۳۹۶/۱۲/۱۱
سلام استاد عزیز
من یک rewriteRule نیاز دارم که اینکارو واسم کنه :
برای php mvc لازمش دارم که اگه کاربر صفحه ای رو درخواست کرد که نه فایل واقعی و نه پوشه واقعی بود درخواست رو بفرسته به صفحه ایندکس به همراه یک پارامتر
ولی اگه صفحه فایل واقعی رو درخواست کرد اجازه دسترسی بهش نده و access forbidden رو واسه کاربر چاپ کنه من کدای زیر رو نوشتم ولی کار نمیکنه
RewriteEngine On
RewriteRule ^.*\.[a-z]+$ - [F,L,i]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
خط دوم یعنی رول اول گفتم اگه ادرس صفحه یک فایل بود یعنی بعد هر اسمی داشت و بعدش حتما یک نقطه داشت و بعدش هر فرمتی داشت مهم نیس فرمتش php باشه یا css
پاسخ: 
دستورات به صورت اجمالی بررسی شدند، برای مسدود کردن دسترسی به فایل ها از دستور زیر استفاده کنید:
RewriteRule ^(.+)$ - [F,NC,L]
برای هدف دوم به نظر کدها مشکل خاصی ندارند، ممکن است نیاز به جابجایی آنها به ترتیب اولویت اجرا باشد، اگر مشکل پابرجا بود باید در سرور تست و آزمایش و خطا شود!
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- موارد غیرمرتبط با مباحث آموزش ها را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ مختصر داده خواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- از درج عناوین تبلیغاتی در فیلدها خودداری کنید، در صورتی که یادداشت تبلیغاتی تشخیص داده شود حذف خواهد شد.
- تمام یادداشت ها بررسی و زمانی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد خودداری کنید.





6 × 4
 refresh

آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form علیرضا
در:
مفید و کاربردی مرسی
۱۴۰۰/۰۳/۳۱

form محمود
در:
سلام مهندس وقت بخیر دوباره به کمک شما نیاز پیدا کردم ، چگونه می توان استایل صوت به یک متن داد. به...
۱۴۰۰/۰۳/۳۰

form پرتو
در:
سلام استاد خسته نباشید قالبم درست شد خیلی ممنون یه خواهش دیگه هم ازتون داشتم اینکه یه بوردر برای تک به تک پست ها جداگانه...
۱۴۰۰/۰۳/۲۴

form بهنیا
در:
سلام خسته نباشید ببخشید چطوری میتونم برای خود وبسایتم یه لینک بسازم؟ کد خاصی داره؟
۱۴۰۰/۰۳/۲۴

form Raha
در:
سلام وقت بخیر چه جوری می تونم از دو تا function باهم استفاده کنم. مثلا میخوام توی مسیج باکس دوتا عدد دلخواه بدم...
۱۴۰۰/۰۳/۲۴

form رها
در:
سلام ممنون میشم اگه راهنماییم کنید من میخوام تو جاوا اسکریپت توی مسیج باکس بصورت اختیاری عدد بدم و جمع و تفریق انجام بشه. ...
۱۴۰۰/۰۳/۲۴

form محمد
در:
با عرض سلام و احترام مجدد پیرو کامنت قبلی که لطف کرده و توجه فرمودید آدرس سایت این هست: از توجه و راهنمایی‌های همیشگی...
۱۴۰۰/۰۳/۲۳

form محمد
در:
سلام وقت بخیر با سپاس از تیم محترم وبگو یک سوال داشتم از خدمتتون در عکسی که در آدرس با...
۱۴۰۰/۰۳/۲۲

form پرتو
در:
با سلام استاد من براتون ایمیل فرستادم لطفا ایمیل خود را چک کنید با تشکر
۱۴۰۰/۰۳/۲۱

form پرتو
در:
سلام خوبید خسته نباشید من یه کد قالبی دارم که میشه براتون بفرستم و شما تغییرش بدین من قالبم رو می خاستم اگه...
۱۴۰۰/۰۳/۲۰

form سید ارمیا حسینی
در:
سلام ببخشید عالی بود اما اگه می خواستم مثلا چیزی رو ایجاد کنم که مثلا کاربر بعد از ورود به صحفه 5 ثانیه بعد وارد...
۱۴۰۰/۰۳/۲۰

form الی
در:
سلام وقت بخیر من میخوام یه سایت طراحی کنم و در قسمت هدر یه گیف بذارم ولی هر کار می کنم گیف نمایش داده...
۱۴۰۰/۰۳/۱۸

form علیرضا حسینی
در:
دمتون گرم خسته نباشید خیلی عالی بود
۱۴۰۰/۰۳/۱۸

form حامدترابی
در:
سلام چند وقته که وبلاگ شهیدحسن ترابی گودرزی باز نمیشه ولی با vpn باز میشه. میشه راهنماییم کنید. ممنون میشم
۱۴۰۰/۰۳/۱۶

form mahdi
در:
سلام استاد این تابع در لوکال هم ایمیل ارسال میکنه هم فایل ضمیمه ، البته زمپ رو یه سری تغییرات باید داد و حساب ایمیل...
۱۴۰۰/۰۳/۱۲

form mahdi
در:
سلام وقت بخیر ، استاد عزیز اگر ما با تابع mail یه تابعی بنویسیم که در لوکال قابلیت ارسال هر نوع ایمیلی رو داشته باشه...
۱۴۰۰/۰۳/۱۲

form masood
در:
سلام وقتتون بخیر ببخشید من یک سوالی دارم اگر بخوایم تنظیماتی که برای id و class در نظر داریم رو تو یه...
۱۴۰۰/۰۳/۱۱

form mahdi
در:
استاد وقتشو دارید امشب ببینیدش مثلا در حد نیم ساعت که وقتتونم گرفته نشه؟
۱۴۰۰/۰۳/۱۰

form mahdi
در:
سلام استاد وقت بخیر،استاد عزیز من یه چارت با جاوااسکریپت نوشتم که سه تا نمودار میلیه ای و خطی و نقطه ای رو در بر...
۱۴۰۰/۰۳/۱۰

form پرتو
در:
وای من نمی تونم توی زمینه طراحی قالب های دیگ فعالیت کنم چون خیلی سختن فک نکنم بتونم اگر جایی می شناسید که قالب های...
۱۴۰۰/۰۳/۰۹

form پرتو
در:
سلام خسته نباشید شرمنده مزاحم شدم دوباره، می خاستم بپرسم می ارزه کسی وبلاگ در مورد قالب سازی بزنه یا اینکه نه نمی ارزه آخه...
۱۴۰۰/۰۳/۰۹

form یاس
در:
سلام میخواستم بدونم چجوری باید فایل متنی HTML دارای هایپرلینک را باز کند و محتوای آنرا بخواند و سپس هایپرلینک های آن را شناسایی کند...
۱۴۰۰/۰۳/۰۸

form sattar
در:
سلام، اون قسمتی که اعتبار سنجی ورود حروف فارسی هست مشکل داره یعنی کاربر رو اجبار به وارد کردن حروف فارسی میکنیم اما اگر مثلا...
۱۴۰۰/۰۳/۰۸

form mahdi
در:
سلام استاد ckeditor بهتره یا TinyMCE؟ من اینو ckeditor دیدم که راست چین چپ چین نداشت بعد استاد عزیز من یه چیزی رو...
۱۴۰۰/۰۳/۰۶

form پرتو
در:
ممنونم از شما که کدش رو دادید فقط یه سوال داشتم و اونم اینکه این کد رو در کدوم قسمت قالب قرار بدم و ایا...
۱۴۰۰/۰۳/۰۴

form mahdi
در:
سلام نه استاد عزیز نیازی نیست چون خودمم فکر میکنم لوگو رو باید از قبل مثلا با فتوشاپ آماده داشت و فقط میخواستم این امکانم...
۱۴۰۰/۰۳/۰۳

form پرتو
در:
سلام خواستم تشکر کنم از کدی که قبلا بهم داده بودید درست شد قالبم واقعا ممنونم ازتون یه چیز دیگه می خاستم بگم اینکه یه...
۱۴۰۰/۰۳/۰۳

form دانیال
در:
باسلام خیلی ممنون بابت مطالب عالیه سایتتون این مطلب هم مثل بقیه مطالب عالی بود
۱۴۰۰/۰۳/۰۳

form mahdi
در:
سلام استاد عزیز ، بله استاد اونطوری قرار میگیره وقتی تصویر از قبل مثلا با فتوشاپ شفاف شده باشه ، ولی اگر بخوایم یک عکس...
۱۴۰۰/۰۳/۰۳
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.