الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في حذف السيشن اوتوماتيكيا

بدأه هالي الدهوكي في 4 أغسطس 2012 · 19 رد · 1,260 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا شباب كيف الحال إن شاء الله ان تكونوا في تمام الصحة و العافية

عندي مشكلة لو سمحتوا ردوا عليا ...

انا عملت موقع لوحة ادارة متكاملة لكن في بعض الأحيان السيشن يحذف عند تحديث الصفحة ... و يرسلي الى صفحة تسجيل الدخول ...

انا عملت نضام تسجيل الدخول مرتبط في قواعد البيانات يعني اذا كان اسم المدخل متطابق مع اسم في القاعدة يدخل

لكنني اشك بمكان و اعتقد هذه هي المشكلة

انا عامل start_session(); في ملف الهيدير و انا مستدعي الهيدر في كل الصفحات

هل يوجد مشكلة عندما نعمل للسيشن انكلود او يجب في كل صفحة يكون هناك دالة انكلود ؟

ما اعرف حسيت بأنه خطء هو هذا ... اتمنى ترودوا عليا بإجابة مفيدة :)

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#2

دالة session_start() يجب أن تكون في أعلى الصفحة تماماً

لا يسبقها أي شئ

+

في حال قمت بإجراء include أو require ومشتقاتهما، فيجب أن يكون الـ include أيضاً في أعلى الصفحة تماماً حتى لا يكون هناك أي تعليمات أو محارف أخرى تسبق التابع session_start()

في صفحات HTML، فيجب أن تتوضع في الأعلى تماماً، حتى قبل <!doctype html ...>

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

اخي العزيز طيب اذا كان هناك سيشن في صفحة رقم واحد و سيشن اخر في صفحة رقم اثنان هل تعتقد يتضاربنا مع بعضهما ؟

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#4

وضّح كلامك بمثال

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

اخي العزيز انا اقصد انني وضعت السيشن في هيدر

مثال

<?php session_start(); ?>
<html>
<head>
<link href="css/stylep.css" rel="stylesheet" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php include("functionsp.html"); ?>
</head>
<body>
<div id="sitealign">
<table border="0" width="1028" cellpadding="0" cellspacing="0">
<tr>
<td id="td-header-panel" valign="middle">اهلا و سهلا بك يا <span id="spanwelcome"><?php echo $user; ?></span> في لوحة الإدارة الخاصة بموقع - الشعر العراقي<td>
</tr>
</table>

و قمت بإستدعاء الملف الهيدر في جميع الصفحات لكن مرات قليلة عند الضغط على ادخال بيانات او تعديل البيانات يرجعني الى صفحة تسجيل الدخول

تم تعديل هذه المشاركة بواسطة هالي الدهوكي في 4 أغسطس 2012 في 05:15

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#6

ما زال المقصد غامض بعض الشئ.

إذاً وضعت التابع في ترويسة كل الملفات لديك (بما في ذلك ملف الـ header) وقمت بإدراج ملف الـ header في الصفحات بواسطة include

إن كان هذا القصد فغالباً سيكون هناك نتائج غير متوقعة بسبب وجود استدعائين لـ session_start واحد في البداية وواحد في مكان ما في الصفحة بسبب تضمين ملف الهيدر.

إن كان قصدك شئ آخر فالرجاء التوضيح مرة أخرى.

وعلى صعيد آخر، برأيي أن تقوم بوضع session_start في جميع الصفحات التي لن تقوم بعمل include/require لها، وتبقيه فقط في الصفحات الأساسية التي تعتبر القالب العام الأساسي.

بهذا الشكل إن شاء الله لن يكون لديك مشكلة.

أخبرني بالنتيجة.

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7

اخي العزيز شكرا لك للمتابعة لكن برأئي سأضع session_stsrt(); متفردة في كل الصفحات يعني سأحذف السيشن من انكلود و سأرى ما سيحصل و شكرا جزيلا لك للمتابعة سأجرب و اخبرك بال امر يمكن السيشن تعطل في include و يمكن تعمل في require لا اعرف سأجرب كل الطرق

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#8

أخي ممكن أن وقت الجلسه محدد بخمس دقائق مثلا وبهذا تجد في بعض الأحيان تخرج من الجلسه لأن وقت الجلسه إنتهى , بما أن المشروع يعمل بعض الأحيان وبعض الأحيان ﻻ يعمل إذن على الأرجح أن المشكله غير موجوده يعني فقط عليك تعديل وقت الجلسه إلى ساعه مثلا , يمكنك عمل ذلك في ملف الكونف بهذا الكود

ini_set(’session.gc_maxlifetime’, 30*60);

أو من خلال ملف php.ini

كما أن هناك أمر في ملف.htaccess يقوم بتفعيل الجلسه بشكل أوتوماتيكي يعني مافي داعي لعمل

session_start

الأمر هو :

 php_flag session.auto_start 1
1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#9

بسام العيساوي شكرا للرد اخي العزيز

فهذه هي مشكلتي بال فعل لكن مرات ينتهي بسرعة و مرات يطول كثير فأشرحلي كود الأول يعني تطويل مدة السيشن في ملف كونف يعني عندما اضعه على اي استضافة او على اي سيرفر يعمل السيشن حسب الوقت الي اختاريته انا و ليس انهاء صلاحية السيشن حسب وقت السيرفر الذي سأرفع الموقع عليه ... إن شاء الله تفيدني ... ^_^ انا جديد سأزعجكم قليلا لكن ازعجوني انتوا ايضا هههههههههههههههه :haha:

و في ملف php.ini لم ارى كود مشابه لكود الذي طرحته

 php_flag session.auto_start 1

لم اراه قط ....

لكن الأفضل تعلمني على هذا الأمر بال تفصيل

ini_set(’session.gc_maxlifetime’, 30*60);

و هل تقصد اذا وضعته في ملف كونف سيعمل حسب وقت المحدد .؟؟

ملاحظة اكواد التي استعملها في كل الملفات هي ...

هذه ان لم يكن مسجل دخوله .... و العكس حذف علامة ! و استعملها لملف الدخول ان كان قد سجل دخوله تضهر له رسالة بأنه مسجل الدخول و يحوله ..

<?php 
if(!isset($_SESSION['username']) and !isset($_SESSION['password'])){
	die("
	<div id='errorpanel'>YOU DONOT SIGN IN ON THIS SITE</div>
	<meta http-equiv='refresh' content='4; url=login.php'/>
	");
}
?>

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#10

شباب خلوني اوضح اكثر ....

شوفو يعني مرات اي تعديل اعمله في القاعدة و اجي اعمل رفرش للمشروع يقولي انت غير مسجل و يرجعلي ال تسجيل الدخول لازم اسجل من جديد .... فهل عند تغير شئ في القاعدة يسبب بإنهاء الجلسة ....

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#11
هالي الدهوكي كتب:

شوفو يعني مرات اي تعديل اعمله في القاعدة و اجي اعمل رفرش للمشروع يقولي انت غير مسجل و يرجعلي ال تسجيل الدخول لازم اسجل من جديد .... فهل عند تغير شئ في القاعدة يسبب بإنهاء الجلسة ....

لا طبعاً.

حتى التعديل على شفرة المشروع نفسه لا يجب أن تسبب ما يحصل طالما أن تعديلاتك لا تؤثر على توابع الـ SESSION.

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

اخي العزيز Xacker

و انا ايضا اعلم بهذا الأمر لكن فقط كنت اريد التأكد و الوصول لحل من هذه المشكلة لكن الأخ ذكر الدالة

ini_set(’session.gc_maxlifetime’, 30*60);

يدل بأنها تعديل وقت السيشن الى ساعة من ملف كونف و لم يشرح كيف اضافة الكود و اين اضافته و كيف يعمل فهل يمكنك شرحه لي لو سمحت ؟؟؟؟

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#13

الشفرة تنفذ من أي صفحة PHP

يمكنك استخدامها مثلاً في صفحة يتم تنفيذها لمرة واحدة.

أو يمكنك ببساطة تعديل قيمة البارامتر session.gc_maxlifetime مباشرة في ملف php.ini إن كنت تستطيع التحكم بمحتويات الملف (الاستضافة تخول لك ذلك)

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

اخي Xaxker اعتقد اني وصلت الى حل لمشكلة حذف السيشن اوتوماتيكيا ....

انا دائما اضع هذا الكود لإضهار اي شئ فقط للمسجلين دخولهم بأسم عضويتهم, اي تحقق ان كان مسجل دخوله سيضهر له المحتوى

if(isset($_SESSION['umail']) and isset($_SESSION['upass'])){
echo '
<form action="showmemetopics.php?tid='.$getid.'" method="post">
<table border="0">
<tr>
<td><textarea name="mcomncomnt" id="textareacomnt"></textarea></td>
<td><input type="submit" id="submit" value="اضف تعليقك"/></td>
</tr>
</table>
<input type="hidden" name="topicid" value="'.$getid.'">
<input type="hidden" name="mcomnname" value="'.$fetcht['ufname'].'">
<input type="hidden" name="mcomvi" value="1">
<input type="hidden" name="add" value="comnts">
</form>
';}else{
echo "
<div id='errorsql'>يتوجب عليك تسجيل الدخول لرؤية المحتوى</div>
";
}

علما ان الرابط في ACTION صحيح لانه الرابط عندي يكون بهذا الشكل

http://localhost/iraqsite/showmemetopics.php?tid=14

التحقق يعمل بشكل جيد ....لكن انا الأن وضعت في صفحة جديدة هذا الكود و مع كود اضافة كومنت جديد

$showt = mysql_query("SELECT ufname,umail FROM users WHERE umail='$umail'") or die ("<div id='errorsql'>خطأ</div>");
$fetcht = mysql_fetch_assoc($showt);
$mcomnname = $_POST['mcomnname'];
$mcomncomnt = $_POST['mcomncomnt'];
$topicid = $_POST['topicid'];
$mcomvi = $_POST['mcomvi'];

if(isset($_POST['add']) and $_POST['add'] == "comnts"){
if(empty($mcomncomnt)){
echo "<div id='error'>لم تقم بكتابة تعليقك</div>";
}else{
$insertcomnts = mysql_query("
				INSERT INTO mcomnts
				(mcomnname,mcomncomnt,mcomnpost,mcomvi)
				VALUES
				('$mcomnname','$mcomncomnt','$topicid','$mcomvi')
				") or die ("<div id='errorsql'>خطأ في الإدخال</div>");
				if(isset($insertcomnts)){
				echo "<div id='complete'>تم اضافة تعليقك بنجاح</div>";
				}
}
}

الأن سأبدء بوضح المشكلة

الأن لو رغبنا باضافة اي تعليق بدون اي مشاكل يسجل في القاعدة و يضهر بدون مشاكل و يعمل عمله كله سليم و بدون مشاكل

اما اذا ضغطت على F5 يطبع لي نفس التعليق الذي كتبته علما ان التعليق اضاف و عند الضغط على زر F5 عشرون مرة سيضاف نفس التعليق 20 مرة

و في يوم من الأيام رأيت دالة سوبر كلوبال SUPER GLOBAL عمليتها هي لمنع زر F5

اي اذا اضاف تعليق بعد التعليق ضغط على F5 و يختار resend لم تعمل معه ... فأحتاج الى هذا السكربت الذي يقوم بمنع زر F5 او resend

و هذه هي الصورة عندي الأن .... الصورة في المرفقات ....

و انا متأكد يسجل الخروج بسبب resend اي F5

post-236353-025037800 1345074173_thumb.p

المرفقات
مشكلة.png

تم تعديل هذه المشاركة بواسطة هالي الدهوكي في 16 أغسطس 2012 في 02:55

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#15

لا أعتقد أن F5 سيقوم بتدمير الـ session

لكن بكل الأحوال هناك حلّين للمشكلة، الأول مفيد في حالات معينة وأبسط للتنفيذ والآخر مفيد في جميع الحالات لكنه يحتاج إلى بعض التركيز.

الطريقة الأولى تتم من خلال PRG pattern

المشكلة:

PostRedirectGet_DoubleSubmitProblem.png

الحل:

PostRedirectGet_DoubleSubmitSolution.png

لكن:

The PRG pattern cannot address every scenario of duplicate form submission. Some known duplicate form submissions that PRG cannot solve are:

  • if a web user refreshes before the initial submission has completed because of server lag, resulting in a duplicate HTTP POST request in certain user agents.

الطريقة الثانية: (إما باستخدام tokens أو بالبحث في قاعدة البيانات)

عند عرض الـ topic نقوم بإدراج حقل مخفي جديد

<input type="hidden" name="token" value="<? echo $_SERVER['REQUEST_TIME'] ?>">

ليرسل مع النموذج form.

بعد عملية Submit ووصول البيانات إليك، تتأكد من تطابق القيمة المرسلة في البارامتر token مع القيمة في $_SESSION["topic_$getid"]

إن تطابقت القيم فهذا يعني أن المستخدم ضغط F5 مرة أخرى، لأننا سنقوم في أول Submit بـ:

$_SESSION["topic_$getid"] = $_POST['token'];

الآن لنفرض أن الصفحة لسبب ما توقف تحميلها وكان المحتوى فارغ، في هذه اللحظة المستخدم لا يدري فيما إذا تم معالجة طلبه أم لا، لذلك حتى لا يخسر ما كان قد كان يحاول إرساله من بيانات فيضغط F5 -- المتصفح سيعرض عليه إعادة إرسال ذات البيانات مرة أخرى والمستخدم يختار Resend

عندما يصل الطلب ذاته مرة أخرى إليك، فأنت كما ذكرت من قبل، تقوم بمطابقة قيمة token مع $_SESSION["topic_$getid"]

وفي هذه الحالة سيحصل تطابق حتماً، لأن البيانات تمت معالجتها من قبل وتم تخزينها في القاعدة، حينها نعيد المستخدم إلى الصفحة السابقة من خلال

header("Location: /foo.php");

على فرض أن الصفحة اسمها foo.php وهي موجودة في ذات المسار.

الآن لنفرض أن الصفحة اكتمل تحميلها وعاد المستخدم إلى الـ topic بعد معالجة ما أرسله، سيتم طبعاً وضع token جديد، لكن، لو قام المستخدم بضغط F5 فالمتصفح سيعرض عليه إرسال البيانات السابقة بالـ token القديم، وكما ترى حتى لو قام بضغط Resend فببساطة الـ double posting سيتم معالجته لأن الـ token ستتطابق. أما لو قام بضغط Submit فقيمة الـ token الجديدة لن تتطابق مع القديمة وسيتم الموافقة على الإرسال وتخزين الـ token الجديدة في الـ session.. وهكذا.

* إن لم تفهم المشاركة في المرة الأولى من قراءتها، أعد قراءتها بضع مرات وبتمهّل وهدوء ومن ثم ضع استفساراتك لو بقي لديك شئ غامض.

* هذه الطريقة لا تحل double posting فيما لو قام المستخدم بضغط Submit حتى يكتمل التحميل، ثم Submit، ثم Submit .. وهكذا، لأن الـ token سيكون جديد في كل مرة، والطريقة الوحيدة لحل مثل هذه المشكلة هي من خلال الاستعلام في قاعدة البيانات عن وجود ذات المشاركة من قبل.

* إن لم تحل مشكلة الـ session لديك بهذه الطريقة فسنقوم بفصل المشاركتين في موضوع مستقل لأنه سيفيد الآخرين الذين يريدون منع double posting.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#16

اخي العزيز Xacker .....

بصراحة اني شوي فهمت شو هو الموضوع سأشرحه لك و قل لي ان كنت قد فهمته جيدأ او لا ...

يعني نعمل حقل جديد .... بهذه الخاصيات ...

<input type="hidden" name="token" value="<? echo $_SERVER['REQUEST_TIME'] ?>">

و نعمل هذا تطابق يعني في if

if($_SESSION["topic_$getid"] = $_POST['token'];){
exit;
}

اما بنسبة هيدر فأنا لا استخدم صفحة خاصة لإضافة رد و انما الردود و ال بوكس الإرسال في صفحة واحدة ..

شوف الصورة

post-236353-075642300 1345139641_thumb.p

المرفقات
مشكلة.png

تم تعديل هذه المشاركة بواسطة هالي الدهوكي في 16 أغسطس 2012 في 20:54

Professional Technology Information

HTML , CSS , PHP , JQuery , Action Script

Photographic Designer & websites Designer : Dinamic Sites & photographic Sites & Flash Sites

IF YOU WANT SEE MY WORKS

VISIT THIS LINK

Prince Designs

#17

يفضل عدم استخدام exit إلا لو كنت متأكد بأنها لا تؤثر على عمل الصفحة، لأن exit ستنهي تنفيذ أي تعليمات PHP لاحقة لها وقد يؤدي ذلك إلى تشويه الخرج.

شخصياً أفضل استخدام header، وبكل الأحوال فلا يهم إن كنت ترسل البيانات إلى صفحة جديدة أو إلى ذات الصفحة، المهم أن تسمي الصفحة الصحيحة

header("Location: /foo.php");

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#18

ما الأخبار هنا؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#19

هل من جديد؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#20

اخي بالنسبة للجلسات SESSION ضع session_start في اعلى الملف المدرج اليه

بمعنى لو كان عندي file1 و file2 و file3 وعندي index ثم تعمل ادراج include في ملف index للملفات الاخرى

وعلى فرض انك تستخدم المصفوفة SESSION_$ على الملفات الاخرى غير ملف index

فلا داعي بأن تضيف session_start في الملفات الاخرى فقط ضعها على ملف index

اما بالنسبة لتفادي مشكلة تكرار ارسال التعليق اولا ً هناك نقطة مهمة جدا ً اعتقد ذكرتها لك في موضوع سابق بخصوص القيود في قاعدة البيانات

طالما انك لا تريد تكرار التعليق فضع القيد unique على حقل التعليق اضف الى ذلك استخدم الكويكز في تفاديا لتكرار البيانات اعتقد بيكون افضل

M.B.O

Mohamed Bin Othman

إبن المكلا

يابني البشر ماذا فعلتم بالبشر !!

إسـألـنـي

مواضيع مشابهة