PDA

View Full Version : مشکل ob_start با json



mohamadali1374
جمعه 14 فروردین 1394, 10:40 صبح
سلام
من در اول صفحه از ob_start ودرآخر صفحه ازob_flush برای جلوگیری از خطای header استفاده میکنم و مشملم اینجاست که کدهای ajax و json اجرا نمیشن و ارور زیر رو میده:


129980

مطمئن هستم که مشکل از هون دو تابع(ob_start ,ob_flush) هست چون با حذف این دوتا کدهای json بدون هیچ مشکلی اجرامیشن ولی از طرفی خطای header دارم لطفا کمک کنید.

mohamadali1374
جمعه 14 فروردین 1394, 15:39 عصر
سلام لطفا کسی کمک کنه....

id1385
جمعه 14 فروردین 1394, 16:01 عصر
مشکل شما مربوط به کد هستش نه هدر، کدتون رو بزارید یا حداقل خروجی کد (که جاوا اسکریپت میشه) رو بزارید

mohamadali1374
جمعه 14 فروردین 1394, 16:12 عصر
ممنون از جوابتون ولی منظورم از header همون ارور معروف
Headers already sentهست و من برای بر طرف کردنش از ob_start و ob_flush استفاده میکنم . این مال یه بخش از سایت هست؛ که بخش json که مال قسمت دیگه سایته رو از کار میندازه.و اون اروری که گذاشتم(عکس بالا) رو میده.
و به محض پاک کردن ob_start و ob_flush درست میشه
لطفا شما راه حل برطرف کردن
Headers already sent رو بگید راهی که خودتون استفاده میکنید اینترنت رو بررسی کردم و تمام راه ها رو رفتم فقط با دو تا تابع ob_start و ob_flush این ارور(headers already sent) برطرف میشه که یه جای دیگه رو(json) خراب میکنه.
لطفا کمک کنید..

Unique
جمعه 14 فروردین 1394, 18:53 عصر
Headers already sent زمانی اتفاق میفته که شما مقداری غیر از تابع header را به مرورگر میفرستین و بعدش میخواین از header استفاده کنید. این مشکل معمولا به خاطر BOM یا یک space یا کاراکتر های دیگه در ابتدای فایل پیش میاد. معموملا چون توی php زیاد require یا include انجام میشه پیدا کردن صفحه ا یکه این مشکل را داره گاهی سخته.

استفاده از ob_start یا ib_flash راه حل نیست ! بلکه چون مکانیزم عوض میشه شما دیگه این خطا را نمیگیرین. در این شرابط کاربر باید صبر کنه شما کل html را توی خروجی بریزین و بعدش ببینه در صورتی که اگه از این توابع استفاده نمیکرید اطلاعات همون موقع echi به مرورگر ارسال میشدند.

خودم به شخصه غیر از مواردی که عمدتا قصد عدم نمایش تا تکمیل را داشتم از این توابع استفاده نکردم و نمیکنم. بگردین ببینین مشکل اصلی کجاست. میتوهه یک warning هم باعثش بشه. کلا هیچ چیزی نباید قبل از توابع Header ارسال شده باشه. ببینین کجا دارین از header استفاده میکنین و کد های ما قبل را کامل debug کنید.

mohamadali1374
جمعه 14 فروردین 1394, 19:46 عصر
BOM رو چک کردم ومنظورتون از
ودم به شخصه غیر از مواردی که عمدتا قصد عدم نمایش تا تکمیل را داشتم از این توابع استفاده نکردم و نمیکنم. بگردین ببینین مشکل اصلی کجاست. میتوهه یک warning هم باعثش بشه. کلا هیچ چیزی نباید قبل از توابع Header ارسال شده باشه. ببینین کجا دارین از header استفاده میکنین و کد های ما قبل را کامل debug کنید.
اینکه قبل از توابعی مثل include و .. چیزی نباید نوشته باشه؟؟

Unique
شنبه 15 فروردین 1394, 10:13 صبح
ببینین تا موقعی که ساختار شما مشخص نباشه ! نمیشه دقیق حدسی زد. شما باید ببینین کدوم خط که داره header میفرسته به خطا میخوره و بعدش بیاین از اون خط به بالا را trace کنید و ببینید کجا داره به سمت کلاینت ارسال انجام میشه. برخی مواقع میتونه موضوع BOM باشه ! برخی مواقع یک خطا یا warning یا notice ، برخی مواقع یک کاراکتر که اشتباه تایپ شده. قطعا یه چیزی هست.

mohamadali1374
شنبه 15 فروردین 1394, 10:22 صبح
شما باید ببینین کدوم خط که داره header میفرسته به خطا میخوره و بعدش بیاین از اون خط به بالا را trace کنید
خوب چطوری تشخیص بدم که کدوم خطا داره ؟

Unique
شنبه 15 فروردین 1394, 14:28 عصر
راستش من مواردی سراغ دارم که شخصی یک ماه طول کشیده تا مشکل را پیدا کنه و اغلب هم مشکل توسط یک کلاس فرعی یا اشتباه سهوی اتفاق افتاده.
شما میتونید با تابع headers_sent (https://php.net/manual/en/function.headers-sent.php) چک کنید. این تابع دو تا متغیر میگیره که در صورت true بودن نام فایل و خطی که header ها ارسال شده اند را به شما میده.

شما مجبورید کد را debug و trace کنید تا مشکل را پیدا کنید. واقعا نیاز به کمی مهارت و خلاقیت داره اما کار خیلی سختی هم نیست.

mohamadali1374
شنبه 15 فروردین 1394, 23:27 عصر
Unique (http://barnamenevis.org/member.php?11933-Unique) خیلی ممنون بالاخره هرجوری که بود trace کردم بالاخره جواب داد و مشکل رو پیدا کردم.

تجربه خوبی بود و فهمیدم که OB_START و OB_FLUSH فقط ارور Headers already sent رو برطرف میکنه و 1000 ارور دیگه رو ایجاد میکنه.:قهقهه:
دومین تجربه ای که کسب کردم این بود که کدهام رو مرتب بنویسم..............:بامزه: