استفاده از نشست session در زبان php و چگونگي استفاده از آن و رفع اشكالات احتمالي .
ببينيد ساعت 4.50 دقيقه صبحه و من واقعا بر خودم لازم دونستم كه بيام بگم گول محيط هاي توسعه wamp و xampp رو امثالهم رو نخوريد محيط هاي اجراي واقعي لذت همه چيو از دماغتون در ميارن اگه تازه شروع به كار كرده باشين
ميدونيد كه توابعي مثل
کد:
session_start()
session_regenerate_id()
بايد حتما قبل از اينكه يك خروجي توليد بشه استفاده شده باشند يعني هيچ گونه دستوري مثل echo در قبلشون وجود نداشته باشه
تمامي كد هاي زير اشكال دارند :
کد PHP:
<?php
echo "dsfd";
session_start();
?>
يا
کد PHP:
some html code
<?php
session_start();
?>
خب حتي كد اول توي محيطهاي ازمايشي مثل ومپ اشكالي ندارند
هر چند كه كدي به شكل فوق به وضوح احمقانه س !
اما ميخوام 2 تا موضوع رو عرض كنم كه گاها پيش مياد
بعضي از اديتورها يا نرم افزار ها (حتي بعضي نرم افزارهاي كار با اف تي پي )
اينتر (خط جديد ) رو تبديل ميكنند و به خروجي ميبرند
بنابراين اگر قبل از
کد PHP:
<?php session_start();?>
الكي يه خط اضافه (يه اينتر ) توي كدتون باشه ممكنه به خروجي بره و با اشكال مواجه بشين
يا اخر يك كد پي اچ پي يك خط اضافه اينتر خورده بعد اون فايل رو توي يه فايل ديگه اينكلود كرده اين include و بعد از اينكلود دستور استارت سشن رو نوشتين باز اشكال ميگيره
notepad++ و filezilla برنامه هاي استانداردي هستند كه ميتونين استفاده كنين
بنابراين كد زير ممكنه براتون ايجاد اشكال كنه
کد PHP:
1.php :
<?php $i=0;?>a blank line is here !
2.php :
<?phpinclude"1.php";session_start();?>
</div>
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/admin/domains/p30city.net/public_html/1.php:7) in /p30city.net/public_html/1.php on line 16
يعني اينكه قبل از خط 16 يه اقايي لطف كرده يه چيزي فرستاده ! .
يه
عده اي ميگن بحث
session cache limiter رو كلا غير فعال كنين
اما اين كارو نكنين به فكر رفع مشكل باشين و تريس كنين ببينين كجا يه چيزي به خروجي رفته
--------------------------
مساله بعدي
اگه به هر دليلي عاجز موندين از اينكه بفهمين كي كجا داره خرابكاري ميكنه از تابع
ob_strat() استفاده كنين كه خروجي رو بافر ميكنه
اينم مشكلو حل ميكنه ( اما بهتره كه واقعا ببينيد مشكل از كجاست ).
-------------------------------------------
مساله بعدي اين هست كه خواهي نخواهي شما ممكنه توي يك پيج كه قسمتيش به خروجي رفته بخواي
session_regenerate_id()
كني
اولا به چه دردي ميخوره ؟
يكي از كاربردهاش اين هست كه شما حتما حتما حتما بايد بعد از هر نوع تغيير سطح كاربري مثلا بعد از لاگين كردن يا لاگ اوت كردن اين تابع رو استفاده كنين كه آي-دي سشن تغيير كنه
و اي دي قبل از بين بره ( session_destroy() با اين فرق داره اين كل سشن رو و متغيرهاش رو از بين ميبره )
داشتم عرض ميكردم كه فرض كنيد يك صفحه معمولي طراحي كردين وسطاش هم ري جنريت آي دي نياز دارين بر اساس رفتاري كه كاربر نشون داده
خب اگر تابع رو همونجا فراخواني بكنين اشكال بالا پيش مياد
به همين خاطر به نظر ميرسه (اگر نميخواهيد از دستور ob_start() استفاده كنيد )
بايد كاربر رو منتقل كنين به يك پيج ديگه اونجا قبل از هر چيزي دستورو استفاده كنين
حتما ديدين كه توي اكثر سايتها در هنگام لاگين كردن از يك صفحه ميانگذر عبور داده ميشيد البته كاربردهاي متفاوت زيادي داره اون صفحات اما من احساس ميكنم يكي از كاركردهاي اساسيش هم همين باشه
==================
مساله بعدي !
تابع
کد PHP:
mysql_set_charset('utf8');
هست كه باز توي محيط ومپ اشكالي نگرفت .
معمولا وقتي ديتاي فارسي از ديتابيستون ميخونين و ميخواين نمايش بدين اينو ست ميكنين
به من مدام اين دستور رو ميداد :
Warning: mysql_set_charset() [function.mysql-set-charset]: Access denied for user 'apache'@'localhost' (using password: NO)
و جالب اينكه يوزري كه من براي ديتابيسم استفاده كرده بودم اپاچي نبود حدس زدم كه هنوز لينك به ديتابيس انجام نشده
خلاصه اينكه اين دستور حتما بايد بعد از تنظيمات لينك به ديتابيس استفاده بشه نه قبل از اون
يعني اين غلطه :
کد PHP:
mysql_set_charset('utf8');
mysql_connect($db_host, $db_uname, $db_pswd) or die(() ;
شما حتما بايد بعد از mysql_connect() استفاده ش كنين نه قبل از اون .
اين هم از پند و اندرزهاي نيمه شب ما .
--------------------
Cannot send session cookie - headers already sent
نقل قول:
If you don't have any previeus output before the session-start() statement,then try to resave your .php file as an ansi-file or as utf-8 without BOM file. that's bc in some cases the editor itself writes things as an output in the file.
|
نقل قول:
Make sure you have nothing that outputs to the browser before those lines and delete any unessasary whitespace from that code . That error means you outputted something to the browser before line X and then tried to use a header value that can't be sent because of course the header had already been sent before line X.
|
Summary:
a) look for where it 'started at'
b) track the line number
c) check what's normally happening on that line.
--- If it's the end of the file, then it's blank spaces.
--- If it's the start of the file, it's likely spaces or incorrect encoding.
--- Elsewhere it could be a syntax error or the result of an "echo()" statement which is displaying info or perhaps debug code.
--- Common syntax errors include the use of single-quotes inside statements that already have single-quotes. Check to be sure your quotes aren't mismatched. If you need to use single-quotes while inside other single-quotes, change yours to \' instead of just '.
d) the rest of the info simply shows other execution information, mainly the part of the code that discovered that it cannot proceed as expected due to the problem that happened in the 'started at' location.
To change the encoding on the file, look at your editor's "save as" menu, or the program's preferences settings. A good editor to use is Notepad++. Or pick another from this list of good editors and related utilities for Zen Cart customizing.