PDA

View Full Version : مشکل ارور در هنگام استفاده از دستور header



barnamenevis2016
چهارشنبه 03 تیر 1394, 11:51 صبح
سلام...گاهی وقت ها نمی دونم چرا وفتی از دستور زیر

header("location:profile.php?member={$member_id}");
exit();استفاده می کنم....سیستم همه کدای قبلش رو درست انجام می ده...ولی تا به این دستور می رسه خطای زیر رو می ده و به صفحه مورد نظر نمی ره:


Warning: Cannot modify header information - headers already sent by (output started at E:\*******\header.php:162)
in E:\*******\profile.php on line 63
مثلا error بالا اشاره داره به فایل header.php و خط آخرش یعنی 162...در حالی که من ربط فایل header.php که در ابتدای تمام صثحات اینکلود می شه را با این دستور متوجه نمی شم....

iker-casillas
چهارشنبه 03 تیر 1394, 13:47 عصر
سلام
این ارور معمولا زمانی نمایش داده میشه که شما توی صفحه خودتون چیزی داشته باشید که نمایش داشته باشه؛ چیزی مثل echo یا یه ارور که کامپایلر سعی می کنه اون رو چاپ کنه

H:Shojaei
پنج شنبه 04 تیر 1394, 01:10 صبح
سلام...گاهی وقت ها نمی دونم چرا وفتی از دستور زیر

header("location:profile.php?member={$member_id}");
exit();استفاده می کنم....سیستم همه کدای قبلش رو درست انجام می ده...ولی تا به این دستور می رسه خطای زیر رو می ده و به صفحه مورد نظر نمی ره:


Warning: Cannot modify header information - headers already sent by (output started at E:\*******\header.php:162)
in E:\*******\profile.php on line 63
مثلا error بالا اشاره داره به فایل header.php و خط آخرش یعنی 162...در حالی که من ربط فایل header.php که در ابتدای تمام صثحات اینکلود می شه را با این دستور متوجه نمی شم....
همونطور که دوستمون گفتا این که قبل تابع هدر چیزی چاپ کنید باعث این خطا میشه و همچنین تو بعضی موارد خواص دیگه که اگر echo هم مثلا نباشه این خطا باز هم میاد...
اینطور مواقع تابع ob_start(); ابتدای فایل و تابع ob_end_flush(); انتهای فایل میتونه 90% مشکل رو رفع کنه و بعضی موارد این تابع هم کار نمیکنه که من خودم یک بار همچین اتفاقی افتاد روش رو عوض کردم چون خطاهه بود که بود!!! بیخیالش شدم...

jafaripur
پنج شنبه 04 تیر 1394, 08:18 صبح
قبل از تغییر هدر و فرستادن هیچ اطلاعاتی نباید به سمت کلاینت بره، هیچ ربطی هم به ob_start() و اینجور چیزا نداره. حتی اگه کد PHP داری و یه خط بالای فایل خالی باشه باز اینجوری می شهو شاید تو این هدر رو توی کدهای HTML نوشتی اگر نه هم چک کن ببین قبل از فرستادن هدر چیزی به خروجی نرفته باشه.

H:Shojaei
پنج شنبه 04 تیر 1394, 14:04 عصر
قبل از تغییر هدر و فرستادن هیچ اطلاعاتی نباید به سمت کلاینت بره، هیچ ربطی هم به ob_start() و اینجور چیزا نداره. حتی اگه کد PHP داری و یه خط بالای فایل خالی باشه باز اینجوری می شهو شاید تو این هدر رو توی کدهای HTML نوشتی اگر نه هم چک کن ببین قبل از فرستادن هدر چیزی به خروجی نرفته باشه.
اینطور که شما قطعی گفتید حتما ob_start به header ربطی نداره دیگه!!!
ولی خود پیج php (http://php.net/manual/en/function.ob-start.php) یه چیز دیگه میگه و میگه که این تابع ربط داره و وقتی باشه...
شما به جای این که خط خالی یا اون فضای خالی قبل تگ php یا ببینید چیزی چاپ شده توی پیج قبل تابع یا چندین میرد دیگه رو چک کنید و اگر خوش شانس باشید زیر 5 دقیقه مشکل رو بفهمید کافیه همین تابع رو به ابتدای فایل اضافه کنید... همین نحوه کارش رو هم توی سایت خودش بخونید...

Unique
شنبه 06 تیر 1394, 22:14 عصر
توی لینک گفتید پیشنهاد میشه output buffering انجام نشه چرا؟ میشه لطف کنید دلیل هم بفرمایید... ممنون
راستش واقعا نمیتونم بگم "بهتره استفاده نکنیم" و توی پست وبلاگ هم تغیرش دادم.
output buffering بعضی مواقع هم خیلی خیلی خوبه ! اما استفاده از output buffering برای ممانعت از headers already sent به نظرم راه حل خوبی نیست ! اینکه فکر کنی راه حل منظقی این خطا هست کلا اشتباهه و چون توی اون پست وبلاگ در مورد این خطا صحبت میکردم کمی زیاده روی کردم.

us1234
شنبه 06 تیر 1394, 22:44 عصر
کدینگ فایل را بدون BOM در نظر بگیرید به احتمال زیاد ( چون قبلا درست بوده ) مشکل حل میشه .

---
ولی من چند وقت پیش در یک پروژه به یک مورد تقریبا مشابه برخورد کردم که میخواستم کل content حذف کند و به صورت force-download یک فایل تکس از دیتابیس export کنم و برای دانلود بگذارم
کل کار از قبل درست شده بود و نمیشد بیس کار را تغییر داد.

بنابر این اومدم از flush() قبل از هدرهایی که برای دانلود ست کرده بودم استفاده کردم ، content حذف شد ولی فایل دیگه قابل دانلود نمیشود و داخل مرورگر محتوای فایل نمایش داده میشد ، یعنی هدر هایی که بعد از flush به کار برده بودم عملا از کار می افتاد .

چون وقت کم بود کار را به شکل دیگه هندل کردم و الان که این مطلب را دیدم به ذهنم رسید از بقیه دوستان سوال کنم که عملا راه حل اینکه بخواهم کل content را حذف کنیم وبعد دوباره header ست کنیم چیه ؟

H:Shojaei
یک شنبه 07 تیر 1394, 02:10 صبح
راستش واقعا نمیتونم بگم "بهتره استفاده نکنیم" و توی پست وبلاگ هم تغیرش دادم.
output buffering بعضی مواقع هم خیلی خیلی خوبه ! اما استفاده از output buffering برای ممانعت از headers already sent به نظرم راه حل خوبی نیست ! اینکه فکر کنی راه حل منظقی این خطا هست کلا اشتباهه و چون توی اون پست وبلاگ در مورد این خطا صحبت میکردم کمی زیاده روی کردم.
من تحقیق کردم همونطور که شما هم گفتید گاهی توی اسکریپت های خیلی بزرگ که مثلا قراره 100 تکه کد php بین کدهای html اجرا بشن یعنی بخشی html و بخشی هم php خیلی هم میتونه مفید باشه چون محتوا یک بار ساخته میشه و همه به کلاینت ارسال میشه...
در کل هم هیچکجا دلیلی بر این که اصلا استفاده نکنیم من ندیدم معمولا یا از مزایاش میگفتن یا صحبتهای حاشیه ای بود...
این هم که راه حل منطقی این خطاست خیر درست میفرمایید..
چون این خطا دلایل بسیاری داره که تقریبا از شاید 7-8 مورد 3-4 تاش رو این تابع بتونه حل کنه ولی در کل چیز بدی هم نیست...