PDA

View Full Version : سوال: نمایش پیغام ها به کاربر از طریق Session



Jason.Bourne
جمعه 01 شهریور 1392, 19:41 عصر
من برای نمایش پیغام ها به کاربر از طریق Session اقدام میکنم.
به این شکل که یه آرایه در Session به نام error دارم که پیغام ها در آن ذخیره می شود و در هر بار که صفحه ایجاد می شود این آرایه به کاربر نمایش داده می شود و در نهایت آرایه error را خالی میکنم.
به این شکل همه چیز خوب هست تا زمانیکه کاربر یک صفحه یا یک TAB در مرورگر خود باز کرده باشد.
اگر کاربر بیش از یک Tab یا صفحه باز کند، در نمایش پیغام ها اختلال ایجاد می شود (مثلا در صفحه 1 پیغام خطایی که در صفحه 2 رجیستر شده است، نمایش داده می شود).

برای حل این مشکل چه راه حلی پیشنهاد می کنید؟!

tux-world
شنبه 02 شهریور 1392, 02:29 صبح
منظورتون از عبارت " در نهایت آرایه error را خالی میکنم." چیه؟ کی خالیش میکنید؟؟ بهتره به جای سشن از متغیرهای استاتیک یا define استفاده کنید

Jason.Bourne
شنبه 02 شهریور 1392, 08:38 صبح
فکر کنم منظورم را درست بیان نکردم.
در آرایه error پیغام هایی که در سطح برنامه ایجاد می شود، نگهداری می شوند و پس از نمایش محتوای این آرایه آن را خالی میکنم.

مثلا در جایی که باید با توجه به شرایط پیغامی ایجاد شود، از کد زیر استفاده می کنم.


$_SESSION['error'][] = 'کد کاربری یا رمز عبور اشتباه می باشد.';

و در همه صفحات از کد زیر استفاده می شود (هنگامی که صفحه ایجاد می گردد، کلیه پیغام هایی که لازم است به کاربر نمایش داده شود از طریق آرایه که در session ایجاد شده است، نمایش داده شده و پس از آن این آرایه خالی می شود تا پیغام های جدید در آن ذخیره گردد.

در واقع یک جور Flash Messages هستش.


if(isset($_SESSION['error']) AND count($_SESSION['error']) > 0)
{
foreach($_SESSION['error'] as $error)
{
echo $error . '<br>';
}

unset($_SESSION['error']);
}

AliRezaPro
شنبه 02 شهریور 1392, 09:05 صبح
اگر کاربر بیش از یک Tab یا صفحه باز کند، در نمایش پیغام ها اختلال ایجاد می شود (مثلا در صفحه 1 پیغام خطایی که در صفحه 2 رجیستر شده است، نمایش داده می شود).

دلیل استفاده از Session ؟ همیشه برای کارهاتون دلیل قانع کننده داشته باشید . وقتی میتونستید همین کار را به یه شکل دیگر انجام دهید چرا Session ؟
میدونستید که وقتی session جایی تغییر کنه این تاثیر رو , رو همه صفحه هات میذاره ؟

Jason.Bourne
شنبه 02 شهریور 1392, 09:52 صبح
میدونستید که وقتی session جایی تغییر کنه این تاثیر رو , رو همه صفحه هات میذاره ؟

بله. اطلاع دارم.


ببینید دوست من،

من در یک صفحه نیاز دارم که بر اساس عملیاتی (یک عملیات خاص) پیغامی را به کاربر نشان دهم.
مکانیزمی که من در پیش گرفتم این هست که پیغام مورد نظر را در Session ذخیره کنم و کاربر را به صفحه دومی (ثانویه) هدایت کنم (Redirect کنم) و در صفحه ثانویه پیغام مورد نظر را از session بخوانم و به کاربر نمایش دهم.
روش دومی که میشه از اون استفاده کرد، Query String است (پیغام مورد نظر را به Query String اضافه کنم و کاربر را به صفحه دوم هدایت کنم و پیغام را از Query String دریافت و به کاربر نمایش دهم.) به نظر من یک مشکل در این روش وجود دارد (محدود بودن طول کاراکتر های Query String و اینکه پیغام جلوی چشم کاربر هستش (هرچند که میشه اون را encrypt کرد))

خوشحال می شوم که نظرات و پیشنهادات شما را بشنوم.

AliRezaPro
شنبه 02 شهریور 1392, 10:41 صبح
یه جور دیگه فکر کنیم :
یه صفحه ی Message ایجاد میکنیم و همه ی ارور ها را در ان صفحه تعریف کنیم .
از هر صفحه ایی که بخواهیم Redirect شیم به این صفحه فقط عدد پیغام را میفرستیم که تو صفحه ی message آن را نشان دهد. بازم نیاز به session احساس نمیشه

Jason.Bourne
شنبه 02 شهریور 1392, 13:37 عصر
به نظر میاد این ایده خوبی باشه. چون میشه چند کد را بصورت همزمان هم ارسال کرد (بیشتر از یک پیغام). اما یک محدودیت در این روش هست. در این روش محدود میشیم به پیغام های از قبل تعیین شده.

پ.ن
در سیستم جوملا و فریم وورک Codeigniter از Session استفاده میشه. هر چند در نسخه 1 جوملا پیغام از طریق Query String ارسال می شد. اما فکر کنم از نسخه 2.5 با Session هستش

Jason.Bourne
شنبه 02 شهریور 1392, 20:00 عصر
با سلام
سایت آزاد دانلود که به تازگی افتتاح شده حاوی کتاب ها و فیلم های آموزشی زیادی در زمینه های مختلف علوم کامپیوتر است که بازدید از آن سایت را به شما پیشنهاد می کنم.
همچنین یک سری فیلم آموزشی کامل در رابطه با طراحی سایت با CSS3 و HTML5 ( همچنین PHP ) نیز به زبان فارسی بر روی سایت موجوده که دیدنش رو به همه دوستان پیشنهاد می کنم
www.azad-dl.com
با تشکر

ببخشید، چه ربطی داره؟!!

AliRezaPro
شنبه 02 شهریور 1392, 20:36 عصر
پس در صفحه ی message چک کنید اگر ورودی عدد (شماره خطا) نباشد حتما متن است , که هر چی ورودی گرفت را نمایش بده

Jason.Bourne
یک شنبه 03 شهریور 1392, 01:43 صبح
دیگر دوستان نظری در این خصوص ندارند؟

Jason.Bourne
دوشنبه 04 شهریور 1392, 15:42 عصر
:افسرده: :ناراحت:

a.gh.n
سه شنبه 05 شهریور 1392, 01:10 صبح
پر کردن Session را تا لحظه پایان در خواست (قبل از ریدایرکت کردن) به تعویق بندازید. مثلاً از کد زیر به جای header استفاده کنید:


function flash_and_redirect($url, $message, $category) {
$_SESSION['flash'][$category][] = $message;
header("Location: $url");
exit();
}

خواندن پیعام را هم در سریع‌ترین زمان ممکن انجام دهید. ممکن است لازم باشد هنگام خواندن فقط اولین Message را بخوانید و حذف کنید، بستگی به پیاده سازی شما دارد.
تابع بالا را می‌توانید تغییر دهید تا بخشی از URL بعدی را هم به عنوان کلیدی از $_SESSION در نظر بگیر ([SESSION['flash']['error']['/home.php_$') تا بعد از redirect شدن، با اطمینان، پیغام مربوط را بردارید؛ ولی اگر Session را در زمان مناسب پر و خالی کنید نیازی به این کارها نیست.