PDA

View Full Version : یه مشکل عجیب با Session و رRefresh صفحه



babak869
چهارشنبه 23 اسفند 1385, 22:25 عصر
سلام
من به تازگی توی یه پروژه به مشکلی برخوردم که خیلی عجیب به نظر میرسه
------------
من برای نوشتن سبد خرید یه سایت مقادیر کالا و قیمت و تعداد رو در session بنامهای مختلف ذخیره میکنم و در بالای هر صفحه اونا رو در یه جدول نمایش میدم.
در کنار هر ردیف کالای انتخابی هم یه عکس به شکل ضربدر گذاشتم تا هر کالا رو که خواست از لیست حذف کنه.
برای کد حذف اونم از کد زیر استفاده کردم



print "<a onclick=\"return confirm('warning ');\" href='myPage.php?action=delete'><img src='img/del.png' >";


و برای پاک کردن session این کد رو نوشتم



if( $_GET['action'] == "delete" )
{
unset($_SESSION['ta1']);
header ("Location: myPage.php");
exit();
}


اما زمانی که کاربر یکی از اقلام رو پاک میکنه با وجود اینکه تابع هدر درست کار میکنه و صفحه مجددا بارگذاری میشه اما بازم باید دستی Refrsh کرد تا تغیرات قابل مشاهده باشه.
البته کدهای بالا روی سیستم Local کاملا جواب میده اما روی سایت ایراد میگیره

البته اینو بگم که در هر صفحه سه متغیر session برای نام کالا و تعداد و قیمت تعریف کردم که نامهاشون کاملا متفاوته . اما زمانی که مثلا کاربر 3 قلم کالا انتخاب کرده و در صفحه کالای شماره 2 هست با پاک کردن کالای شماره 3 تابع عمل میکنه اما تا رفرش نشه تغییرات رو نمایش نمیده
اگه دوستان تا بحال به این مشکل برخورد کردند لطفا راهنمایی و تبادل نظر نمایند
متشکرم

babak869
پنج شنبه 24 اسفند 1385, 10:05 صبح
من نمیدونم آیا با رفتن از یه صفحه سایت با دامین ثابت فرضا www.mysite.com مقدار session از بین میره ؟ یا چه دلیلی داره که در بعضی صفحات مقدار بعضی از session ها شناسایی و خوانده نمبپیشه در صورتی که کد خواندن اونا یک شکل و در یه فایل نوشته شده و بصورت header.php به صفحات اصلی اضافه میشه
ممنونم

armin390
پنج شنبه 24 اسفند 1385, 20:53 عصر
اما زمانی که کاربر یکی از اقلام رو پاک میکنه با وجود اینکه تابع هدر درست کار میکنه و صفحه مجددا بارگذاری میشه اما بازم باید دستی Refrsh کرد تا تغیرات قابل مشاهده باشه.
البته کدهای بالا روی سیستم Local کاملا جواب میده اما روی سایت ایراد میگیره
شاید! صفحه کش شده رو میبینی...


من نمیدونم آیا با رفتن از یه صفحه سایت با دامین ثابت فرضا www.mysite.com (http://www.mysite.com/) مقدار session از بین میره ؟
بستگی به اسکریپتی داره که صدا زده میشه و اطلاعاتی که براش ارسال میشه...


یا چه دلیلی داره که در بعضی صفحات مقدار بعضی از session ها شناسایی و خوانده نمبپیشه در صورتی که کد خواندن اونا یک شکل و در یه فایل نوشته شده و بصورت header.php به صفحات اصلی اضافه میشه
میدونی یک session (جلسه) چطور پیاده سازی میشه؟!

I,Nobody
پنج شنبه 24 اسفند 1385, 22:40 عصر
یه بار به جای استفاده از تابع header ، توسط جاوااسکریپت redirect کن ببین مشکلت حل میشه؟

babak869
پنج شنبه 24 اسفند 1385, 23:02 عصر
میدونی یک session (جلسه) چطور پیاده سازی میشه؟!

منظورتون از پیاده سازی جلسات چیه؟
آیا قاعده خاصی داره؟ چطور میتونم جلوی کش شدن صفحه رو بگیرم؟
متشکرم

babak869
پنج شنبه 24 اسفند 1385, 23:12 عصر
یه بار به جای استفاده از تابع header ، توسط جاوااسکریپت redirect کن ببین مشکلت حل میشه؟

اتفاقا با جاوا اسکریپت انجام دادم مشکل حل شد .اما در بعضی صفحات مقدار بعضی از session ها رو نمیخونه . مثلا اگه کاربر 3 قلم کالا انتخاب کرده باشه و قیمت هرکدام 100 باشه در قسمت جمع کل 300 مینویسه اما در بعضی از صفحات یکیشون غیب میشه. تمام کدها رو دونه به دونه چک کردم مشکلی نداشت.

در حقیقت مشکل اصلی و نهایی من با خونده نشدن مقدار متغیرها در بعضی صفحات هست
البته اینو بگم که این اشکال در صفحه یا صفحات مشخصی نیست و متغیره . گاهی تو صفحه 1 یه متغیر رو نمیخونه گاهی توی صفحه 2 یا ...
بخدا دیگه کلافه شدم چون تمامی قوانین و قواعد رو رعایت میکنم اما نمیدونم اشکال از کجاست
به هر حال از توجه دوستان ممنونم
موفق باشید

armin390
جمعه 25 اسفند 1385, 09:18 صبح
منظورتون از پیاده سازی جلسات چیه؟
منظورم اینه که چطور برای هر کاربر یک جلسه ی مجزا ایجاد میشه...

آیا قاعده خاصی داره؟
خب قاعدتاً داره...
http://www.php.net/manual/en/ref.session.php

چطور میتونم جلوی کش شدن صفحه رو بگیرم؟
یک سرچ کن کلمه cache رو تو این انجمن و انجمن html جوابت رو میابی...


بخدا دیگه کلافه شدم چون تمامی قوانین و قواعد رو رعایت میکنم اما نمیدونم اشکال از کجاست
اگه اسکریپتت رو بذاری احتمالاً زودتر به جواب برسی...

tabib_m
جمعه 25 اسفند 1385, 17:59 عصر
تعجب میکنم
چرا از دیتابیس برای این کار استفاده نمیکنی؟
هر ساده تره
هم پر اطمینان تره
و هم بعدا میتونی بفهمی که چه سفارشاتی تا نیمه ی راه رفته و چه سفارشاتی تکمیل شده.
و ...

یه تیبل داشته باش با این فیلدها:


id
prodoct_id
qty
session

بعد با انتخاب هر کالا از طرف کاربر ، شما توی این تیبل یک رکورد ثبت کن و توی فیلد سشن ، یک مقدار که توی سشن ثبت شده رو بریز.
یعنی اینجوری در کل ، فقط با یک سشن سر و کار داری ، و برای این که بتونی محصولات انتخاب شده رو لیست کنی ، کافیه توی شرطت داشته باشی :


... WHERE `session`='$session'


البته سشنی رو که ثبت میکنی ، باید یک مقدار غیر تکراری (unique) باشه که قاطی با مشتریای دیگه نشه.

و هر وقت هم خواستی حذف کنی ، id رکورد مورد نظر رو داری.

فکر نمیکنم مشکل دیگه ای باشه

اگه نامفهوم بود بگو بیشتر توضیح بدم.


موفق باشید.

babak869
جمعه 25 اسفند 1385, 20:42 عصر
جناب حائری عزیز سلام
از راهنماییتون بسیار ممنونم
راستش یه جورایی تو این پروژه من با خودم لج کردم که تمامی مراحل رو فقط با استفاده از session درست کنم . و موفق هم شدم . اما مشکل زمانی هست که وقتی از صفحه 1 کالای 1 رو انتخاب میکنی و بعد به صفحه 2 میری و کالای 2 رو انتخاب میکنی کاملا درست عمل میکنه اما زمانی که مجددا به صفحه 1 میری(نه با زدن دگمه Back مرورگر بلکه با استفاده از لینک) متاسفانه مقدار session صفحه اول غیب میشه و انگار هیچ کالایی در صفحه 1 انتخاب نشده و اگه به صفحه 2 بری باز هم مقادیر session صفحه دوم هم غیب میشه و سبد خرید رو خالی نشون میده
دیگه کلافه شدم نمیدونم مشکل چیه

در مورد پیشنهاد شما در مورد ذخیره اطلاعات در دیتابیس که راه اصولی و مطمئن هست ممنونم .نهایتا مجبورم به خونه اول برگردم و کدها رو بر اساس ذخیره در دیتابیس درست کنم
فقط در مورد Unique ID در مورد session ها میتونی راهنمایی کنی که چطور یه کاربر رو با یه عدد یکتا شناسایی و ردیابی کنم
بازم از راهنماییتون ممنونم
موفق باشید

babak869
شنبه 26 اسفند 1385, 12:34 عصر
کسی نیست منو راهنمایی کنه؟

tabib_m
شنبه 26 اسفند 1385, 20:16 عصر
فقط در مورد Unique ID در مورد session ها میتونی راهنمایی کنی که چطور یه کاربر رو با یه عدد یکتا شناسایی و ردیابی کنم


if(!$_SESSION['theSession']){
$session=uniqid('a');
}else{
$session=$_SESSION['theSession'];
}

اونوقت موقع اینسرت ، فیلد session رو برابر با $session قرار بده ، و موقع سلکت هم شرط بذار که رکوردهایی نمایش داده بشن که فیلد session شون برابر با $session باشه . اینجوری فقط کالاهایی نمایش داده میشن که کاربر انتخاب کرده.
موقع حذف هم ، خوب هر رکوردی id ای داره ، بنابراین بر اساس اون id به راحتی میتونی رکورد مورد نظر رو هم حذف کنی...

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

اگر نیازی به امکانات بیشتری هم داشتی ، میتونی به این جدول فیلدهای بیشتری اضافه کنی...

موفق باشید.

babak869
شنبه 26 اسفند 1385, 23:35 عصر
سلام
از راهنماییتون ممنون
من تمامی نکات بالا رو رعایت کردم. این موضوع برای هر صفحه صادقه اما زمانی که از یک صفحه مثلا به آدرس www.mysite.com/page1.php به صفحه دیگه به آدرس www.mysite.com/page2.php میرم مقدار سیشن از بین میره در صورتی که دقیقا مثل راهنمایی شما عمل کردم.خیلی عجیبه.چه راهی هست که سیشن در تمامی صفحات پایدار باشه؟ به نظرت اگه از کوکی استفاده کنم ضایع نیست؟
ممنونم

tabib_m
یک شنبه 27 اسفند 1385, 16:49 عصر
چه راهی هست که سیشن در تمامی صفحات پایدار باشه؟
session_start رو تو همه ی صفحه ها نوشتی؟


به نظرت اگه از کوکی استفاده کنم ضایع نیست؟
نه ، ضایع نیست
ولی از اونجایی که ممکنه طرف کوکی ها رو غیر فعال کرده باشه ، ممکنه به مشکل بر بخوره

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

موفق باشید.

babak869
یک شنبه 27 اسفند 1385, 19:36 عصر
سلام


session_start رو تو همه ی صفحه ها نوشتی؟

آره در همه صفحات نوشتم
روی سیستم Local جواب میده اما زمانی که آپلودش میکنم ایراد میگیره.بخدا دیگه کلافه شدم.چند بار خواستم کلا بی خیالش بشم چون خیلی اذیت شدم.من نمونه کدم رو میزارم جناب حائری عزیز یه نگاهی بنداز ببین ایرادی توش پیدا میکنی ما هم یه عمر دعات کنیم .



<?php
session_start();

if(!$_SESSION['user_id']){
$session=uniqid('a');
$_SESSION['user_id'] = $session;
}
else{
$session=$_SESSION['user_id'];
}

header("Pragma: no-cache");
header("Cache-Control:no-cache");



$kala = "my selection";
$price = 100;
$tedad = $_POST['tedad1'];
$total = $price * $tedad;

$db="mydb";
$tb="mytb";
//-----------------------------------------
$link = Mysql_connect("localhost", "root","") or die("Not Connected To Database Because ... ".Mysql_Error());
$sel = mysql_select_db($db,$link);
//-----------------------------------------
if ($_GET['action'] == "del") {
$qrw = mysql_query (" DELETE FROM $tb WHERE `id` = '$id' LIMIT 1") or die ("couldnt delete".MySlq_error());
}
//-----------------------------------------

if (isset($_POST['sub1'])== 'اضافه کردن به سبد خرید'){

$qry1 = mysql_query (" SELECT * FROM $tb WHERE `session_id` = '$session' AND `kala` = '$kala' ");
$num_ro = mysql_num_rows($qry1);

if ($num_ro == 0 ){
$qry = mysql_query(" INSERT INTO $tb (`session_id` , `kala` , `price` , `tot` , `total` )
VALUES ('$session' , '$kala' , '$price' , '$tedad' , '$total' )");
}

if ($num_ro == 1){

$quey = mysql_query (" UPDATE $tb SET `tot` = '$tedad', `total` = $total WHERE `kala` = '$kala' AND `session_id` = '$session' ");
}
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
require("header.php");
?>
<!---------------------------------------------->
محتویات صفحه
<!---------------------------------------------->
<br>
<form action="<?php echo $PHP_SELF ?>" method="post">

<input type="text" value="1" name="tedad1" size="1" maxlength="2">
<input type="submit" value="اضافه کردن به سبد خرید" name="sub1">
</form>
<!---------------------------------------------->

<?php
require("footer.php");
?>

من این روال رو در تمام صفحات پیاده کردم با این تفاوت که نام دگمه ارسال در هر صفحه متفاوته مثلا sub1 , sub 2 , ... و مقادیر نام کالا هم در متغیرهای متفاوت ذخیره میشه مثل $kala1 , $kala2 , ...
در ضمن موقع حذف یه محصول از سبد کد Delete جواب نمیده در صورتی که در یه سایت دیگه همون کد کاملا جواب میده و من عینا اونو اینجا منتقل کردم
ممنون میشم اگه گره از کارمن باز کنید
موفق و پیروز باشید

tabib_m
یک شنبه 27 اسفند 1385, 23:22 عصر
این موضوع برای هر صفحه صادقه اما زمانی که از یک صفحه مثلا به آدرس www.mysite.com/page1.php به صفحه دیگه به آدرس www.mysite.com/page2.php میرم مقدار سیشن از بین میره در صورتی که دقیقا مثل راهنمایی شما عمل کردم.
مطمئنید که مقدار session از بین میره؟ یا این که مثلا اینسرت انجام نشده و شما نمیتونید چیزی ببینید؟
وقتی کاربر کلید "اضافه به سبد خرید" رو میزنه ، توی دیتابیس چیزی ثبت میشه یا نه؟
اگر ثبت میشه ، مقداری که فیلد session به خودش گرفته ، درسته یا نه؟
یا اصلا هیچ مقداری نگرفته؟


در ضمن موقع حذف یه محصول از سبد کد Delete جواب نمیده در صورتی که در یه سایت دیگه همون کد کاملا جواب میده و من عینا اونو اینجا منتقل کردم
در مورد کدی که نوشتی $id از کجا اومده؟ از url؟ اگه از url اومده به جای $id اینو بنویس : $_GET['id']

یه سوال دیگه هم برام پیش اومده. چرا submit توی صفحات مختلف ، اسمش فرق میکنه؟

Behrouz_Rad
یک شنبه 27 اسفند 1385, 23:33 عصر
بر روی هاست شما Firewall نصب شده که باعث میشه مقادیر Session برابر با null بشن.
با هاست تماس بگیرید و از اونها بخواید که برنامه ی شما رو در لیست برنامه های مجاز در Firewall قرار بدن.

موفق باشید.

babak869
دوشنبه 28 اسفند 1385, 01:30 صبح
سلام


در مورد کدی که نوشتی $id از کجا اومده؟ از url؟ اگه از url اومده به جای $id اینو بنویس : $_GET['id']


با هر دو امتحان کردم متاسفانه جواب نمیده(روی سیستم Local )



بر روی هاست شما Firewall نصب شده که باعث میشه مقادیر Session برابر با null بشن.
با هاست تماس بگیرید و از اونها بخواید که برنامه ی شما رو در لیست برنامه های مجاز در Firewall قرار بدن.


اگه اینطور باشه که همه مشکلات حل شده .فقط میمونه 10 روز علافی و سردر گمی من و اذیت کردن دوستان



یه سوال دیگه هم برام پیش اومده. چرا submit توی صفحات مختلف ، اسمش فرق میکنه؟

راستش گفتم نکنه تشخیص اینکه کاربر دگمه رو کلیک کرده یا نه با صفحات دیگه قاطی نشه!!!

از راهنمایی و محبت هم دوستان ممنونم
امیدوارم که مشکلم با تماس با ودیر سرور سایت حل بشه
با تشکر فراوان
پیشاپیش سال نو مبارک

armin390
دوشنبه 28 اسفند 1385, 11:08 صبح
بر روی هاست شما Firewall نصب شده که باعث میشه مقادیر Session برابر با null بشن.
نمیشه به صورت قاطع این رو گفت دلایل مختلفی می تونه داشته باشه...
چاره اش هم اینه که اول بدونید یک سشن چطور ایجاد میشه و مورد استفاده قرار میگیره...
و اگه این ۱۰ روز بجای

علافی و سردر گمی من و اذیت کردن دوستا
فقط ۱ ساعت! وقت خودتون رو می گرفتید و این لینک

http://www.php.net/manual/en/ref.session.php
رو میدید و می خوندید الان خودتون می گفتید دقیقاً مشکل ازکجاست...

و دیگه همچین سوال و جوابی مطرح نمی شد:



به نظرت اگه از کوکی استفاده کنم ضایع نیست؟
نه ، ضایع نیست
ولی از اونجایی که ممکنه طرف کوکی ها رو غیر فعال کرده باشه ، ممکنه به مشکل بر بخوره

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

موفق باشید.


p.s

A visitor accessing your web site is assigned a unique id, the so-called session id. This is either stored in a cookie on the user side or is propagated in the URL.

babak869
دوشنبه 28 اسفند 1385, 18:35 عصر
نمیشه به صورت قاطع این رو گفت دلایل مختلفی می تونه داشته باشه...
چاره اش هم اینه که اول بدونید یک سشن چطور ایجاد میشه و مورد استفاده قرار میگیره...
و اگه این ۱۰ روز بجای

فقط ۱ ساعت! وقت خودتون رو می گرفتید و این لینک

رو میدید و می خوندید الان خودتون می گفتید دقیقاً مشکل ازکجاست...

و دیگه همچین سوال و جوابی مطرح نمی شد:


p.s

ببینید دوست عزیز اگه من مشکل نداشتم که این سوال رو نمیپرسیدم
در ضمن من در کار با session و ساختار اونا مشکلی ندارم اما در این مورد مشکل پیش اومده بود و به کمک دوستان حل شد.
شما که میفرمایید بگید ببینم کجای کار من اشتباه بوده؟ کد بالا رو یه نگاهی بندازید و اشکالش رو برطرف کنید
من روی سیستم local مشکلی نداشتم اما در زمان آپلود روی سایت و اجرا ایراد میگرفت
منتظر جوابتون هستم
موفق باشید

armin390
سه شنبه 29 اسفند 1385, 12:05 عصر
ببینید دوست عزیز اگه من مشکل نداشتم که این سوال رو نمیپرسیدم
خب این کاملاً مشخصه که شما مشکل دارید من هم منکر این قضیه نشدم... بلکه بهتون گفتم اگه اصول رو بدونید(و گفتم هم از کجا) به راحتی می تونید مشکلتون رو حل کنید...

در ضمن من در کار با session و ساختار اونا مشکلی ندارم اما در این مورد مشکل پیش اومده بود و به کمک دوستان حل شد.
خب خدا رو شکر که حل شد ولی خوبه که بگید مشکل از کجا بود تا برای آیندگان که این تاپیک رو می بینن مفید باشه...


شما که میفرمایید بگید ببینم کجای کار من اشتباه بوده؟ کد بالا رو یه نگاهی بندازید و اشکالش رو برطرف کنی
وقت ندارم کد بقیه رو بخونم...


من روی سیستم local مشکلی نداشتم اما در زمان آپلود روی سایت و اجرا ایراد میگرفت
من نه رو localتم نه رو سرور سایتت...


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


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

Mohammad Minaei
جمعه 03 فروردین 1386, 23:40 عصر
برای عجیبه که تو لوکال جواب گرفتی!
یه راه هست که نمی دونم جواب می ده یا نه!
یه Header از نوع expire با مقدار تاریخی مثل 1/1/2001 بفرست ببین درست می شه یا نه!


header ("Expire: 2001/1/1");