PHP-তে HTTP রেসপন্স হেডারের সমস্যা
HTTP নিয়ম অনুসারে, প্রথমে HTTP হেডার প্রেরণ করা হয়,
এবং তারপর HTTP রেসপন্সের বডি।
এই কারণে PHP-তে header ফাংশন ব্যবহারের
কিছু নিজস্ব বৈশিষ্ট্য রয়েছে।
সমস্যাটি হল যে, যদি এই ফাংশনটি কল করার আগে
পর্দায় কোনো আউটপুট থাকে,
তাহলে সেটিকে রেসপন্স বডির শুরু হিসেবে বিবেচনা করা হবে।
এই ক্ষেত্রে, header ফাংশন কল করলে
PHP একটি সতর্কবার্তা দেবে
"headers already sent" লেখাসহ।
এমনকি হেডারগুলি পাঠানোও হতে পারে।
এমনকি ত্রুটিটিও প্রদর্শিত নাও হতে পারে (PHP-এর
সেটিংসের উপর নির্ভর করে)। কিন্তু বেশিরভাগ ক্ষেত্রেই এটি শুধুমাত্র
লোকাল হোস্টে দেখা যাবে, এবং সাইটটি ইন্টারনেটে আপলোড করার সময়
সবকিছু ভেঙে পড়বে।
পর্দায় আউটপুট বলতে যেকোনো টেক্সট বোঝানো হয়। উদাহরণস্বরূপ, এভাবে:
text
<?php
header('Content-Type: text/html');
?>
অথবা একটি খালি লাইন:
<?php
header('Content-Type: text/html');
?>
অথবা একটি স্পেস:
<?php
header('Content-Type: text/html');
?>
অথবা একটি ট্যাগ:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
অথবা echo এর মাধ্যমে আউটপুট:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
অথবা var_dump এর মাধ্যমে আউটপুট:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
এমনকি PHP-এর সতর্কবার্তাগুলিও পর্দায় আউটপুট হিসেবে গণ্য হবে। নিম্নলিখিত উদাহরণে ইচ্ছাকৃতভাবে একটি অস্তিত্বহীন ভেরিয়েবল অ্যাক্সেস করা হয়েছে, যা একটি সতর্কবার্তা আউটপুট করবে:
<?php
$text += 1;
header('Content-Type: text/html');
?>
PHP ব্র্যাকেটের ভাঙ্গনও পর্দায় আউটপুট তৈরি করে:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
ইচ্ছাকৃতভাবে header ফাংশনের আগে
পর্দায় একটি আউটপুট তৈরি করুন।
ঘটতে থাকা ত্রুটির টেক্সটটি অধ্যয়ন করুন।
এই কোডে করা ভুলটি সংশোধন করুন:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>