PDA

View Full Version : مبتدی: تفاوت include و require



امین مستانی
یک شنبه 17 دی 1391, 22:39 عصر
با عرض سلام خدمت دوستان و استادان بزرگوار

یه سوال داشتم اینکه تفاوت میان include و require و require_once چیه ؟؟

در سایت php.net جستجو کردم ولی خوب متوجه نشدم.

لطفا به زبان ساده برای یک مبتدی تازه کار بگید ..

ممنون و موفق باشید

Unique
یک شنبه 17 دی 1391, 22:53 عصر
هر سه تاشون برای الحاق (بهتر بگیم دخیل کردن) یک فایل php دیگه به اسکریپت در حال اجرا برای استفاده از روال ها یا کلاس ها یا کلا خطوط همون اسکریپت هست.

include : سعی میکنه فایل را براتون الحاق کنه ولی اگه پیدا نشد خوب بیخیال میشه و ادامه میده !
require : سعی میکنه فایل را براتون الحاق کنه ولی اگه پیدا نشد fatal error میده و روند اجرا متوقف میشه
include_once و require_once همون کار توابع اصلی را میکنند با این تفاوت که اگه یکبار فایلی الحاق شده باشه دوباره اون را الحاق نمیکنند (بهتره از این توابع استفاده نشه ! مثلا اگه از APC استفاده کنید (سرعت اجرا اسکریپت را بالا میبره با مطمئن شدن از اینکه یک اسکریپتی که یکبار تفسیر شده دیگه تفسیر مجدد نشه) require_once یک over head شدید میندازه توی کار روی اسکریپت های عادی هم تاثیر خودش را داره و باید به روالهای اصلی برنامه php مراجعه کنید تا متوجه تاثیرات منفیش بشین ! اگه از require و Include درست استفاده کنید مقادیر Once اونها بی مصرف میشوند)

colors
یک شنبه 17 دی 1391, 22:55 عصر
سلام

خیلی در این باره بحث شده، یه سری به لینکهای زیر بزن
لینک 1 (http://aftab.cc/tutorial/508)
لینک 2 (http://www.jovo.ir/questions/18/%D9%81%D8%B1%D9%82-%D8%A8%DB%8C%D9%86-include-%D9%88-require-%D8%AF%D8%B1-php-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F)

MMSHFE
یک شنبه 17 دی 1391, 23:02 عصر
include اگه به هر دلیلی نتونه فایل رو ضمیمه کنه (مثل مسیر اشتباه و...) یه هشدار (Warning) میده و بقیه اسکریپت رو اجرا میکنه. درمقابل require اگه به چنین مواردی برخورد کنه، یک خطای مرگبار (Fatal Error) میده و جلوی اجرای بقیه اسکریپت رو هم میگیره. بنابراین پیشنهاد من اینه که اگه فایلی که میخواین ضمیمه کنید، یک کار جانبی انجام میده (مثل اسکریپ نمایش وضعیت آب و هوا و...) با include ضمیمه کنید که فوقش یک پیغام خطا ظاهر بشه ولی سایت بالا بیاد اما اگه یک فایل اساسی رو ضمیمه میکنید (مثل فایل تنظیمات که بقیه کدهای سایت وابسته به بارگذاری صحیح اون فایل هستن)، از require استفاده کنید تا بقیه اسکریپت هم اجرا نشه چون درصورت اجرا، خطاهای بیشتری دریافت خواهید کرد.
اما درمورد نسخه های once_ و تفاوت اونها با نسخه معمولی این توابع باید بگم که اگه فایلی که ضمیمه میشه، فقط چندتا متغیر تعریف کرده باشه، با چندبار ضمیمه شدن توی یک اجرا، مشکلی پیش نمیاد ولی اگه توش ثابت، تابع، کلاس و... تعریف کرده باشیم، اگه این فایل بیش از یکبار ضمیمه بشه، با خطای Duplicate Definition مواجه میشیم. برای جلوگیری از این مشکل، از نسخه once_ استفاده میکنیم که قبل از ضمیمه کردن، چک میکنه ببینه قبلاً ضمیمه شده یا نه. حالا اگه فایلتون فقط چندتا متغیر ساده تعریف کرده، بهتره از نسخه معمولی (include یا require) استفاده کنید چون سرعتش بیشتره و چک نمیکنه ببینه قبلاً ضمیمه شده یا نه ولی اگه ضمیمه شدن مجدد موجب بروز خطا میشه (توی فایلتون کلاس، تابع و... دارین)، از include_once یا require_once برحسب نیازتون استفاده کنید. خوب شاید بگین خیلی ساده جلوی ضمیمه شدن دوباره رو با چک کردن میگیریم ولی همیشه کار به این راحتی نیست. مثلاً فایل index.php ممکنه دو فایل config.php و db.php رو ضمیمه کنه و فایل db.php هم فایل config.php رو ضمیمه کرده باشه و در اینجا فایل config.php دوبار ضمیمه میشه. برای همین جلوی این خطاها رو با استفاده از نسخه once_ میگیریم. امیدوارم خوب توضیح داده باشم.
موفق باشید.

eshpilen
دوشنبه 18 دی 1391, 09:59 صبح
من در پروژم همه جا از نوع require استفاده کردم. چون معنی نداره که فایل اینکلود شونده سرجاش نباشه! و میخوام اگر نبود این احتمال نباشه که آدم متوجه نشه، حالا چه فایل اساسی باشه و چه غیراساسی.
دوما اگر از require استفاده نکنیم در کل ریسک امنیتی بالا میره. چون ممکنه حواسمون نباشه و در بعضی موارد کم و بیش امنیتی هم از include استفاده کنیم. بخصوص چون بعضی وقتا تشخیص اینکه اینکلود شدن یا نشدن یک فایل میتونه روی امنیت تاثیر بذاره کار راحت و چیز روشن و توی چشمی نیست (سناریوهای ضعفهایی که ممکنه ایجاد کنه میتونن نسبتا پیچیده و پنهان باشن).

بعدشم من در بالای 90% موارد در برنامم از require_once استفاده کردم.
شما میگید آدم خودش میتونه بفهمه و با کمی دقت کاری کنه که یک فایل بیش از یک بار اینکلود نشه (طرف دیگرش رو هم درنظر بگیرید: و یک فایل تا قبل از یک مکان خاص حتما اینکلود شده باشه)، ولی خب این یک ادعای بدون اثباتی است؛ برنامهء من اینقدر کد و الگوریتم هاش حجیم و پیچیده شده بود که تشخیص اینکه یک فایل در کجاها اینکلود میشه در چه شرایطی، و در یک نقطهء خاص اطمینان از اینکه حتما تا قبل از اون فایل مورد نظر اینکلود شده، بسیار دشوار بود. حتی اگر کلی وقت و انرژی صرف میکردم صرف trace کردن تمام الگوریتم و مسیر و انشعاب های شرطی برنامه (و این کار رو با هر تغییری در کد و الگوریتم باید تکرار میکردم)، بازم در خیلی موارد نمیشه بقدر کافی از این مسئله مطمئن بود.
یک قاعدهء منطقی مهمی هست در برنامه نویسی بنظر بنده، و اون اینکه تا میشه باید عملیات رو بصورت خودکار درآورد و از وابستگی روی کار و خطای انسانی پرهیز کرد. بخصوص در مسائل امنیتی هم این مهمه، ولی در مسائل غیرامنیتی هم الان در بیشتر موارد ارزش وقت و انرژی انسان از ارزش منابع سخت افزار و کمی زمان پردازش بیشتر، بیشتره.

منم گفتم خب این امکانات زبان رو واسه چی گذاشتن پس! واسه همین چیزاس دیگه. وقتی گذاشتن تا کار آدم رو راحت کنه و احتمال باگ در برنامه پایین میاد که برای امنیت هم مهمه، پس چرا ازش استفاده نکنم؟ این شد که از require_once استفادهء گسترده ای کردم در برنامم!
مثل نقل و نبات هم استفاده میکنم :بامزه:

کلیتش بنظر من هیچوقت راحتی و سرعت و امنیت برنامه نویسی رو نباید فدای افزایش پرفورمنس کرد، مگر وقتی که واقعا مجبور باشیم، یعنی موقعی که در عمل مشکل جدی در پرفورمنس مشاهده بشه و متوجه بشید که برای رفع اون چارهء دیگری نیست.
یه جملهء معروفی هم هست از یه آدم معروفی که میگه: premature optimization is the root of all evil.
ترجمش میشه یه چیزی توی این مایه ها: بهینه سازی زودهنگام ریشهء تمام پلیدی هاست.

در کلش هم من تا حد زیادی مطمئنم که این require_once ها در پرفورمنس برنامهء من تاثیر قابل توجهی ندارن. هرچند اگر هم تاثیر قابل توجهی داشته باشن بازم مهم نیست، چون درکل پرفورمنس برنامم برای کاربرد و مقیاس و هدفی که براش درنظر داشتم کافیه، یا اینطور بگم که هنوز در عمل مشکل جدی ای در پرفورمنسش بهم اثبات نشده، پس مشکلی هم وجود نداره!

وقت و انرژی خودتون رو بیخودی صرف بهینه سازیهای جزیی صرفا بر اساس حدس و گمان و شرایطی که در عمل احتمال رخ دادن اون کمه یا معلوم نیست نکنید.
امروزه خیلی کارهای مهمتری هست برای صرف وقت و انرژی.
اگر بحث بهینه سازی جزیی اینقدر مهم بود باید اصلا PHP رو میذاشتید کنار و مثلا با سی برنامه مینوشتید.
انجام بهینه سازی بنظر بنده در دو مورد عاقلانه است:
1- بهینه سازی درشت و واضحی هست که انجام اون وقت و انرژی زیادی صرف نمیکنه.
منظورم از درشت اینه که تاثیرش بیشتر از اینه که نهایت فقط چند صدم ثانیه سرعت اجرا رو ببره بالا یا حداکثر چند صد بایت در RAM صرفه جویی کنه، و امثالهم. شاید حتی تا یک دهم ثانیه سرعت بیشتر و چند کیلوبایت حافظهء کمتر هم مهم نباشه.
2- در عمل مشکل جدی مشاهده میشه که راه دیگری جز انجام اون بهینه سازی براش نیست (یا راههای دیگر پرهزینه تر هستن).
البته یک مورد سومی رو هم شاید بتونیم اضافه کنیم:
3- وقتی برنامه دوره های توسعه و تست خودش رو سپری کرده و نسخه های پایدار از اون منتشر شده و بر اساس تجربه و استفادهء عملی جا افتاده و صحت ساختار و کد کلی اون به اثبات عملی رسیده و باگهای سطح بالاترش تاحد ممکن رفع شدن، اونوقت میتونیم برای استفادهء بهینه تر و سودبری در طولانی مدت، یکسری بهینه سازیهای غیرضروری رو هم روی برنامه انجام بدیم. تازه اینم خودش یک ریسک ایجاد باگهای جدید رو داره که شاید در موارد حساس و امنیتی به همین علت معقول نباشه.
در این مرحله روی کد و ساختار برنامه بینش کلی و عمیق و مهارت کافی شکل گرفته و اولویت های دیگر مثل سرعت توسعه و تست انجام شدن، و برنامه با همین کد و ساختار و امکانات به احتمال زیاد در طولانی مدت کار خواهد کرد، و بنابراین علاوه بر اینکه هزینهء بهینه سازیها کمتر شده (بعلت بینش و مهارت و دقت و اطمینان ایجاد شده روی برنامه)، تاثیر بهینه سازیها میتونه در بلندمدت مورد استفاده قرار بگیره و هزینهء صرف شده رو برگشت بده.

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

siavashsay
دوشنبه 18 دی 1391, 10:09 صبح
طبق گفته های جناب شهرکی !
2 تا سوالی که برام پیش اومد اینه که ..

1- یعنی require_once چک میکنه که ببینه آیا توی فایل های ضمیمه شده فایلهای تکراری هم هست یا نه ؟! و اگر اون فایل ضمیمه شده بود دیگه اون رو ضمیمه نمیکنه ؟!
درسته ؟!
---
2 - فرض کنید ما در یک فایل مثلا config.php خودمون session_start کردیم و در فایل index.php هم هیمنطور !
حالا میایم با require_once فایل config.php رو در index.php ضمیمه میکنیم ! آیا برای این مورد مشکلی پیش نمیاد که ما 2 بار session_start کردیم ؟!
چون توی هر 2 فایل session_start شده ! این به مشکلی بر نمیخوره ؟!
با تشکر

eshpilen
دوشنبه 18 دی 1391, 10:29 صبح
1- یعنی require_once چک میکنه که ببینه آیا توی فایل های ضمیمه شده فایلهای تکراری هم هست یا نه ؟! و اگر اون فایل ضمیمه شده بود دیگه اون رو ضمیمه نمیکنه ؟!
درسته ؟!

درسته.



2 - فرض کنید ما در یک فایل مثلا config.php خودمون session_start کردیم و در فایل index.php هم هیمنطور !
حالا میایم با require_once فایل config.php رو در index.php ضمیمه میکنیم ! آیا برای این مورد مشکلی پیش نمیاد که ما 2 بار session_start کردیم ؟!
چون توی هر 2 فایل session_start شده ! این به مشکلی بر نمیخوره ؟!چرا مشکل ایجاد میکنه.
چون session_start دوبار اجرا میشه.
البته در عمل اجرای دوباره session_start خطر جدی نداره و صرفا یک پیام هشدار میده.
برای رفع این مشکل (اگر براتون مهم باشه و راه دیگری براش استفاده نکنید) میتونید فرمان session_start رو در یک فایل جداگانه بذارید و هرجا خواستید سشن رو استارت کنید اون فایل رو require_once کنید. یعنی میتونید توی config.php اون رو require_once کنید و میتونید توی ایندکستون هم همین کار رو کنید (ولی منطقا اگر توی فایل کانفیگ گذاشته باشید معمولا نیازی نیست جای دیگه این کار رو انجام بدید، چون فایل کانفیگ معمولا در ابتدای کار در تمام صفحات اینکلود میشه).
من در پروژهء خودم همین کار رو کردم. البته یکسری کد و عملیات دیگر هم در اون فایل هست که همشون مربوط به سشن میشن.

eshpilen
دوشنبه 18 دی 1391, 10:36 صبح
البته یک نکته هست درمورد require_once که بنده در پروژهء خودم بهش بصورت خطا و باگ برخورد کردم، و اونم اینکه require_once اگر در یک تابع یا کلاس و خلاصه جایی که scope عمومی نیست فراخوانی شده باشه، و اگر همون فراخوانی بوده باشه که اون فایل هدف رو برای اولین بار در برنامه اینکلود کرده، اونوقت در جاهای دیگر بعد از اون وقتی require_once بکار میبرید اون فایل مجددا اینکلود نمیشه، چون قبلا اینکلود شده، اما چون در یک scope محدود اینکلود شده بوده بنابراین توابع و متغییرهای اون در جاهای دیگر برنامه در دسترس شما نخواهند بود و این ممکنه موجب ایجاد خطا یا باگ در برنامهء شما بشه.
بنابراین باید به این نکته توجه داشته باشید و یا فایل ها رو در خارج از توابع و کلاسها require_once کنید و یا مثلا محتویات و عملیات اون فایل طوری باشه که در جاهای دیگر برنامه نیازی به دسترسی مجدد بهشون نباشه.

ravand
دوشنبه 18 دی 1391, 11:05 صبح
من میخواستم در قسمت rss سایتم برای اینکه تاریخ رو به صورت شمسی وارد دیتابیس بکنم از include استفاده کردم . تا فایل jdf.php رو اینکلود کنم ولی این باعث میشه اصلا rss سایتم کار نکنه. به نظرتون مشکل از کجاست؟ من هم با include تست کردم و هم با require . ولی فایده ای نداشت! البته اینو بگم که در فایل های دیگه ی سایتم این مشکل وجود نداره ولی در این فایل rss این مشکل بوجود امده.

siavashsay
دوشنبه 18 دی 1391, 11:07 صبح
البته در عمل اجرای دوباره session_start خطر جدی نداره و صرفا یک پیام هشدار میده.

خوب این عمل رو اگه با Error_reporting صفر کنیم و ببندیم آیا مشکل ساز نمیشه ؟!
یعنی عیبی نداره ؟!

eshpilen
دوشنبه 18 دی 1391, 11:20 صبح
چرا عیب داره.
نهایت چنین مواردی رو بصورت موردی با استفاده از @ انجام بدید.
تازه اونم باز اصولی نیست و توصیه نمیشه.
بهتره از روشهای دیگری استفاده کنید.
البته موقع توسعه و تست هست که نیازه پیامهای خطا و هشدار همه نمایش داده بشن؛ بعدا موقع استفادهء عمومی معمولا پیامهای خطا رو کلا خاموش میکنن تا اطلاعاتی از سیستم نشت نکنه به دست نفوذگرها بیفته.

Unique
دوشنبه 18 دی 1391, 16:53 عصر
eshpilen عزیز گیر دادی به ما اخیرا ها توجه کردی ؟!

دوستان همشون حتما تجربه استفاده از این دو تابع را دارند و من فکر نمیکردم این topic بخواد 11 تا پست بخوره !
اما در مورد استفاده نکردن از require_once اگه برنامه نویس عادت کنه از کلاس ها استفاده کنه و متغیر هاش را دیمی تعریف نکنه و با منطق باشه و هی rerquire توی require نکنه و برای برنامش یک Loader بسازه که کلاس هاش از اوناج Load بشوند و از class_exists استفاده کنه باوز کنید نیازی به require_once نیست ! در مورد افت سرعت هم روی پروژه های معمولی به شرطی که از APC و نظیر اون استفاده نشده باشه تاثیری اونجوری که فکر کنید نداره ! اما برنامه نویس را یه جورایی تنبل میکنه (به نظر من).

siavashsay
دوشنبه 18 دی 1391, 18:15 عصر
چرا عیب داره.
نهایت چنین مواردی رو بصورت موردی با استفاده از @ انجام بدید.
تازه اونم باز اصولی نیست و توصیه نمیشه.
بهتره از روشهای دیگری استفاده کنید.
البته موقع توسعه و تست هست که نیازه پیامهای خطا و هشدار همه نمایش داده بشن؛ بعدا موقع استفادهء عمومی معمولا پیامهای خطا رو کلا خاموش میکنن تا اطلاعاتی از سیستم نشت نکنه به دست نفوذگرها بیفته.
آخه هر کاری هم کنیم به هر حال 2 تا صفحه پیدا میشن که توی هم ضمیمه شن و توی هر 2 اونها باید session_start شه !

MMSHFE
دوشنبه 18 دی 1391, 18:21 عصر
آخه هر کاری هم کنیم به هر حال 2 تا صفحه پیدا میشن که توی هم ضمیمه شن و توی هر 2 اونها باید session_start شه !
خوب یکم خلاقیت بخرج بدین : :چشمک:


if(!isset($_SESSION)) {
session_start();
}

siavashsay
دوشنبه 18 دی 1391, 18:36 عصر
خوب یکم خلاقیت بخرج بدین : :چشمک:


if(!isset($_SESSION)) {
session_start();
}

جناب شهرکی ممنونم از توضیحتون !
اما بحث اینجا بود که میخوام بدونم اگه ما توی 2 تاصفحه که نیاز داریم session_start شه و گاهی هم امکان داره اون صفحات توی هم require بشن این مشکلی درست نمیکنه که session_start دو بار پشت سر هم اجرا شه ؟!
مثلا توی config.php یک بار sessio_start کردم و توی index.php هم همینطور !
حالا اگه بخوایم config.php رو توی index.php ضمیمه کنیم مشکلی پیش نمیاد ؟! چون توی هر کدوم یک بار session_start شده !

MMSHFE
دوشنبه 18 دی 1391, 18:40 عصر
خوب من هم همینو گفتم: Session رو با اون کدی که گذاشتم start کنید. اینطوری اگه قبلاً start شده باشه، دوباره start نمیشه. اما در کل، دوباره start شدن مشکلی پیش نمیاره و دومی نادیده گرفته میشه و فقط یک E_NOTICE صادر میشه که اون رو هم میشه با @ مخفی کرد. البته eshpilen هم درست میگه: مخفی کردن خطاها پاک کردن صورت مسئله است. بهتره با همین روشی که گفتم، Session رو اصولی start کنید. به همین روش میشه درمورد سایر خطاها هم راه حل اصولی رو پیدا کرد.

ravand
دوشنبه 18 دی 1391, 19:00 عصر
الان چیزی که من از این بحث فهمیدم این بود که توی دو تا صفحه بی خودی سیژن رو استارت نکنم اول بررسی بکنم ببینم سیژن استارت شده یا نه؟ اگه استارت نشده بود استارتش کنم.
ولی من توی همه ی صفحاتم از این روش برای قسمت مدیریت سایت هام استفاده کردم . یعنی اولش استارتش کردم یعنی امنیت نداره؟ :لبخند:

<?php
session_start();
if(isset($_SESSION['login'])) {
//اگر سیژن هست دستورات رو اجرا کن

//وگرنه برو بیرون
} else {
header("location: login.php");
exit;
}
?>

siavashsay
دوشنبه 18 دی 1391, 19:05 عصر
دوست عزیز !
کد شما که درست هست !
مشکل و گفتگوی بنده با جناب شهرکی و بقیه دوستان این بود که اگر سشن 2 بار استارت شه ( اونم طی فرایند reqiure ) آیا مشکلی پیش نمیاره ؟! که گفتن نه زیاد !
و اینکه به هر حال کدی که جناب شهرکی دادن در مورد وجود هر سشنی بود ! یعنی اگر در کل سشنی موجود نبود سشن استارت شه !
حالا باز سوال بنده این هست که آیا با session_start سشن هم ساخته میشه یا فقط فرایند ساختن آماده میشه و بعد باید خودمون سشن رو تولید کنیم ؟!
اگر با session_start سشنی تولید نشه پس کد جناب شهرکی گمون نکنم مورد استفاده باشه !
چون ما session_start کردیم ! حالا هیچ سشنی هم تولید نکردیم هنوز !
حالا اگر کدی جناب شهرکی رو استفاده کنیم سیستم هنوز چون سشنی تولید نکرده پس دوباره session_start میکنه و میشه همون مشکلی که بنده گفتم !
؟!!!

MMSHFE
دوشنبه 18 دی 1391, 19:06 عصر
این موضوع ارتباطی به امنیت نداره. فقط بجای session_start ساده، اول چک کنید ببینید SESSION_$ تعریف شده یا نه و اگه نشده بود یعنی Session شروع به کار نکرده و اونوقت Session رو start کنید.

MMSHFE
دوشنبه 18 دی 1391, 19:09 عصر
فراخوانی session_start باعث میشه سشن شروع به کار کنه، فایل سشن ساخته بشه (خالی) و آرایه SESSION_$ بصورت خالی تعریف بشه. حالا وقتی یک سشن تعریف میکنید، توی فایل سشن نوشته میشه و اندیسش به آرایه SESSION_$ اضافه میشه. در دفعات بعدی هم که session_start صدا زده میشه، اگه فایل وجود داشته باشه، خونده میشه و آرایه SESSION_$ با محتواش پر میشه. این یعنی درهرحال با فراخوانی session_start آرایه SESSION_$ تولید میشه (حالا یا خالی، یا دارای مقدار). پس کدی که دادم کار میکنه.

ravand
دوشنبه 18 دی 1391, 19:09 عصر
خب این دستور session_start از اسمشم پیداست که یعنی سیژن شروع بشه نه اینکه ایجاد بشه.

siavashsay
دوشنبه 18 دی 1391, 19:41 عصر
فراخوانی session_start باعث میشه سشن شروع به کار کنه، فایل سشن ساخته بشه (خالی) و آرایه SESSION_$ بصورت خالی تعریف بشه. حالا وقتی یک سشن تعریف میکنید، توی فایل سشن نوشته میشه و اندیسش به آرایه SESSION_$ اضافه میشه. در دفعات بعدی هم که session_start صدا زده میشه، اگه فایل وجود داشته باشه، خونده میشه و آرایه SESSION_$ با محتواش پر میشه. این یعنی درهرحال با فراخوانی session_start آرایه SESSION_$ تولید میشه (حالا یا خالی، یا دارای مقدار). پس کدی که دادم کار میکنه.

جناب شهرکی ! حق با شماس ! بنده هم نگفتم کدتون کار نمیکنه !
فقط سوالم این بود که آیا با session_start فایل سشنی تولید میشه یا خیر !
که شما راهنمایی کامل کردید !
در هر صورت تشکر میکنم از پیگیریتون :)