مشکل با تابع هدر (location) در پی اچ پی

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

ممنون میشم جواب بدهید.:wink:
 

pezhman32

Active Member
نمي دونم منظور شما چيه ولي اين كاري كه گفتي ميشه...
اصلا ميشه 1000000000000000000 خط كد قبل از header داشته باشي اما نكته ي قابل توجه اينه كه كدهات نبايد خروجي داشته باشن... يعني حتي تيتر صفحه هم نبايد انتخاب بشه.
 

msnasiri

Member
من فکر کنم مشکل از یه جای دیگست
منم قبلاً چنین مشکلی رو داشتم
مشکل از فرمت فایل هست
البته فکر کنم
نباید utf8 باشه
البته باسه اون هم یه راهی هست
 
دوستان عزيز msnasiri و pezhman32 عزيز ممنون كه راهنمايي كرديد، اما مشكل من هنوز حل نشده، و فكر نكنم مشكل از utf-8 باشه چون اصلا utf-8 نيست چارست فايلهام. كلا راه حلي به نظرتون ميرسه ممنون ميشم بگوييد چون كارم لنگه اساسي. منتظر جوابتون مي مونم. ( در هر صورت آيا راه ديگري براي بردن مرورگر از يك صفحه به صفحه ي ديگر به جز تابع هدر وجود دارد؟ البته به جز document.location حاوا اسكريپت. ؟؟؟)
 

spsgorgan

Active Member
والا من يه همچين مشكلي رو نداشته و ندارم ؟! شما هيچ محدوديتي در استفاده از هيدر نداري . اگر ميخواي يوزر رو به يك صفحه ديگه راهبري كني ميتوني از جاوا هم بهره ببري
 

mohsenshahbazi

Active Member
اگر شما هر گونه خروجی داده باشی دیگه امکان استفاده از هدر رو نداری . اما ممکنه یه عملیات پشت پرده مثل حذف یک سری رکورد یا اپدیت کردن یه سری رکورد باشه . که این کار معمولا خروجی نداره . بعد از به روز رسانی میتونی از هدر استفاده کنی .
البته بستگی به ادیتور هم داره ..بعضی ادیتورهای متن 2 تا کاراکتر اضافه میکنن ابتدای فایل که باعث میشه اسکریپت خطاری Header already Sent بده . به Zend Editor تست کن .
 

msnasiri

Member
منم منظورم از utf8 همون دو یا سه کاراکتر بود که گفتم
خب تو بیا کدت رو اینجا بذار
تا ببینیم بهتر می شه کمک کرد
در ضمن ادیتورت چیه؟
 

nasser_ray

Member
سلام به همه دوستان
مشکل کاملاً از utf-8 هستش و آن هم به خاطر یک بیت اضافی بنام BOM (Byte Order Mark) هستش
برای حل این مشکل میتونید از ویراش گرهای پیشرفته مانند notepad++ استفاده کنید و حالت کدینک متن رو روی UTF-8 without BOM
(ANSI as UTF-8) قرار بدید

موفق باشید
 
من که واسه انتقال به صفحه دیگه از window.Location در داخل یه فانکشن PHP که خودم نوشتم استفاده می کنم . خیلی هم ازش راضی هستم . به این صورت :

PHP:
function redirect($url)
{
    $javascript ="
        <script type=\"text/javascript\" language=\"javascrip\">
        function redirect()
        {
            window.location = \"$url\";
        }
        </script>";

    print($javascript);
    exit;
}
 

lepi

Member
در اینجا نیازی به جاوا نیست
چون مشکل چیزی دیگری هست
بله
مشکل شما همان utf-8 هست که بخاطر استفاده از از ویرایشگر متن ساده ای چون notepad ایجاد می شه که ایج فرمت رو بشکل مخفی در ابتدای فایل ذخیره می کنه
راه حلش این برنامه ها هستن:

phpdesigner2007 و phpdesigner2008 که البته من نسخه 2007 رو بیشتر می پسندم
++notepad که یک سیستم کد باز و رایگان هست
و آخری که همه عمر من شده DreamWeaver اون هم نسخه CS4 با اینکه Beta هست اما واقعا رویایی هست
اطلاعات بیشتر در مورد DreamWeaver رو از http://forum.majidonline.com/showthread.php?t=97723 بگیر
یا به سایت اصلی (که مال خودم هست) برو http://fu20.com/software/?p=282 و دانلود کن

شادزی مهر افزون
 

hidensoft

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

اما نظر من
هیچ دلیلی نداره که شما حتما کد های پی اچ پی که با هدر سرو کار دارند رو قبل از خروجی بنویسید. PHP برای اینکه به شما این امکان رو بده تابعی داره با نام ob_start که دوستانی که منوال رو قرائت فرمودند می دونند که این تابع برای جلوگیری از همین موضوع هست.

در مورد ادیتور
یقینا هر برنامه نویسی محیط کاری مخصوصی برای خودش تدارک می بینه اما من با زند بیشتر کار می کنم . اگه زند نباشه سعی می کنم از ادیتور مخصوص PHP استفاده کنم وگر نه notpad++ می تونه در نهایت نیاز برنامه نویس رو تامین کنه.
مشکل کاملاً از utf-8 هستش و آن هم به خاطر یک بیت اضافی بنام BOM (Byte Order Mark) هستش
به هیچ وجه این طور نیست دوست من . notpad++ هم چند کارکتر Hex رو در ابتدای بعضی از فایل ها قرار می ده
من که واسه انتقال به صفحه دیگه از window.Location در داخل یه فانکشن PHP که خودم نوشتم استفاده می کنم . خیلی هم ازش راضی هستم . به این
فرق زیادی بین header در PHP و window.Location در JS هست (به این نکته دقت کن دوست من
من فکر کنم مشکل از یه جای دیگست
منم قبلاً چنین مشکلی رو داشتم
مشکل از فرمت فایل هست
البته فکر کنم
نباید utf8 باشه
البته باسه اون هم یه راهی هست
)
ربطی نداره ، اما چون ما با زبان فارسی کار می کنیم بهتره فرمت صفحات هم UTF-8 باشه اما اجباری نیست !
در هر صورت آيا راه ديگري براي بردن مرورگر از يك صفحه به صفحه ي ديگر به جز تابع هدر وجود دارد؟
دیدم بعضی جاها یه فرم با یه کلید سابمیت توی یه Iframe میگذارن و موقع ریدایرکت فرم رو ثابمیت می کنند اما این روش خیلی وقته که دیگه استفاده نمی شه
 
سلام، تعجب می کنم بعد از چیزی نزدیک 2 سال چطور این مبحث داغ شد دوباره. خودم موضوع رو شروع کردم و بهتره خودم هم یکم توضیح بدهم. مشکل من این بود که:
اما مشكل من هنوز حل نشده، و فكر نكنم مشكل از utf-8 باشه چون اصلا utf-8 نيست چارست فايلهام.
و
و این کمی کارم را محدود می کنه ضمن اینکه به مورد بالا عدم استفاده بعد از کدهای اچ تی ام ال و توابع ریکوست و سشن رو هم اضافه کنیم.

خوب اگه تا بحال مشکل رو فهمیده باشید (از دو تا نقل قول بالا) منظور این بود که اول فایل هام همه asci و without BOM بودند ولی باز اشکال ادامه داشت. چرا؟! دلیل رو خیلی ساده خودم فهمیدم. همانطور که در نقل قول دوم در بالا گفته شد اشکال این بود که من سعی می کردم قبل از استفاده از تابع header ، محتوایی مثلا محتوای یک فرم login کاربری رو require کنم. یا توی یک حلقه ی شرط session رو بررسی کنم. این بود که صفحه ای require می شد که خود خروجی html داشت و بدتر از آن utf-8 بود.
چاره چی شد. همانطور که خودم گفتم:
در هر صورت آيا راه ديگري براي بردن مرورگر از يك صفحه به صفحه ي ديگر به جز تابع هدر وجود دارد؟ البته به جز document.location حاوا اسكريپت.
و دوست گرام amirkhoshal هم دوباره روی همین فرایند تاکید کرد.
ولی حالا مشکل حل نشده ای که باقی می مونه. اصلا زدن این پست من دو سال پیش و طرح سوال این بود که آیا تابعی مانند header هست که کار ریدایرکت رو بکنه (توی php) و مشکلات اونو نداشته باشه؟! حالا چرا اینقدر گیر دادم به php ؟! چرا از جاوا اسکریپت استفاده نکنم؟
:nokte: قصدم این بود که راهی را یاد بگیرم که در همه ی مرورگر ها چه آنهایی که جاوااسکریپت را ساپورت می کنند و چه نمی کنند قابل استفاده باشه. اما ... ؟! چرا خیلی دور بریم. همین فروم مجید آنلاین که به اصطلاح با وی بولتین ساخته شده هم از این قاعده مستثنی نبود. و می بینیم که بعد از هر لینک ریداریکت اتوماتیکی یک لینک هم قرار داده شده تا بصورت دستی انجام بشه. ( مورد کاربردی که همین امروز با اون مواجهه شدم موبایلم بود... وقتی با موبایل به مجید آنلاین وصل شدم «موبایل جاوا اسکریپت رو ساپورت نمی کنه» همین لینکه ریداریکت بصورت دستی بکارم آمد.
خوب زیاد حرف زدم. اما دو سال پیش وقتی من جواب درست نگرفتم خودم یاد گرفتم که باید بیشتر اینور و اونور رو نگاه کنم اما از همه ی دوستان با ادامه ی بحث چیزهای مفیدتری یاد گرفتم.
مثلاً خود من که همیشه از ترکیب notepad و frontpage استفاده می کردم بعد از مدتها وسوسه شدم dreamweaver رو دوباره نصب کنم و یا notepad ++ رو به دانلودم برای آشنایی بیشتر و در آخر تشکر از hidensoft عزیز که دقیق تر از دیگران مشکل من رو بررسی کرد.

خوشحالم که اینقدر مطالب مفید تونستم یاد بگیرم از دوستان.
ممنون.
post_thanks.gif
برای همتون
 
هیچ دلیلی نداره که شما حتما کد های پی اچ پی که با هدر سرو کار دارند رو قبل از خروجی بنویسید. PHP برای اینکه به شما این امکان رو بده تابعی داره با نام ob_start که دوستانی که منوال رو قرائت فرمودند می دونند که این تابع برای جلوگیری از همین موضوع هست.
سلام . یعنی اگه ار تابع ob_start استفاده کنیم ، می شه بعد از خروجی هم از header تابع استفاده کرد ؟

فرق زیادی بین header در PHP و window.Location در JS هست (به این نکته دقت کن دوست من
لطف می کنید بفرمایید که فرقشون چیه ؟ خیلی خیلی ممنون
در ضمن یکم هم درباره این خروجی صحبت کنید ! یعنی چی باید قبل از خروجی از هیدر اتفاده کرد ؟ یک دنیا ممنون
 

sunrise

Member
لطف می کنید بفرمایید که فرقشون چیه ؟ خیلی خیلی ممنون
در ضمن یکم هم درباره این خروجی صحبت کنید ! یعنی چی باید قبل از خروجی از هیدر اتفاده کرد ؟ یک دنیا ممنون
يکي از تفاوت هايي که ميشه بهش اشاره کرد اينه که در window.location = ... عمليات ريدايرکت بصورت کلاينت سايد صورت مي گيره و ملزم به اين هست که صفحه يک بار لود بشه تا عمليات صورت بگيره و در اين حالت احساس ميشه عمليات انتقال در دو مرحله صورت مي گيره اما وقتي با استفاده از header("Location: ...") عمليات انتقال صورت مي گيره چون ما در هدر اين تعريف رو انجام داديم و فايل PHP اون ابتدا پردازش بعد به مرورگر ارسال مي کنه بنابراين ديگه اون پرش (يا همون تأخير) زياد قابل لمس نخواهد بود.
 
فرق دیگه شون هم همانطور که توی پست بالا اشاره کردم اینه که برای مرورگرهایی که قابلیت اجرای جاوا اسکریپت براشون برداشته شده یا ندارند هم قابل انتقال است. چون به قول دوستمون دیگه کلاینت ساید نیست.
ضمن اینکه بله. مورد کاربرد تابع ob_start و توابع هم خانواده اش هم همین است. به این شرح که خروجی های صفحه را همه ذخیره می کنه. (output buffering) و به محض فراخوانی یا جایگزینی در یک رشته می توان به همه ی خروجی درست بعد از توابعی مانند header و یا امثالهم بکار برد.
البته مورد کاربرد این تابع به اینجاها محدود نمیشه ولی میشه توی مواردی اینچنینی ازش استفاده کرد. البته اکثراً کاربردی تره که برای ریدایرکت ها از همون طرف کلاینت استفاده بشه.
 
بله. مورد کاربرد تابع ob_start و توابع هم خانواده اش هم همین است. به این شرح که خروجی های صفحه را همه ذخیره می کنه. (output buffering) و به محض فراخوانی یا جایگزینی در یک رشته می توان به همه ی خروجی درست بعد از توابعی مانند header و یا امثالهم بکار برد.
سلام . می شه یه مثال بزنید ؟ و بگید که چه جوری بعد خروجی با استفاده ار تابع ob_start می شه ریدایرکت کرد ؟ خواهشا نگید که از منوآل استفاده کنم . ممنون
 

lepi

Member
اکثراً کاربردی تره که برای ریدایرکت ها از همون طرف کلاینت استفاده بشه.

دلیل این پیشنهاد شما چی هست و چرا می فرمایید بهتره ؟؟؟

هرکدام به جای خودشون باید استفاده بشن

بعضی جاها که از تغییر مسیر مرورگر توسط سرور احمقانه به نظر می رسه همون اندازه تغییر مسیر مرورگر توسط کلاینت ناشیانه هست

در مورد سوال دوست خوبم که پرسیدن
در هر صورت آيا راه ديگري براي بردن مرورگر از يك صفحه به صفحه ي ديگر به جز تابع هدر وجود دارد؟

از متاتگ میتونی استفاده کنی با این راهبرد بهتر که میشه بهش زمان داد که مثلا 3 ثانیه پس از بالا آمدن صفحه یک (که این متاتگ در آن نوشته شده) مرورگر به صفحه دو ارجاع میشه

دقیقا چیزی که همیشه پس از login کردن در همین انجمن ملاحظه می فرمایید

<meta http-equiv="refresh" content="3;url=http://www.yoursite.com/page2.html" />

در مورد دوست عزیز hidensoft
قصد بی احترامی ندارم اما بحث یکم به جاهای خنده دار کشید.
یقینا شما از شخصیت بلایی برخوردار هستید
دوست من عنایت داشته باشید که همه مثل شما حرفه ای نیستند و مشکلاتی که شما 4 سال پیش به جوابش رسیدید یک نفر هست که امروز به این مشکل برخورده و این نه عیب هست و نه خنده دار چون تازه شروع کرده

تا جایی که من شنیدم با توجه به اینکه کشور ما داره خودش رو برای قبول قانون کپی رایت آماده میکنه خیلی از ASP کارها دارن به سمت PHP روی میارن به همین دلیل تا حالا چندین ASP نویس در زمینه PHP از من سوالاتی رو پرسیدن در مورد PHP و آینده ای که براش انتظار میره، که واسم جالب بود
 
نقل قول:
اکثراً کاربردی تره که برای ریدایرکت ها از همون طرف کلاینت استفاده بشه.

دلیل این پیشنهاد شما چی هست و چرا می فرمایید بهتره ؟؟؟

خیلی ساده است دوست من، جواب شما درست است که گفتید بعضی جاها فلان بعضی جاهای دیگه بهمان اما من گفتم بیشتر کاربردی تره چون اکثراً مدیران سایت دوست دارند قبل از ریدایرکت یک مطلبی رو به کاربر نشون بدهند. و اگه ما با تابع header از طرف سرور انتقال رو انجام بدهیم به قول شما قصد داشتیم که اصلا کاربر نفهمه انتقالی صورت گرفته.
مثال میزنم.
برای ورود به سیستم (حالا هر سیستم طرف کاربری ای که نوشتیم ) ما از ریدایرکت کلاینت ساید استفاده می کنیم + یک چند ثانیه تاخیر قبلش تا کاربر بفهمه که با موفقیت وارد شده و بعد صفحه ی اصلی سایت رو ببینه.
در مورد متاتگ هم مورد خوبی رو اشاره کردید. اما بازهم کلاینت سایده دیگه.
در مورد ob_start توی پست بعدی یک مثال میزنم.
 
مثال از ob_start()

این مثال رو عیناً از خود سایت php.net آوردم چون هم خیلی ساده و هم گویای مطلب است:

[LTR]
<?php

function callback($buffer)
{
// replace all the apples with oranges
return (str_replace("apples", "oranges", $buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush();

?>
[/LTR]

خروجی این کد:

[LTR]
<html>
<body>
<p>It's like comparing oranges to oranges.</p>
</body>
</html>
[/LTR]

چرا؟! چه شد؟!

ما یک فانکشن تعریف کردیم که اصلا ربطی به جریان نداره اما خوب کمک می کنه در درک ماجرا بنام callback کارش هم اینه که هر رشته ای رو که بگیره بررسی می کنه و اگر کلمه ی apple توش بود رو با orrange عوض می کنه.
خوب تو کدمون ما اول یک سری کد اچ تی ام ال داریم و قبلش از تابع [LTR]ob_start("callback"); [/LTR]استفاده کردیم. خوب این تابع اول از نمایش کلیه ی خروجی های صفحه جلوگیری میکنه تا وقتیکه که برنامه به او اجازه بده. بعد توی آرگومان خود یک فانکشن هم میپذیره بنام callback که کارش رو گفتیم.
نتیجه این شد که وقتی ما اجازه رو به تابع می دهیم برای چاپ خروجی با [LTR]ob_end_flush();[/LTR] متن خروجی که تابحال در بافرینگ شده بود چاپ میشه+تغییر کوچکی که تابع callback روش انجام میده. (نتیجه اینکه بجای اینکه طبیعتا متن اچ تی ام ال همانطور که هست چاپ بشه این متن ذخیره میشه و همراه با تغییرات تبدیل apple به oranges چاپ میشه.) حالا شما می تونید تصور کنید چطور تابع header رو می تونید بعد از ob_start بکار ببرید. :)
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا