এডভান্স পিএইচপি (Advanced PHP)
Advanced PHP হল পিএইচপি প্রোগ্রামিং ভাষার আরও গভীর ও উন্নত ধারণাগুলোর একটি সেট, যা একটি কার্যকরী ও স্কেলেবল ওয়েব অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে। এখানে মূলত ব্যবহৃত হয় অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP), ডেটাবেস ইন্টিগ্রেশন, সিকিউরিটি, এপিআই ব্যবহার এবং কাস্টম লোগিক।
নিচে কিছু এডভান্স পিএইচপি ধারণা এবং কৌশল আলোচনা করা হলো যা পিএইচপি ডেভেলপারদের উন্নত দক্ষতা অর্জনে সাহায্য করবে।
1. অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP)
PHP-এ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর সাহায্যে আপনি কোডকে মডুলার এবং পুনঃব্যবহারযোগ্য করতে পারেন। এটি আপনাকে ক্লাস, অবজেক্ট, ইনহেরিটেন্স, পলিমরফিজম, এনক্যাপসুলেশন ইত্যাদি ব্যবহার করতে সক্ষম করে।
Class and Object Example:
make = $make;
$this->model = $model;
}
// Method
function getCarDetails() {
return $this->make . " " . $this->model;
}
}
// Create an object
$car1 = new Car("Toyota", "Corolla");
echo $car1->getCarDetails(); // Output: Toyota Corolla
?>
Key Concepts:
- Inheritance: ক্লাসের মাধ্যমে অন্য ক্লাসের বৈশিষ্ট্য (properties) এবং মেথড (methods) গ্রহণ।
- Polymorphism: একই মেথডের ভিন্ন ভিন্ন আচরণ (implementation)।
- Encapsulation: ডেটা এবং মেথড একত্রে সংরক্ষণ করা।
2. ডেটাবেস ইন্টিগ্রেশন (Database Integration)
MySQL বা অন্য ডেটাবেসের সাথে PHP ইন্টিগ্রেশন একটি ওয়েব অ্যাপ্লিকেশন তৈরির জন্য অত্যন্ত গুরুত্বপূর্ণ। পিএইচপি ডেটাবেসের সাথে যোগাযোগ করতে mysqli বা PDO (PHP Data Objects) ব্যবহার করা হয়।
PDO (PHP Data Objects) Example:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT id, name FROM users");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
echo $row['id'] . " " . $row['name'] . "
";
}
}
catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>
Advantages of PDO:
- Prepared Statements: SQL ইনজেকশন থেকে সুরক্ষা।
- Multiple Database Support: PDO একাধিক ডেটাবেসের সাথে কাজ করতে পারে যেমন MySQL, PostgreSQL, SQLite ইত্যাদি।
3. পিএইচপি সিকিউরিটি (PHP Security)
পিএইচপি অ্যাপ্লিকেশনের সিকিউরিটি অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যখন ব্যবহারকারীর ইনপুট নিয়ন্ত্রণ করা হয়। সঠিকভাবে সিকিউরিটি ম্যানেজমেন্ট করলে অ্যাপ্লিকেশনটি হ্যাকারদের থেকে রক্ষা পাবে।
Common PHP Security Techniques:
- SQL Injection Protection:
- PDO এবং Prepared Statements ব্যবহার করা।
Cross-site Scripting (XSS):
htmlspecialchars()ফাংশন ব্যবহার করে ইউজারের ইনপুট স্যানিটাইজ করা।
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');- Cross-site Request Forgery (CSRF):
- CSRF টোকেন ব্যবহার করা যাতে ফর্ম সাবমিশনের সময় সিকিউরিটি নিশ্চিত করা যায়।
Password Hashing:
- পাসওয়ার্ড সঞ্চয়ের জন্য
password_hash()এবংpassword_verify()ব্যবহার করুন।
// Hashing a password $hashed_password = password_hash("user_password", PASSWORD_DEFAULT); // Verifying the password if (password_verify("user_password", $hashed_password)) { echo "Password is valid!"; } else { echo "Invalid password."; }- পাসওয়ার্ড সঞ্চয়ের জন্য
4. ফাইল আপলোড এবং ম্যানিপুলেশন (File Upload & Manipulation)
ফাইল আপলোড করা এবং সেগুলোকে সঠিকভাবে ম্যানিপুলেট করা, যেমন ছবি রিসাইজিং বা ফাইল ফরম্যাট পরিবর্তন, এই সব কাজ একটি অ্যাডভান্স পিএইচপি স্কিল।
File Upload Example:
5. RESTful API Development in PHP
PHP দিয়ে RESTful API তৈরি করা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ওয়েব সার্ভিসের মাধ্যমে ডেটা এক্সচেঞ্জের জন্য ব্যবহৃত হয়। আপনি JSON রেসপন্স দিয়ে API তৈরি করতে পারেন।
Example of RESTful API:
'success', 'data' => 'Hello World'];
echo json_encode($response);
break;
case 'POST':
$inputData = json_decode(file_get_contents("php://input"));
$response = ['status' => 'success', 'receivedData' => $inputData];
echo json_encode($response);
break;
default:
echo json_encode(['status' => 'error', 'message' => 'Invalid Request']);
break;
}
?>
6. Sessions and Cookies in PHP
Sessions এবং Cookies ব্যবহার করে ইউজারের ডেটা ট্র্যাক করা এবং স্টোর করা হয়। Sessions সাধারণত সার্ভারে সঞ্চিত থাকে এবং Cookies ব্রাউজারে সঞ্চিত থাকে।
Session Example:
Cookie Example:
7. Autoloading Classes
PHP-তে ক্লাসগুলি autoloading করার মাধ্যমে আপনি ক্লাসগুলিকে সঠিক সময় লোড করতে পারেন। এর জন্য spl_autoload_register() ব্যবহার করা হয়।
Autoloading Example:
এখানে, MyClass ক্লাসটি classes/ ডিরেক্টরির মধ্যে পাওয়া যাবে এবং যখন এটি প্রথমবার ব্যবহার হবে, তখনই এটি অটোমেটিক্যালি লোড হবে।
সারসংক্ষেপ:
Advanced PHP ডেভেলপমেন্টে আপনি বিভিন্ন গুরুত্বপূর্ণ বিষয় যেমন OOP, Database Integration, API Development, File Handling, Security, Sessions & Cookies, এবং Autoloading ব্যবহার করতে পারবেন। এই বিষয়গুলো পিএইচপি ডেভেলপারদের আরও স্কেলেবল, সিকিউর, এবং রক্ষণাবেক্ষণযোগ্য ওয়েব অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে।
এছাড়া, ফাংশনাল ও অবজেক্ট-ওরিয়েন্টেড পিএইচপি, RESTful API তৈরি এবং ওয়েব অ্যাপ্লিকেশনের সিকিউরিটি নিশ্চয়তা পেতে এসব কৌশল ব্যবহার করা প্রয়োজন।
পিএইচপি date() ফাংশনটি তারিখ এবং/অথবা সময়কে সাজানোর জন্য ব্যবহার করা হয়।
পিএইচপি date() ফাংশন
পিএইচপি date() ফাংশন একটি টাইমস্ট্যাম্পকে পড়ার উপযোগী করে তারিখ এবং সময়ে সাজায়।
সিনট্যাক্স
kt_satt_skill_example_id=179
| প্যারামিটার | বিবরণ |
|---|---|
| format | আবশ্যক। টাইমস্ট্যাম্প এর ফরম্যাটকে নির্দেশ করে। |
| timestamp | ঐচ্ছিক। একটি টাইমস্ট্যাম্পকে নির্দেশ করে। ডিফল্ট হলো বর্তমান তারিখ ও সময়। |
একটি টাইমস্ট্যাম্প হলো ক্যারেক্টারের ধারাবাহিকতা, যা একটি নির্দিষ্ট ইভেন্ট সম্পন্ন হওয়ার পর তারিখ এবং/অথবা সময়কে বর্ণনা করে।
সাধারণ তারিখ পাওয়ার উপায়
আপনি কিভাবে তারিখের ফরম্যাট করতে চাচ্ছেন তা date() ফাংশনের আবশ্যক প্যারামিটার( format) এর মাধ্যমে নির্ধারণ করে দিতে হয়।
এখানে কিছু ক্যারেক্টার দেওয়া হলো যেগুলো সাধারণত তারিখের জন্য ব্যবহার করা হয়ঃ
- d - মাসের মধ্যে একটি দিনকে রিপ্রেজেন্ট করে (১ থেকে ৩১)।
- m - মাসকে রিপ্রেজেন্ট করে (১ থেকে ১২)।
- Y - একটি বৎসরকে রিপ্রেজেন্ট করে (চার ডিজিটে)।
- l(ছোট অক্ষরের 'L') - সপ্তাহের একটি দিনকে রিপ্রেজেন্ট করে।
নিজের ইচ্ছামতো তারিখ এবং সময়কে ফরম্যাট করার জন্য স্পেশাল ক্যারেক্টার যেমনঃ "/", ".", অথবা "-" ব্যবহার করা যায়। নিচের উদাহরণটি অনুশীলন করুন।
নিচের উদাহরণে আজকের তারিখকে তিনটি ভিন্ন সাজে দেখানো হয়েছেঃ
kt_satt_skill_example_id=180
সাধারণ সময় পাওয়ার উপায়
এখানে কিছু ক্যারেক্টার দেওয়া হলো যেগুলো সাধারণত সময়ের জন্য ব্যবহার করা হয়ঃ
- h - 12-hour ফরম্যাটের ঘন্টাকে নির্দেশ করে যা শুন্য(০) থেকে শুরু হয়(00 থেকে 12)
- i - মিনিটকে নির্দেশ করে যা শুন্য(০) থেকে শুরু হয়(00 থেকে 59)
- s - সেকেন্ডকে নির্দেশ করে যা শুন্য(০) থেকে শুরু হয়(00 থেকে 59)
- a - ছোট অক্ষরের Ante meridiem(am) এবং Post meridiem(pm)
নিচের উদাহরণে নির্দিষ্ট ফরম্যাটে বর্তমান সময় আউটপুট নেওয়া হলোঃ
kt_satt_skill_example_id=181
বিঃদ্রঃ পিএইচপি date() ফাংশন আপনার সার্ভারের বর্তমান তারিখ/সময় রিটার্ন করবে!
স্বয়ংক্রিয়ভাবে সাইটের কপিরাইট সময় সেট করা
আপনার ওয়েবসাইটে কপিরাইট বৎসর অটোমেটিক আপডেট রাখার জন্য পিএইচপি date() ফাংশন ব্যবহার করুন:
kt_satt_skill_example_id=182
কিভাবে আপনার টাইম জোন(time zone) পাবেন?
পূর্বের কোডগুলোর মাধ্যমে আপনি হয়তো সঠিক সময় পাননি, এর কারন সম্ভবত আপনি অন্য কোন দেশে আছেন অথবা আপনার সার্ভারের সময় অন্য টাইম জোনে সেট করা আছে।
তাই, আপনি যদি সঠিক সময় পেতে চান, তাহলে আপনার প্রয়োজন মতো নির্দিষ্ট টাইমজোন সেট করে নিন।
নিচের উদাহরণে টাইম জোন "Asia/Dhaka" তে সেট করা হয়েছে এবং তারপর নির্দিষ্ট ফরম্যাটে বর্তমান সময়ের আউটপুট নেওয়া হয়েছেঃ
kt_satt_skill_example_id=183
পিএইচপি mktime() ফাংশনের মাধ্যমে একটি তারিখ তৈরি
date() ফাংশনের ঐচ্ছিক প্যারামিটার(timestamp) একটি টাইমস্ট্যাম্পকে নির্দেশ করে। আপনি যদি কোন টাইমস্ট্যাম্প নির্দিষ্ট করে দেন, তাহলে বর্তমান তারিখ এবং সময় ব্যবহৃত হবে(উপরের উদাহরণে যেমনটি দেখানো হয়েছে)।
তারিখের জন্য mktime() ফাংশন Unix টাইমস্ট্যাম্প রিটার্ন করে। Unix টাইমস্ট্যাম্প Unix Epoch (January 1 1970 00:00:00 GMT) এবং নির্ধারিত সময়ের মধ্যে সেকেন্ডের সংখ্যা ধারণ করে।
নোটঃ Unix কি তা জানার জন্য এই Unix শব্দটির উপর মাউসের কার্সর ধরুন।
সিনট্যাক্স
kt_satt_skill_example_id=184
নিচের উদাহরণটি mktime() ফাংশনের কয়েকটি প্যারমিটার হতে তারিখ এবং সময় রিটার্ন করেঃ
kt_satt_skill_example_id=185
পিএইচপি strtotime() ফাংশনের সাহায্যে স্ট্রিং থেকে তারিখ তৈরি
পিএইচপি strtotime() ফাংশন আমাদের কাছে সহজে পাঠ্যোগ্য এমন স্ট্রিংকে Unix টাইমে রুপান্তর করে।
সিনট্যাক্স
kt_satt_skill_example_id=186
নিচের উদাহরণে strtotime() ফাংশন ব্যবহার করে তারিখ ও সময় তৈরি করে দেখানো হলোঃ
kt_satt_skill_example_id=188
স্ট্রিং থেকে তারিখে রুপান্তরের ক্ষেত্রে পিএইচপি অনেক চতুর, তাই আপনি বিভিন্ন ধরনের ভ্যালু অন্তর্ভূক্ত করতে পারেনঃ
kt_satt_skill_example_id=189
strtotime()ফাংশনটি শতভাগ প্রত্যাশিত ফলাফল নাও দিতে পারে। তাই এই ফাংশনে স্ট্রিং সরবরাহ করার সময় চেক করে নিন।
তারিখ সংক্রান্ত অধিক উদাহরণ
নিচের উদাহরণে পরবর্তী ৬টি শুক্রবার কোন কোন তারিখে পড়ে তা দেখানো হয়েছেঃ
kt_satt_skill_example_id=190
নিচের উদাহরণে ৬ই নভেম্বর হতে এখনো কতোদিন বাকি আছে তা আউটপুট দেখাবেঃ
kt_satt_skill_example_id=191
পিএইচপির মাধ্যমে আপনি এক ফাইলের কোড কপি করে অন্য ফাইলে নিতে পারেন। নির্দিষ্ট কোন ফাইল থেকে সকল টেক্সট/কোড/মার্কআপ কপি করে অন্য ফাইলে নেওয়ার জন্য পিএইচপি include অথবা require স্টেটমেন্ট ব্যবহার করা হয়। এক্ষেত্রে যে ফাইলের মধ্যে include স্টেটমেন্ট ব্যবহার করা হয় কপি কোড সেই ফাইলেই সম্পাদিত হয়।
ধরুন আপনি একই পিএইচপি কোড, এইচটিএমএল কোড অথবা টেক্সট কে একাধিক পেজে অন্তর্ভূক্ত করতে চাচ্ছেন তাহলে আপনি অন্তর্ভুক্তির এই পদ্ধতি(include অথবা require স্টেটমেন্ট) ব্যবহার করতে পারেন।
পিএইচপি include এবং require স্টেটমেন্ট
সার্ভার আপনার ফাইলকে এক্সিকিউট করার পূর্বেই আপনি include অথবা require স্টেটমেন্টের মাধ্যমে এক বা একাধিক পিএইচপি ফাইলের কন্টেন্ট বা কন্টেন্টসমূহ আপনার পিএইচপি ফাইলে অন্তর্ভূক্ত করতে পারেন।
include অথবা require স্টেটমেন্ট প্রায় একই অর্থে ব্যবহত হয়, তবে ফাইল বিদ্যমান না থাকলে বা failure এর ক্ষেত্রে পার্থক্য প্রতীয়মানঃ
| include স্টেটমেন্ট | require স্টেটমেন্ট |
|---|---|
include স্টেটমেন্ট শুধুমাত্র একটি warning দেখাবে (E_WARNING) কিন্তু স্ক্রিপ্টের এক্সিকিউশন বন্ধ করবে না। | require স্টেটমেন্ট fatal error তৈরি করবে (E_COMPILE_ERROR) এবং স্ক্রিপ্টের এক্সিকিউশন বন্ধ করে দিবে। |
সুতরাং অন্তর্ভূক্তকৃত(included) ফাইল মিসিং হওয়া স্বত্তেও আপনি যদি কোড এক্সিকিউশন চালু রাখতে চান এবং ইউজারদেরকে আউটপুট দেখাতে চান তাহলে include স্টেটমেন্ট ব্যবহার করুন।
অন্যথায় ফ্রেমওয়ার্ক, CMS(Content Manaement System) অথবা অন্য যেকোন জটিল পিএইচপি এপ্লিকেশনের ক্ষেত্রে সর্বদাই require স্টেটমেন্ট ব্যবহার করুন। যদি দূর্ঘটনাবশত আপনার কোন প্রধান(key) ফাইল মিসিং হয়, তাহলে এটি আপনার এপ্লিকেশনের সিকিউরিটি এবং অখন্ডতার(security and integrity) স্বার্থে কোন কম্প্রোমাইজ করবে না।
ফাইল অন্তর্ভূক্ত(include) করলে কাজ অনেক সাশ্রয় হয়। সুতরাং আপনি চাইলে আপনার ওয়েবসাইটের সবগুলো পেজের জন্য একটি স্ট্যান্ডার্ড হেডার, ফুটার এবং মেনু তৈরি করে নিতে পারেন এবং include এবং require স্টেটমেন্ট ব্যবহার করে সকল পেজে যুক্ত করতে পারেন।
মনে করুন, আপনার ওয়েবসাইটের মেনু-বারে কোন তথ্য আপডেট করতে হবে। এর জন্য আপনাকে সবগুলো পেজ আলাদা ভাবে আপডেট করতে হবে না। শুধুমাত্র অন্তর্ভূক্তকৃত(included) ফাইলটি আপডেট করে নিলেই সবগুলো পেজের মেনু-বার আপডেট হয়ে যাবে।
সিনট্যাক্স
kt_satt_skill_example_id=192
ফাইল অন্তর্ভুক্তকরণ উদাহরণ
মনে করুন, আমাদের একটি স্ট্যান্ডার্ড মেনু ফাইল রয়েছে যার নাম "menu.php":
kt_satt_skill_example_id=193
আমরা আমাদের ওয়েবসাইটের সকল পেজে এই মেনু ফাইলটি ব্যবহার করত চাচ্ছি। নিচের উদাহরণের সাহাযে আমরা এটা করে দেখিয়েছি। এই মেনু ফাইলটি আমরা একটি div এলিমেন্টের মধ্যে যুক্ত করেছি যেন পরবর্তীতে সিএসএস এর মাধ্যমে খুব সহজেই যেকোনো স্টাইল করতে পারি।
kt_satt_skill_example_id=194
মনে করুন, আমাদের একটি স্ট্যান্ডার্ড ফুটার ফাইল রয়েছে যার নাম "footer.php"।
kt_satt_skill_example_id=195
ফুটার ফাইলকে পেজের মধ্যে অন্তর্ভূক্ত করার জন্য include স্টেটমেন্ট ব্যবহার করুনঃ
kt_satt_skill_example_id=196
পিএইচপি include বনাম require
পিএইচপি কোডের মধ্যে ফাইল অন্তর্ভূক্ত করার জন্য require স্টেটমেন্টটিও ব্যবহার করা হয়।
যাইহোক, এদের মধ্যে একটি বড় পার্থক্য বিদ্যমান। ধরুন include স্টেটমেন্টের মাধ্যমে ফাইল অন্তর্ভূক্ত করা হলো এবং কোন কারনে ফাইলটি মিসিং হয়ে গেলো তারপরেও পিএইচপি স্ক্রিপ্ট এর এক্সিকিউশন চালু থাকবেঃ
kt_satt_skill_example_id=197
আমরা যদি একই উদাহরণটিতে require স্টেটমেন্ট ব্যবহার করি, তাহলে echo স্টেটমেন্টের এক্সিকিউশন বন্ধ হয়ে যাবে। কারন আবশ্যক ফাইলটি না পাওয়া গেলে require স্টেটমেন্টটি fatal error রিটার্ন করবেঃ
kt_satt_skill_example_id=199
এপ্লিকেশনের আবশ্যক ফাইলের জন্য require স্টেটমেন্ট ব্যবহার করুন।
অপরদিকে, এপ্লিকেশনের ফাইলট যদি ঐচ্ছিক হয় তাহলে include স্টেটমেন্ট ব্যবহার করুন।
ফাইল হ্যান্ডেলিং যেকোন ওয়েব এপ্লিকেশনেরই একটি গুরুত্বপূর্ণ অংশ। বিভিন্ন কাজের জন্য প্রায়ই আপনাকে ফাইল ওপেন এবং প্রসেস করতে হতে পারে।
পিএইচপি ফাইল ম্যানিপুলেশন
ফাইল তৈরি, পড়া, আপলোড এবং মডিফাই বা পরিবর্তন করার জন্য পিএইচপিতে বেশ কয়েকটি ফাংশন রয়েছে।
ফাইল ম্যানিপুলেশনের সময় সতর্ক থাকা উচিৎ!
ফাইল ম্যানিপুলেশন(Manipulation) এর সময় আপনাকে অবশ্যই খুব সতর্ক থাকতে হবে।
কারণ আপনার সামান্য ভুলে অনেক বড় ধরনের ক্ষতি হয়ে যেতে পারে। সাধারন ভূলগুলো হলোঃ ভুল করে সঠিক ফাইল এডিট না করা, অপ্রয়োজনীয় ডেটা দিয়ে হার্ড-ড্রাইভ পূর্ণ করা এবং ভুলবশত কোন ফাইল ডিলেট করে ফেলা।
পিএইচপি readfile() ফাংশন
readfile() ফাংশন একটি ফাইলকে পড়ে এবং এটিকে আউটপুট বাফারে(buffer) লিখে প্রকাশ করে।
মনে করুন "abbreviation.txt" নামে আমাদের সার্ভারে একটি টেক্সট ফাইল রয়েছে।
"abbreviation.txt" ফাইল
Wi-Fi = Wireless Fidelity
WiMax = Worldwide Interoperability for Microwave Access
GSM = Global System for Mobile communication
CDMA = Code Division Multiple Access
W-CDMA = Wideband Code Division Multiple Access
AMPS = Advance Mobile Phone System
UMTS = Universal Mobile Telecommunication System
IMT = International Mobile Telecommunication
আমরা পিএইচপি readfile() ফাংশন ব্যবহার করে ফাইলটির কন্টেন্ট আউটপুট হিসাবে ব্রাউজারে দেখাবো। এক্ষেত্রে readfile() ফাংশন সংশ্লিষ্ট ফাইলটি পড়ে এবং আউটপুটের সাথে ফাইলের সাইজও বাইট সংখ্যায় রিটার্ন করে।
kt_satt_skill_example_id=234
আপনি যখন শুধুমাত্র ফাইল ওপেন করতে এবং এর কন্টেন্ট পড়তে চাইবেন কেবল তখনই readfile() ফাংশনটি সবচেয়ে বেশী কার্যকরী হবে।
পরবর্তী অধ্যায়গুলোতে ফাইল হ্যান্ডেলিং সম্মন্ধে আরো ভালো ধারনা দেওয়া হয়েছে।
এই অধ্যায়ে আপনি জানবেন কিভাবে সার্ভারে একটি ফাইল খোলা, পড়া এবং বন্ধ করা যায়।
পিএইচপি fopen() ফাংশন ব্যবহার করে ফাইল খোলা
সার্ভারে ফাইল খোলার সবচেয়ে সহজ এবং উত্তম পদ্ধতি হলো fopen() ফাংশন এর ব্যবহার। ফাইল ওপেন করার ক্ষেত্রে এই ফাংশনটি আপনাকে readfile() ফাংশনের তুলনায় অনেক বেশি অপশন এবং সুবিধা প্রদান করবে।
পূর্বের মত এই অধ্যায়েও আমরা "abbreviation.txt" টেক্সট ফাইলটি ব্যবহার করবোঃ
"abbreviation.txt" ফাইল
Wi-Fi = Wireless Fidelity
WiMax = Worldwide Interoperability for Microwave Access
GSM = Global System for Mobile communication
CDMA = Code Division Multiple Access
W-CDMA = Wideband Code Division Multiple Access
AMPS = Advance Mobile Phone System
UMTS = Universal Mobile Telecommunication System
IMT = International Mobile Telecommunication
fopen() সিনট্যাক্স
kt_satt_skill_example_id=239
প্যারামিটার এর বর্ণনাঃ
- filename-
fopen()ফাংশনের মাধ্যমে যে ফাইলটি ওপেন করা হবে সেটির নাম নির্দেশ করে। - mode- ফাইলটি যেই মোডে ওপেন হবে সেই মোডকে নির্দেশ করে।
নিচের উদাহরণের মাধ্যমে দেখানো হলো fopen() ফাংশন ব্যবহার করে কিভাবে একটি ফাইল ওপেন করতে হয় এবং যদি নির্দিষ্ট ফাইলটি ওপেন করা সম্ভব না হয় তাহলে কিভাবে একটি ত্রুটি(error) মেসেজ জেনারেট করতে হয়ঃ
kt_satt_skill_example_id=240
নিম্নের টেবিলে ফাইল ওপেন এর বিভিন্ন মোড তুলে ধরা হলোঃ
| মোড | বিবরণ |
|---|---|
| r | read only মোডে ফাইল ওপেন করে। ফাইল পয়েন্টার ফাইলের একেবারে প্রথম থেকে আরম্ভ হয়। |
| w | write only মোডে ফাইল ওপেন করে। বিদ্যমান ফাইলের সকল কন্টেন্ট মুছে ফেলবে অথবা আগে থেকে ফাইল না থাকলে নতুন ফাইল তৈরি করবে। ফাইল পয়েন্টার ফাইলের একেবারে প্রথম থেকে আরম্ভ হয়। |
| a | write only মোডে ফাইল ওপেন করে। বিদ্যমান ফাইলের সকল কন্টেন্ট সংরক্ষিত থাকবে। ফাইল পয়েন্টার ফাইলের একেবারে শেষ থেকে আরম্ভ হয়। পূর্বে থেকে ফাইল না থাকলে নতুন ফাইল তৈরি করবে। |
| x | write only মোডে নতুন ফাইল তৈরি করে। যদি পূর্বে থেকে ফাইল বিদ্যমান থাকে তাহলে FALSE এবং error রিটার্ন করবে। |
| r+ | read/write মোডে ফাইল ওপেন করে। ফাইল পয়েন্টার ফাইলের একেবারে শুরু থেকে আরম্ভ হয়। |
| w+ | read/write মোডে ফাইল ওপেন করে। ফাইলে কোন তথ্য থাকলে মুছে যাবে। অথবা আগে থেকে ফাইল না থাকলে নতুন ফাইল তৈরি করে। ফাইল পয়েন্টার ফাইলের একেবারে প্রথম থেকে আরম্ভ হয়। |
| a+ | read/write মোডে ফাইল ওপেন করে। ফাইল থেকে পূর্বর তথ্য মুছে যাবে না, বরং নতুন তথ্য সংযোজন হবে। ফাইল পয়েন্টার ফাইলের একেবারে শেষ থেকে আরম্ভ হয়। এক্ষেত্রে আগে থেকে ফাইল না থাকলে নতুন ফাইল তৈরি করবে। |
| x+ | read/write মোডে নতুন ফাইল তৈরি করে। যদি পূর্বে থেকে ফাইল বিদ্যমান থাকে তাহলে FALSE এবং error রিটার্ন করবে। |
fread() ফাংশন ব্যবহার করে পিএইচপি ফাইল পড়া
fread() ফাংশন একটি ওপেন করা ফাইল পড়ে।
fread() সিনট্যাক্স
kt_satt_skill_example_id=242
shrotcode
প্যারামিটার এর বর্ণনাঃ
- filename-
fread()ফাংশনের মাধ্যমে যে ফাইলটি ওপেন করা হবে তার নাম নির্দেশ করে। - fileSize()- এই ফাংশনটি যে ফাইলটি ওপেন করা আছে তার সাইজ রিটার্ন করে।
উদাহরণঃ fread() ফাংশন ব্যবহার করে abbreviation.txt ফাইল এর সম্পূর্ণ ডেটা পড়া
kt_satt_skill_example_id=243
উপরের পিএইচপি কোড "abbreviation.txt" ফাইল এর একেবারে প্রথম থেকে শেষ পর্যন্ত পড়বেঃ
fclose() ফাংশন ব্যবহার করে ফাইল বন্ধ করা
একটি ওপেন করা ফাইল বন্ধ করার জন্য fclose() ফাংশন ব্যবহার করা হয়।
কোন ফাইল এর কাজ শেষ হলে সেটিকে বন্ধ করে দেওয়া উচিৎ। কারণ আপনি নিশ্চয়ই চাইবেন না যে একটি ওপেন ফাইল আপনার সার্ভারে ঘুরাঘুরি করে অযথা মেমোরি দখল করে রাখুক!
fclose() ফাংশন ব্যবহার করে আপনি যেই ফাইলটিকে ক্লোজ করতে চান প্যারামিটার হিসাবে সেই ফাইলের নাম অথবা ভ্যারিয়েবলের নাম লাগবে(যার মধ্যে ফাইলটি রাখা হয়েছে)।
kt_satt_skill_example_id=244
পিএইচপি fgets() ফাংশন ব্যবহার করে সিঙ্গেল লাইন পড়া
একটি ফাইল থেকে শুধুমাত্র এক লাইন পড়ার জন্য fgets() ফাংশন ব্যবহার করা হয়।
উদাহরণঃ "abbreviation.txt" ফাইলের প্রথম লাইন আউটপুট হিসাবে দেখাবে
kt_satt_skill_example_id=245
বিঃদ্রঃ fgets() ফাংশনকে কল করার পর ফাইল পয়েন্টার পরবর্তী লাইনে অগ্রসর হয়।
পিএইচপি feof() ফাংশন ব্যবহার করে অজানা দৈর্ঘ্যের তথ্য পড়া
eof এর পূর্ণরূপঃ "end-of-file"।
পিএইচপি feof() ফাংশন ফাইল পয়েন্টার ফাইলের শেষে পৌছেছে কিনা চেক করে।
অজানা দৈর্ঘ্য বিশিষ্ট তথ্যকে Loop করার জন্য feof() ফাংশনটি বেশ উপকারী।
উদাহরণfeof() ফাংশনটি "abbreviation.txt" ফাইলের শেষে না যাওয়া পর্যন্ত ফাইলটিকে লাইন বাই লাইন পড়তে থাকবে।
kt_satt_skill_example_id=248
পিএইচপি fgetc() ফাংশন ব্যবহার করে সিঙ্গেল ক্যারেক্টার পড়া
একটি ফাইলের একটি একক ক্যারক্টার বা অক্ষর পড়ার জন্য fgetc() ফাংশন ব্যবহার করা হয়।
নিচের উদাহরণে "abbreviation.txt" ফাইলটিকে ক্যারেক্টার বাই ক্যারেক্টার পড়বে, যতক্ষন না পর্যন্ত শেষ লাইনে পৌছায়ঃ
উদাহরণঃ fgetc() ফাংশনটি "abbreviation.txt" ফাইলের শেষ অক্ষরে না যাওয়া পর্যন্ত ফাইলটিকে ক্যারেক্টার বাই ক্যারেক্টার পড়তে থাকবে।
kt_satt_skill_example_id=250
নোটঃ fgetc() ফাংশনকে কল করার পর ফাইল পয়েন্টার পরবর্তী ক্যারক্টারে অগ্রসর হয়।
এই অধ্যায়ে আমরা শিখবো কিভাবে সার্ভারে ফাইল তৈরি করা যায় এবং লেখা যায়।
পিএইচপি fopen() ফাংশন ব্যবহার করে ফাইল তৈরি
পিএইচপি সার্ভারে ফাইল তৈরি করার জন্যও fopen() ফাংশনটি ব্যবহার করা হয়। কিছুটা হতভম্ব হচ্ছেন তাই না? কিন্তু পিএইচপিতে যেই ফাংশন দিয়ে ফাইল ওপেন করা হয় সেটি দিয়ে ফাইল তৈরিও করা যায়।
মনে করুন, আপনি একটি ফাইল ওপেন করার জন্য fopen() ফাংশন ব্যবহার করবেন, কিন্তু ফাইলটি পূর্ব থেকে তৈরি করা নাই। তাহলে এটি আপনার জন্য একটি নতুন ফাইল তৈরি করে দিবে। এটা নির্ভর করবে আপনি কোন মোডে fopen() ফাংশনটি ব্যবহার করছেন। অর্থাৎ আপনি ফাংশন এর mode প্যারামিটারে writting(w) অথবা appending(a) মোড ব্যবহার করছেন কিনা।
নিম্নের উদাহরণে "myFile.txt" নামে একটি ফাইল তৈরি করা হয়েছে। পিএইচপি কোড যে ডিরেক্টোরিতে রয়েছে ফাইলটিও একই ডিরেক্টোরিতে তৈরি হবেঃ
kt_satt_skill_example_id=254
পিএইচপি ফাইল এক্সেস পারমিশন
যদি এই কোডগুলো রান করাতে error এর সম্মুখিন হোন, তাহলে সার্ভার হার্ড-ড্রাইভে আপনার পিএইচপি ফাইল এক্সেস অনুমতি আছে কিনা চেক করে নিন।
fwrite() ফাংশন ব্যবহার করে ফাইলে লেখা
ফাইলে লেখার জন্য fwrite() ফাংশন ব্যবহার করা হয়।
fwrite() সিনট্যাক্স
kt_satt_skill_example_id=255
প্যারামিটার এর বর্ণনাঃ
- filename-
fopen()ফাংশনের মাধ্যমে যে ফাইলটি ওপেন করা হবে সেটির নাম নির্দেশ করে। - content- ফাইলে যা কিছু লেখা হবে সেই স্ট্রিংকে নির্দেশ করে।
নিচের উদাহরণে "newFile.txt" নামে একটি নতুন ফাইলে কিছু নাম লেখা হয়েছেঃ
kt_satt_skill_example_id=256
উপরের প্রোগ্রামে লক্ষ্য করলে দেখবেন, আমরা "newFile.txt" ফাইলটিতে দুই বার লিখেছি। প্রত্যেকবারই আমরা ফাংশন এর মধ্য দিয়ে ফাইল নাম এবং স্ট্রিংযুক্ত $text ভ্যারিয়েবল প্রেরণ করেছি যা প্রথমবার "আজিজুর রহমান" এবং দ্বিতীয়বার "জিহাদুল ইসলাম" ধারন করছিল। লেখা শেষ হওয়ার পর আমরা fclose() ফাংশনের মাধ্যমে ফাইলটি ক্লোজ করে দিয়েছি।
পিএইচপি ফাইল ওভাররাইটিং
আমাদের "newFile.txt" ফাইলে কিছু তথ্য রয়েছে। এখন আমরা আপনাকে দেখাব, যদি পূর্বে থেকে বিদ্যমান কোন ফাইল লেখার জন্য ওপেন করা হয় তাহলে কি ঘটবে? পূর্বের বিদ্যমান সকল তথ্য মুছে যাবে এবং আমরা পূনরায় নতুন করে লেখা শুরু করবো।
নিচের উদাহরণে আমরা আমাদের বিদ্যমান "newFile.txt" ফাইলটি ওপেন করবো এবং এতে কিছু নতুন তথ্য লিখবোঃ
kt_satt_skill_example_id=257
এই অধ্যায়ে আপনি পিএইচপি ব্যবহার করে সার্ভারে ফাইল আপলোড করা শিখবেন। পিএইচপির সাহায্যে সার্ভারে ফাইল আপলোড করা খুবই সহজ।
যাইহোক, এই সহজ বিষয়টিও আপনার জন্য বিপদ ডেকে আনতে পারে! তাই ফাইল আপলোড এর অনুমতি দেয়ার ক্ষেত্রে সতর্ক থাকুন।
"php.ini" ফাইল কনফিগার
প্রথমতঃ এটি নিশ্চিত করুন যে, ফাইল আপলোড করার জন্য "php.ini" ফাইল কনফিগার করা হয়েছে।
ফাইল আপলোড কনফিগার করার জন্য আপনার "php.ini" ফাইলে file_filelocation লিখে সার্চ করে এটিতে On সেট করুনঃ
file_filelocation = Onফাইল আপলোডের জন্য এইচটিএমএল ফরম তৈরি
দ্বিতীয়তঃ একটি এইচটিএমএল ফরম তৈরি করুন যার মাধ্যমে একজন ইউজার তার পছন্দ মতো ইমেজ আপলোড করতে পারবে।
kt_satt_skill_example_id=259
উপরের এইচটিএমএল ফরমের জন্য কিছু করনীয় বিষয়ঃ
- ফরম সাবমিট এর সময়
method="post"এর ব্যবহার নিশ্চিত করুন। - এছাড়া ফরমের মধ্যে
enctype="multipart/form-data"এট্রিবিউটটি ব্যবহার করতে হবে। এই এট্রিবিউট এর মাধ্যমে ফরম সাবমিট এর সময় কন্টেন্ট এর টাইপ নির্ধারণ করা হয়।
উপরোক্ত শর্তসমুহ না মানলে ফাইল আপলোড কাজ করবে না।
ইনপুট এলিমেন্টে type="file" এট্রিবিউটটি ব্যবহারের মাধ্যমে ব্রাউজারে একটি বাটন তৈরি হবে যার মাধ্যমে ফাইল সিলেক্ট করা যাবে।
উপরের ফরমটি প্রসেস করার জন্য method="post" এর সাহায্যে "uploadfile.php" ফাইলের কাছে পাঠানো হয়।
আপনার বুঝার সুবিধার্থে নিম্নে "uploadfile.php" ফাইলের কোডসমূহ ধাপে ধাপে দেখানো হয়েছে এবং পরিশেষে সম্পূর্ণ কোড একসাথে লেখা হয়েছে।
ফাইল আপলোডের পিএইচপি স্ক্রিপ্ট
ফাইল আপলোড করার কোডগুলো "uploadfile.php" ফাইলে থাকেঃ
kt_satt_skill_example_id=260
পিএইচপি স্ক্রিপ্টের ব্যাখ্যাঃ
- $target_directory = "filelocation/" - ফাইলটি যে ডিরেক্টরিতে গিয়ে জমা হবে সেটি নির্ধারণ করে।
- $target_file - যে ফাইলটি আপলোড হবে সেটির path নির্দিষ্ট করে।
- $fileuploadDone = 1 - ফাইল আপলোড এর স্ট্যাটাস নির্দেশ করে।
- $fileExtension - ফাইলের এক্সটেনশন ধারন করে।
- ইমেজ ফাইলটি আসল ইমেজ নাকি ফেক ইমেজ পরবর্তীতে চেক করা হবে।
নোটঃ যে ডিরেক্টরিতে "uploadfile.php" ফাইলটি রয়েছে, আপনাকে সেখানে "filelocation" নামে নতুন একটি ডিরেক্টরি তৈরি করতে হবে। আপলোডকৃত ফাইলগুলো এই ডিরেক্টরিতে সংরক্ষণ হবে।
ফাইল পূর্ব থেকেই আছে কিনা চেক করা
এখন আমরা অনেকগুলো সীমাবদ্ধতা যুক্ত করতে পারি।
প্রথমতঃ আমরা যে ফাইলটি আপলোড করবো সেই ফাইলটি "filelocation" ফোল্ডারের মধ্যে আছে কিনা চেক করে নিব। যদি পূর্ব থেকেই ফাইল আপলোড করা থাকে তাহলে একটি error মেসেজ প্রদর্শিত হবে এবং $fileuploadDone এ 0 সেট হবেঃ
kt_satt_skill_example_id=262
ফাইলের সাইজ লিমিটেশন
আমাদের এইচটিএমএল ফরমের ফাইল ইনপুট ফিল্ডের নাম দেওয়া হয়েছে "fileUpload"।
এখন আমরা ফাইলের সাইজ চেক করবো। ফাইলটি যদি 300kb এর চেয়ে বড় হয় তাহলে একটি error মেসেজ প্রদর্শিত হবে এবং $fileuploadDone এ 0 সেট হবেঃ
kt_satt_skill_example_id=263
ফাইলের টাইপ লিমিটেশন
নিচের কোডগুলো একজন ইউজারকে শুধুমাত্র JPG, JPEG, PNG এবং GIF ফাইল আপলোড করার অনুমতি দিবে। এগুলো ব্যতীত অন্য টাইপের ফাইল আপলোড করলে $fileuploadDone এ 0 সেট হওয়ার পূর্বেই একটি error মেসেজ প্রদর্শিত হবেঃ
kt_satt_skill_example_id=264
সম্পূর্ণ পিএইচপি ফাইল আপলোড স্ক্রিপ্ট
নিম্নে সম্পূর্ণ "uploadfile.php" ফাইল এর কোড দেওয়া হলোঃ
kt_satt_skill_example_id=265
PHP ব্যবহার করে ফাইল ডাউনলোড (File download) করার জন্য সাধারণত একটি ফাইলের কন্টেন্ট ক্লায়েন্ট ব্রাউজারে পাঠাতে হয়, যাতে ব্যবহারকারী সেটি ডাউনলোড করতে পারে। এটি করতে হলে, আপনাকে সঠিক HTTP হেডার ব্যবহার করে ফাইলের ধরনের তথ্য (MIME type) এবং ডাউনলোড করার জন্য প্রয়োজনীয় ডেটা পাঠাতে হবে। নিচে PHP ফাইল ডাউনলোড করার একটি সহজ উদাহরণ দেওয়া হলো।
PHP ফাইল ডাউনলোড করার পদ্ধতি:
- ফাইলের সঠিক হেডার পাঠানো: ফাইলের MIME type (যেমন
application/pdfবাimage/jpeg) ব্রাউজারকে জানাতে হবে, যাতে ব্রাউজার ফাইলটি সঠিকভাবে ডাউনলোড করতে পারে। - ফাইলের কন্টেন্ট পাঠানো: ফাইলের কন্টেন্ট ব্রাউজারে পাঠাতে হবে, যাতে ব্যবহারকারী এটি ডাউনলোড করতে পারে।
PHP File Download Example:
ব্যাখ্যা:
file_exists(): প্রথমে চেক করা হয় যে, ফাইলটি সঠিকভাবে উপস্থিত আছে কিনা।header(): বিভিন্ন HTTP হেডার সেট করা হয়েছে:Content-Description: File Transfer: ফাইল ট্রান্সফারের জন্য কন্টেন্টের বর্ণনা।Content-Type: application/octet-stream: এটি একটি binary stream হিসেবে কনফিগার করা হয়, অর্থাৎ এটি সাধারণত যে কোনো ফাইলের জন্য ব্যবহৃত হয়, যা সাধারণত ডাউনলোড করা হয়।Content-Disposition: attachment; filename="file-name": এটি ব্রাউজারকে বলে যে, এটি একটি attachment এবং ফাইলটির নাম হতে হবেexample.pdf।Content-Transfer-Encoding: binary: ফাইলের কন্টেন্ট বাইনারি আকারে পাঠানো হবে।Content-Length: ফাইলের সাইজটি পাঠানো হয়, যাতে ব্রাউজার ডাউনলোডের প্রগ্রেস ট্র্যাক করতে পারে।
ob_clean()এবংflush(): PHP output buffer ক্লিয়ার করা হয় এবং সিস্টেমের output flush করা হয়, যাতে ফাইল কন্টেন্ট সঠিকভাবে পাঠানো যায়।readfile(): নির্দিষ্ট ফাইলটি ব্রাউজারে পাঠানোর জন্য এটি ব্যবহৃত হয়।
ফাইল ডাউনলোড করার জন্য একটি লিঙ্ক (HTML):
Download Example PDF
এখানে, download.php স্ক্রিপ্টটি ডাউনলোড প্রক্রিয়া পরিচালনা করবে, এবং ?file=example.pdf ফাইলের পাথ অথবা নাম প্যারামিটার হিসেবে পাঠানো হবে। এই প্যারামিটার ব্যবহার করে আপনি ফাইলের পাথ নির্ধারণ করতে পারেন।
Security Considerations:
- File Path Validation: আপনি যে ফাইল ডাউনলোড করছেন, সেটি সঠিক পাথ থেকে আসছে কিনা তা যাচাই করা খুবই গুরুত্বপূর্ণ। Directory Traversal Attack থেকে রক্ষা পেতে, ফাইল পাথের বাইরে যেতে না দেয়ার জন্য সতর্ক থাকুন।
- Access Control: শুধু অনুমোদিত ব্যবহারকারীদের ফাইল ডাউনলোড করার অনুমতি দেওয়া উচিত। তাই, user authentication এবং authorization নিশ্চিত করুন।
if (!isset($_SESSION['user_logged_in'])) {
echo "You must be logged in to download files.";
exit;
}
এই প্রক্রিয়াটি ব্যবহার করে আপনি PHP তে ফাইল ডাউনলোড করার জন্য একটি সাধারণ এবং কার্যকরী উপায় তৈরি করতে পারেন। উপরের কোডে কিছু সাধারণ নিরাপত্তা ব্যবস্থা অন্তর্ভুক্ত করা হয়েছে, তবে আপনার প্রকল্পের চাহিদা অনুসারে আরও নিরাপত্তা ব্যবস্থা (যেমন, ইউজার অথেন্টিকেশন, ফাইল পাথ ভ্যালিডেশন) যোগ করা উচিত।
এই অধ্যায়ে আপনি কুকি সম্মন্ধে জানবেন। একজন ইউজারকে আইডেন্টিফাই করতে প্রায়ই কুকি(cookie) ব্যবহার করা হয়।
কুকি কি?
কুকি হলো একটি ছোট্ট ফাইল। সার্ভার এই ফাইলকে ইউজারের কম্পিউটারে সংস্থাপন(embed) করে রাখে। প্রত্যেকবার ঐ একই কম্পিউটার থেকে ব্রাউজার এর মাধ্যমে যখন সার্ভারে একটি পেজের জন্য রিকুয়েস্ট পাঠানো হয় তখন ঐ কম্পিউটার থেকে পেজ রিকুয়েস্টের পাশাপাশি কুকিটিও সেন্ড হয়।
পিএইচপির সাহায্যে আপনি কুকি ভ্যালু তৈরি করতে পারবেন এবং উদ্ধারও করতে পারবেন।
পিএইচপির সাহয্যে কুকি তৈরি
setcookie() ফাংশনের মাধ্যমে কুকি তৈরি করা হয়।
সিনট্যাক্স
kt_satt_skill_example_id=270
শুধুমাত্র name প্যারামিটারটি আবশ্যক। অন্যান্য সকল প্যারামিটারগুলো হলো ঐচ্ছিক।
পিএইচপি কুকি তৈরি/উদ্ধার
নিম্নের উদাহরনে পিএইচপি কুকি তৈরি করে দেখানো হলোঃ
kt_satt_skill_example_id=272
উদাহরণের ব্যাখ্যা
- উপরের উদাহরণে "তামজীদ হাসান" ভ্যালুযুক্ত একটি কুকি তৈরি করা হয়েছে এবং যার নাম দেওয়া হয়েছে "user"।
- ৩০ দিন(৮৬৪০০ * ৩০) পরে কুকিটির মেয়াদর্ত্তীন্ন(expire) হবে। "/" মানে হলো কুকিটি সমগ্র ওয়েবসাইট জুড়েই বিদ্যমান থাকবে। এছাড়া আপনি আপনার প্রয়োজন মতো ডিরেক্টরি সেট করে নিতে পারবেন।
- isset() ফাংশন ব্যবহার করে কুকি সেট করা হয়েছে কিনা চেক করা হয়।
- কুকি সেট করা হলে আমরা গ্লোবাল ভ্যারিয়েবল $_COOKIE এর মাধ্যমে "user" কুকির ভ্যালু উদ্ধার করবো।
নোটঃ setcookie() ফাংশনটি অবশ্যই ট্যাগ এর উপরে(আগে) ব্যবহার করতে হবে।
নোটঃ যখন কুকি পাঠানো হয় তখন ভ্যালু স্বয়ংক্রিয়ভাবে URL encoded হয় এবং যখন গ্রহণ করা হয় তখন স্বয়ংক্রিয়ভাবে decoded হবে।
URL encoding প্রতিরোধ করার জন্য setrawcookie() ফাংশনটি ব্যবহার করুন।
কুকি ভ্যালু পরিবর্তন করা
একটি কুকির ভ্যালু পরিবর্তন(modify) করার জন্য setcookie() ফাংশন ব্যবহার করে পূনরায় কুকিটিকে সেট করতে হয়।
kt_satt_skill_example_id=273
কুকি ডিলেট করা
কুকি ডিলেট করার জন্য setcookie() ফাংশন এর expire প্যারামিটারে মেয়াদ উত্তীর্ণ তারিখ ব্যবহার করুনঃ
kt_satt_skill_example_id=274
কুকি সক্রিয় আছে কিনা চেক করা
নিচের উদাহরণে একটি ছোট php স্ক্রিপ্ট তৈরি করা হয়েছে যা কুকি সক্রিয়(Enable) আছে কিনা চেক করবে।
প্রোগ্রামের প্রথমেই setcookie() ফাংশন ব্যবহার করে একটি কুকি তৈরি করে নেওয়া হয়েছে এবং তারপরে count() ফাংশনের মধ্যে $_COOKIE অ্যারে ভ্যারিয়েবলকে প্যারামিটার হিসাবে ব্যবহার করে কুকি সক্রিয় আছে কিনা চেক করা হয়েছে।
kt_satt_skill_example_id=276
এই অধ্যায়ে আপনি পিএইচপি সেশন সম্মন্ধে জানবেন। সেশন হলো ভ্যারিয়েবলের মধ্যে তথ্য সংরক্ষণ করার একটি উপায় যা একাধিক পেজে ব্যবহার করা যায়।
এই তথ্য গুলো ব্যবহারকারীর কম্পিউটারে সংরক্ষিত হয় না, বরং সার্ভারে সংরক্ষিত হয়।
পিএইচপি সেশন কি?
আপনি যখন একটি এপ্লিকেশন দিয়ে আপনার প্রয়োজনীয় কাজ করতে চান তখন প্রথমেই এটিকে চালু করেন, তারপর এর মধ্যে কিছু কাজ করেন, পরিশেষে এটিকে বন্ধ করে দেন। সেশন অনেকটা এই রকমই।
আপনার কম্পিউটার জানে আপনি কে। এটি এও জানে আপনি কখন এপ্লিকেশনটি চালু করেছেন এবং কখন বন্ধ করেছেন। কিন্তু অনলাইনের সমস্যা হলো ওয়েব সার্ভার জানে না আপনি কে অথবা আপনি কি করতে চান। কারন HTTP এড্রেস এ ব্যবহারকারী(user) সম্পর্কিত কোনো তথ্য থাকে না।
সেশন ভ্যারিয়েবল ব্যবহারকারীর username, name, password ইত্যাদি তথ্য সংরক্ষন করে রাখে যা একাধিক পেজে ব্যবহার করা যায়। একজন ব্যবহারকারী ব্রাউজার বন্ধ করার আগ পর্যন্ত সেশন ভ্যারিয়েবল ডিফল্টভাবে সংশ্লিষ্ট তথ্য সংরক্ষন করে রাখে।
সুতরাং সেশন ভ্যারিয়েবল একজন ব্যবহারকারীর তথ্য সংরক্ষন করে রাখে যা শুধুমাত্র ঐ এপ্লিকেশনে অবস্থিত সকল পেজে ব্যবহার করা যায়।
বিঃদ্রঃ আপনি যদি তথ্যসমূহ স্থায়ীভাবে সংরক্ষন করতে চান তাহলে ডাটাবেসে সংরক্ষন করুন।
পিএইচপি সেশন কিভাবে শুরু হয়?
session_start() ফাংশনের মাধ্যমে একটি সেশন শুরু হয়।
পিএইচপি সুপার গ্লোবাল ভ্যারিয়েবল $_SESSION দ্বারা সেশন ভ্যারিয়েবল গুলোকে সেট করতে হয়।
চলুন "test_session1.php" নামে একটি নতুন পেজ তৈরি করি। এই পেজে আমরা একটি নতুন পিএইচপি সেশন শুরু করবো এবং কিছু সেশন ভেবিয়েবল সেট করবোঃ
kt_satt_skill_example_id=282
বিঃদ্রঃ মনে রাখবেন, session_start() ফাংশনটি ডকুমেন্টের প্রথম লাইনে লিখতে হবে।
কিভাবে পিএইচপি সেশন ভ্যারিয়েবলের মান পাবেন?
এখন আমরা "test_session2.php" নামে আরেকটি পেজ তৈরি করবো। এই পেজ থেকে আমরা সেশনের তথ্যসমূহ এক্সেস করবো যা আমরা প্রথমে "test_session1.php" পেজে সেট করেছিলাম।
একটু লক্ষ্য করলে আপনি দেখবেন, সেশন ভেরিয়েবলগুলো প্রতিটি নতুন পৃষ্ঠায় স্বতন্ত্রভাবে অতিক্রম হচ্ছে না, এই জন্য আপনাকে প্রতিটি পেজের প্রথমেই session_start() ফাংশনটি শুরু করতে হবে।
লক্ষ্য করলে আপনি আরও দেখবেন যে, প্রতিটি সেশন ভ্যারিয়েবলের মান সুপার গ্লোবাল ভ্যারিয়েবল $_SESSION এর মধ্যে সংরক্ষিত হয়ঃ
kt_satt_skill_example_id=283
একজন ব্যবহারকারীর সবগুলো সেশন ভ্যারিয়েবলের মান দেখার জন্য আপনি print_r($_SESSION); ফাংশন ব্যবহার করতে পারেন।
kt_satt_skill_example_id=284
সেশন কিভাবে কাজ করে এবং কীভাবে জানতে পারে যে এটাই আপনি?
বেশীরভাগ সেশনই ইউজার কম্পিউটারে ইউজার এর একটি কী(key) সেট করে যা দেখতে কিছুটা 61n3ika5vtee9ro9lb04rqngf6 এর মত। তারপরে যখন অন্য একটি পেজে সেশনটি ওপেন করা হয়, তখন এটি ইউজার কী এর জন্য কম্পিউটারটিকে স্ক্যান করে। এটি যদি পূর্বের কোনো সেশনের সাথে মিল খুঁজে পায় তাহলে সেটিকে অ্যাক্সেস করে।
আর যদি কোনো মিল খুঁজে না পায় তাহলে একটি নতুন একটি সেশন তৈরি করে।
পিএইচপি সেশন ভ্যারিয়েবল কিভাবে পরিবর্তন করা হয়?
ওভাররাইট(overwrite) করার মাধ্যমে আপনি সেশন ভ্যারিয়েবল পরিবর্তন করতে পারবেনঃ
kt_satt_skill_example_id=285
পিএইচপি সেশন বাতিল করা
সকল গ্লোবাল সেশন ভ্যারিয়েবলগুলো রিমুভ এবং বাতিল করতে যথাক্রমে session_unset() এবং session_destroy() ফাংশন ব্যবহার করতে হবেঃ
kt_satt_skill_example_id=286
উপরের উদাহরনে session_unset() এবং session_destroy() ফাংশন ব্যবহার করার ফলে সবগুলো সেশন ভ্যারিয়েবল মুছে গেছে, তাই কোড রান করালে ফলাফল হিসাবে কিছুই দেখাবে না।
এই অধ্যায়ে আপনি পিএইচপি ফিল্টার এক্সটেনশন এর মাধ্যমে ডেটা ফিল্টার এবং এর মধ্য থেকে আগাছা পরিষ্কার(sanitizing) করা শিখবেন। এটি কিছু কিছু ক্ষেত্রে খুবই সহায়ক, বিশেষকরে ডেটার উৎস যখন আমাদের কাছে অজানা থাকে। উদাহরণস্বরূপঃ এই সকল ডেটা এইচটিএমএল ফরম এর মাধ্যমে আসতে পারে।
পিএইচপি ফিল্টার এর প্রকারভেদ
পিএইচপিতে দুই ধরণের ফিল্টারিং ব্যবহৃত হয়। যেমন-
- Validating data - ডেটাসমূহের গঠন যথাযথ উপায়ে আছে কিনা চেক করে।
- Sanitizing data - ডেটাসমূহের মধ্য থেকে যেকোন অপ্রত্যাশিত ক্যারেক্টার সরিয়ে ফেলে।
পিএইচপি ফিল্টার এক্সটেনশন
পিএইচপি ফিল্টারের মাধ্যমে বাহ্যিক ইনপুটগুলোকে ভ্যালিডেট এবং স্যানিটাইজ(sanitize) করা হয়।
পিএইচপি ফিল্টার এক্সটেনশনের মধ্যে ইউজার ইনপুট চেক করার জন্য অনেকগুলো ফাংশন রয়েছে এবং ডেটা ভ্যালিডেশন সহজে এবং দ্রুত করার জন্য এটি ডিজাইন করা হয়েছে।
পিএইচপি ফিল্টার এক্সটেনশনের মাধ্যমে আপনি কি কি সুবিধা পেতে পারেন তা জানার জন্য filter_list() ফাংশনটি ব্যবহার করতে পারেনঃ
kt_satt_skill_example_id=287
কেন ফিল্টার ব্যবহার করবেন?
অধিকাংশ ওয়েব এপ্লিকেশনেই বাহ্যিক সোর্স থেকে ইনপুট গ্রহন করতে হয়। নিম্নোক্ত উৎস হতে বাহ্যিক ইনপুট/ডেটা আসতে পারেঃ
- এইচটিএমএল ফরম থেকে ইউজার ইনপুট
- কুকি
- সার্ভার ভ্যারিয়েবল
- ডেটাবেস কুয়েরি থেকে প্রাপ্ত ফলাফল
- ওয়েব সার্ভিস ডেটা
কেন আপনি বাহ্যিক উৎস হতে প্রাপ্ত ডেটা সর্বদাই ভ্যালিডেট করবেন?
ইনভ্যালিড ডেটা সাবমিট আপনার ওয়েব এপ্লিকেশনে সিকিউরিটি জনিত সমস্যা সৃষ্টি করতে পারে। এমনকি আপনার ওয়েবপেজকে ধ্বংসও করে দিতে পারে!
পিএইচপি ফিল্টার ব্যবহারের মাধ্যমে আপনি আপনার এপ্লিকেশনে সঠিক ইনপুট নিশ্চিত করতে পারেন!
পিএইচপি filter_var() ফাংশন
ডেটা ভ্যালিডেট এবং স্যানিটাইজ একসাথে সম্পন্ন করার জন্য filter_var() ফাংশন ব্যবহার করা হয়।
filter_var() ফাংশনটি একটি নির্দিষ্ট ফিল্টারের মাধ্যমে একক ভ্যারিয়েবলকে ফিল্টার করে।
filter_var এর সিনট্যাক্স
kt_satt_skill_example_id=288
প্যারামিটার এর ব্যাখ্যা
- variable - আবশ্যক। যে ভ্যালুটি আপনি ফিল্টার/চেক করতে চান।
- filter - ঐচ্ছিক। ফিল্টার এর যে আইডি/টাইপ প্রয়োগ করবেন।
- options - ঐচ্ছিক। অপশন এর এসোসিয়েটিভ অ্যারে।
Integer ভ্যালিডেশন
নিম্নের উদাহরণে প্রথমে filter_var() ফাংশনের মাধ্যমে $integer ভ্যারিয়েবলটি integer কিনা চেক করবে। যদি $integer ভ্যারিয়েবলটি integer হয় তাহলে আউটপুট হবেঃ " ভ্যালিড ইন্টিজার"। আর যদি $integer ভ্যারিয়েবলটি integer না হয়, তবে আউটপুট হবেঃ "ইন্টিজার ভ্যালিড নয়"।
kt_satt_skill_example_id=289
filter_var() এবং 0 নিয়ে সমস্যার সমাধান
উপরের উদাহরণে যদি $integer ভ্যারিয়েবলে 0 সেট করা হয় তাহলে ফাংশনটি "ইন্টিজার ভ্যালিড নয়" রিটার্ন করবে। এই সমস্যা সমাধান করার জন্য নিচের উদাহরণটি অনুসরণ করুন।
kt_satt_skill_example_id=290
স্ট্রিং স্যানিটাইজ
নিচের উদাহরণে filter_var() ফাংশন ব্যবহার করে একটি স্ট্রিং থেকে সকল এইচটিএমএল ট্যাগ সরিয়ে ফেলা হয়েছেঃ
kt_satt_skill_example_id=291
IP এড্রেস ভ্যালিডেশন
নিচের উদাহরণে filter_var() ফাংশন ব্যবহার করে IP এড্রেস ভ্যালিড কিনা চেক করা হয়েছেঃ
kt_satt_skill_example_id=294
ইমেইল এড্রেস ভ্যালিডেট এবং স্যানিটাইজ করা
নিম্নের উদাহরণে filter_var() ফাংশন এর মাধ্যমে ইমেইল এড্রেস ভ্যালিড কিনা চেক করা হয়েছেঃ
kt_satt_skill_example_id=295
URL স্যানিটাইজ এবং ভ্যালিডেট করা
নিম্নের উদাহরণে filter_var() ফাংশনটি URL থেকে অপ্রত্যাশিত ক্যারক্টারগুলো সরিয়ে ফেলে এবং $url টি ভ্যালিড কিনা চেক করেঃ
kt_satt_skill_example_id=297
নির্দিষ্ট ব্যবধীর মধ্যে Integer ভ্যালিডেশন
filter_var() ফাংশন ব্যবহার করে আপনি নির্দিষ্ট ব্যবধীর মধ্যে ইন্টিজার আছে কিনা চেক করতে পারবেন।
নিন্মের উদাহরণে filter_var() ফাংশনের মাধ্যমে একটি ভ্যারিয়েবল integer এবং এটি ১ থেকে ৩০০ এর মধ্যে আছে কিনা চেক করা হয়েছেঃ
kt_satt_skill_example_id=300
IPv6 এড্রেস ভ্যালিডেশন
নিম্নের উদাহরণে filter_var() ফাংশনের মাধ্যমে $ip_address ভ্যারিয়েবল এর ভ্যালু IPv6 এড্রেস ভ্যালিড কিনা চেক করা হয়েছেঃ
kt_satt_skill_example_id=301
কুয়েরি স্ট্রিংসহ URL ভ্যালিডেশন
নিম্নের উদাহরণে filter_var() ফাংশন এর মাধ্যমে $url ভ্যারিয়েবলটি query string যুক্ত URL কিনা চেক করা হয়েছেঃ
kt_satt_skill_example_id=303
এই অধ্যায়ে আপনি পিএইচপি error নিয়ন্ত্রণ সম্মন্ধে জানবেন। পিএইচপির ডিফল্ট error হ্যান্ডেলিং খুবই সাধারন। এটি ফাইলের নাম, লাইনের নাম্বার এবং error এর বিবরণসহ ব্রাউজারে একটি মেসেজ পাঠায়।
পিএইচপি Error হ্যান্ডেলিং
আপনি যখন পিএইচপি স্ক্রিপ্ট এবং ওয়েব এপ্লিকেশন তৈরি করবেন তখন প্রায় সময়েই আপনাকে বিভিন্ন ধরণের error এর সম্মুখিন হতে হবে। তাই যেকোনো স্ক্রিপ্ট এবং ওয়েব এপ্লিকেশনের ক্ষেত্রে error নিয়ন্ত্রণ(handling) সম্মন্ধে জানা অত্যাবশ্যক।
আপনার কোড/এপ্লিকেশন এর মধ্যে যদি error চেক করার জন্য কোনো কোড না থাকে, তাহলে এই কোডগুলো অনেকটা অপেশাদার ডেভেলপার কর্তৃক লেখা কোড এর মত দেখাবে। এছাড়া এটি আপনার এপ্লিকেশন এর নিরাপত্তা ঝুঁকিও বাড়িয়ে দিতে পারে।
এই টিউটোরিয়ালে আমরা পিএইচপির বহুল ব্যবহত error নিয়ন্ত্রণে রাখার কিছু মেথড সম্মন্ধে আলোচনা করেছি।
- "die()" ফাংশন
- ইউজার কর্তৃক error তৈরি এবং error ট্রিগার/কল করা
- এরর রিপোর্ট করা
এরর নিয়ন্ত্রণে die() ফাংশন এর ব্যবহার
নিন্মের উদাহরণের মাধ্যমে একটি এইচটিএমএল ফাইল ওপেন করার চেষ্টা করা হয়েছে। কিন্তু ফাইলটি বিদ্যমান না থাকায় সিস্টেম কর্তৃক এরর উৎপন্ন হবে।
kt_satt_skill_example_id=307
উপরের error মেসেজ প্রতিরোধ করার জন্য আপনি ফাইলটি এক্সেস করার আগে ফাইলটি আছে কিনা চেক করে নিতে পারেন। ফাইলটি যদি বিদ্যমান না থাকে তবে আপনি die() ফাংশন এর মাধ্যমে একটি error মেসেজ দেখাতে পাবেনঃ
kt_satt_skill_example_id=308
দ্বিতীয় উদাহরণের কোডগুলো প্রথম উদাহরণের কোডগুলোর চেয়ে বেশী কার্যকরী, কারন এটি error ঘটার সঙ্গে সঙ্গে একটি এরর মেসেজ উৎপন্ন করে এবং স্ক্রিপ্ট এক্সিকিউশন বন্ধ করে দেয়।
যাইকোক শুধুমাত্র স্ক্রিপ্ট এক্সিকিউশন বন্ধ করা সবসময় সঠিক পদ্ধতি নাও হতে পারে। তাই চলুন সঠিক পদ্ধতিতে error হ্যান্ডেলিং করার জন্য পিএইচপির আরও কার্যকরী ফাংশনগুলো দেখে নিই।
নিজস্ব Error হ্যান্ডেলার তৈরি
কাস্টম/নিজস্ব error হ্যান্ডেলার তৈরি করা খুবই সহজ। এটি করার জন্য আমরা সাধারণত একটি বিশেষ ফাংশন তৈরি করবো যা পিএইচপি কোডে কোনো এরর সংঘটিত হলেই স্বয়ংক্রিয়ভাবে কল হবে।
এই ফাংশনটির কমপক্ষে দুটি প্যারামিটার(যেমন- error_level এবং error_message) হ্যান্ডেল করার সক্ষমতা থাকতে হবে। যাইহোক এটি পাঁচটি পর্যন্ত প্যারামিটার গ্রহন করতে পারে।
সিনট্যাক্স
kt_satt_skill_example_id=310
প্যারামিটার এর ব্যাখ্যা
- error_level - আবশ্যক। error এর লেভেল নির্দেশ করে। এই ভ্যালুটি অবশ্যই একটি নাম্বার হতে হবে।
- error_message - আবশ্যক। error এর জন্য একটি error মেসেজ নির্ধারণ করে।
- error_file - ঐচ্ছিক। error সংঘটিত ফাইলকে নির্দেশ করে।
- error_line - ঐচ্ছিক। error সংঘটিত লাইনকে নির্দেশ করে।
- error_context - ঐচ্ছিক। যখন কোনো error সংগঠিত হয়, তখন সকল ভ্যারিয়েবল এবং তাদের ভ্যালু গুলো ধারন করার জন্য একটি array নির্দিষ্ট করে।
Error এর বিভিন্ন লেভেল
পিএইচপিতে বিভিন্ন টাইপের এরর সংঘটির হয়। নিম্নে error লেভেল এর ভ্যালুসহ বর্ণনা তুলে ধরা হল
| ভ্যালু | কনস্ট্যান্ট | বর্ণনা |
|---|---|---|
| 1 | E_ERROR | Fatal run-time errors. এটা ঐ ধরণের এরর কে নির্দেশ করে যা রিকাভার(recover) করা যায়। যেমন- মেমোরি এলোকেশন। এটি স্ক্রিপ্ট এর এক্সিকিউশন থামিয়ে দেয়। |
| 2 | E_WARNING | Fatal run-time errors। স্ক্রিপ্ট এর এক্সিকিউশন বন্ধ হবে না। |
| 4 | E_PARSE | Compile-time parse errors। এই ধরণের এরর পার্সার কর্তৃক উৎপন্ন হয়। |
| 8 | E_NOTICE | Run-time notices। স্ক্রিপ্টে এমন কিছু কোড থেকে যেখানে সম্ভবত এরর থাকতে পারে। এক্ষেত্রে স্ক্রিপ্টটি স্বাভাবিকভাবেই এক্সিকিউশন হয়। |
| 16 | E_CORE_ERROR | Fatal errors। পিএইচপি শুরু হওয়ার সময়ই এধরণের এরর ঘটে। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি কোর পিএইচপি কর্তৃক উৎপন্ন হয়। |
| 32 | E_CORE_WARNING | Warnings (non-fatal errors)। পিএইচপি শুরু হওয়ার সময়ই এধরণের এরর ঘটে। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি কোর পিএইচপি কর্তৃক উৎপন্ন হয়। |
| 64 | E_COMPILE_ERROR | Fatal compile-time errors। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি জেন্ড ইঞ্জিন কর্তৃক উৎপন্ন হয়। |
| 128 | E_COMPILE_WARNING | Compile-time warnings (non-fatal errors)। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি জেন্ড ইঞ্জিন কর্তৃক উৎপন্ন হয়। |
| 256 | E_USER_ERROR | User-generated error messager। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি পিএইচপি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
| 512 | E_USER_WARNING | User-generated warning message। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
| 1024 | E_USER_NOTICE | User-generated notice message। এটি E_NOTICE এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
| 2048 | E_STRICT | Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code. |
| 8192 | E_DEPRECATED | Run-time notices. এটি Enable করা থাকলে যে সকল কোড পিএইচপির পরবর্তী ভার্সনে সাপোর্ট করবে না তাদের জন্য এমন ম্যাসেজ পাওয়া যায়। |
| 4096 | E_RECOVERABLE_ERROR | Catchable fatal error। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি ব্যবহারকারী কর্তৃক নিয়ন্ত্রণ করা সম্ভব। |
| 16384 | E_USER_DEPRECATED | User-generated warning message। এটি E_DEPRECATED এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
| 32767 | E_ALL | সব ধরণের errors এবং warnings রিটার্ন করে |
Error হ্যান্ডেল এর জন্য ফাংশন তৈরি
পিএইচপি Error হ্যান্ডেল করার জন্য চলুন প্রথমেই একটি ফাংশন তৈরি করে নিই।
kt_satt_skill_example_id=311
উপরের কোডগুলোর সমন্বয়ে আমরা একটি সাধারন error হ্যান্ডেলার ফাংশন(customError) তৈরি করেছি। এই ফাংশনটি কোনোভাবে ট্রিগার/কল হলেই এটি error লেভেল এবং error মেসেজ প্রদান করবে এবং স্ক্রিপ্টট এর সমাপ্তি(terminate) ঘটাবে।
আমাদের প্রথম কাজ error হ্যান্ডেলিং ফাংশন তৈরি করা যা উপরের কোড এর মাধ্যমে সম্পন্ন করলাম। পরবর্তী ধাপে এটি ট্রিগার হওয়ার সময় নির্ধারন করে দিব।
Error হ্যান্ডেলার সেট
পিএইচপির নিজস্ব error হ্যান্ডেলার ফাংশনসমূহই হলো পিএইচপির ডিফল্ট error হ্যান্ডেলার। কিন্তু আমরা উপরের error হ্যান্ডেলার ফাংশনটিকে ডিফল্ট error হ্যান্ডেলার হিসেবে সেট করতে যাচ্ছি।
আপনি চাইলে নির্দিষ্ট কিছু error এ error হ্যান্ডেলার প্রয়োগ করতে পারেন। এই পদ্ধতি অবলম্বন করলে আপনি স্ক্রিপ্ট এর বিভিন্ন error বিভিন্ন উপায়ে হ্যান্ডেল করতে পারবেন।
যাইহোক, নিন্মের উদাহরণে পিএইচপির সকল error এর জন্য আমরা আমাদের কাস্টম error হ্যান্ডেলার ব্যবহার করবোঃ
kt_satt_skill_example_id=314
আমরা যেহেতু সকল ধরণের error হ্যান্ডেল করার জন্য উপরের কাস্টম ফাংশনটি ব্যবহার করতে চাচ্ছি, তাই কাস্টম error এর জন্য set_error_handler() ফাংশনে একটিমাত্র প্যারামিটার এর প্রয়োজন হবে।
এছাড়া আপনি যদি error এর লেভেলও নির্ধারণ করতে চান তাহলে দ্বিতীয় প্যারামিটার ব্যবহার করে error এর লেভেল নির্ধারণ করতে পারবেন।
উদাহরণ
নিম্নের উদাহরণে error হ্যান্ডেলার যাচাই করার জন্য আমরা অস্তিত্বহীন ভ্যারিয়েবলের আউটপুট নেওয়ার চেষ্টা করেছি।
kt_satt_skill_example_id=315
Error ট্রিগার
যেসকল স্ক্রিপ্টের মধ্যে ব্যবহারকারী তথ্য ইনপুট করতে পারে, সেসকল ক্ষেত্রে ব্যবহারকারী কোনো অবৈধ তথ্য ইনপুট করতে চাইলে একটি error ট্রিগার করা খুবই সহায়ক। পিএইচপিতে trigger_error() ফাংশনের মাধ্যমে এটি সম্পাদিত হয়।
উদাহরণ
এই উদাহরণে যদি "test" ভ্যারিয়েবলের ভ্যালু "5" এর চেয়ে বেশি হয় তাহলে একটি error ঘটবেঃ
kt_satt_skill_example_id=316
আপনার ইচ্ছানুযায়ী একটি স্ক্রিপ্টের যেকোনো স্থানেই error ট্রিগার করতে পারেন এবং দ্বিতীয় প্যারামিটার যুক্ত করার মাধ্যমে কোন error লেভেলটি ট্রিগার হবে তাও নির্ধারণ করে দিতে পারেন।
সম্ভাব্য error টাইপসমূহঃ
- E_USER_ERROR - ফ্যাটাল ব্যবহারকারী কর্তৃক রান-টাইম error। এই error থেকে পরবর্তীতে কোন কিছু পুনরুদ্ধার করা সম্ভব নয়। স্ক্রিপ্টের এক্সিকিউশন বন্ধ করে দিবে।
- E_USER_WARNING - নন-ফ্যাটাল ব্যবহারকারী কর্তৃক রান-টাইম সতর্কতা। স্ক্রিপ্টের এক্সিকিউশন বন্ধ করবে না।
- E_USER_NOTICE - ডিফল্ট। ব্যবহারকারী তৈরিকৃত রান-টাইম নোটিশ। স্বাভাবিকভাবে একটি রান করার সময় এমন কিছু খুজে পায় যা একটি error হতে পারে।
উদাহরণ
এই উদাহরণে যদি "test" ভ্যারিয়েবলের ভ্যালু "5" এর চেয়ে বেশি হয় তাহলে E_USER_WARNING error টি ঘটবে। যদি E_USER_WARNING error টি ঘটে সেক্ষেত্রে আমরা আমদের কাস্টম error হ্যান্ডেলারটি ব্যবহার করবো এবং স্ক্রিপ্টটি শেষ করবোঃ
kt_satt_skill_example_id=318
এতোক্ষন আমরা শিখেছি কিভাবে কাস্টম error তৈরি এবং তাদের ট্রিগার করতে হয়, চলুন এখন তাহলে error logging সম্পর্কে জানি।
Error Logging(লগিং)
ডিফল্টভাবে, পিএইচপি সার্ভারের লগিং সিস্টেমে অথবা একটি ফাইলে error log পাঠায়, যাহা php.ini ফাইলের error_log কনফিগারেশনের উপর নির্ভর করে। error_log() ফাংশনটি ব্যবহারের মাধ্যমে আপনি একটি নির্দিষ্ট ফাইলে অথবা নির্দিষ্ট গন্তব্যস্থলে error log পাঠাতে পারেন।
নির্দিষ্ট error সম্পর্কে অবগত হওয়ার জন্য error মেসেজগুলো আপনার ই-মেইলে পাঠানো একটি ভালো উপায়।
ই-মেইলের মাধ্যমে Error মেসেজ
নিচের উদাহরণে একটি নির্দিষ্ট error ঘটলে স্ক্রিপ্টটির শেষে ই-মেইলের মাধ্যমে একটি error মেসেজ পাঠানো হবেঃ
kt_satt_skill_example_id=320
এটি সকল error এর ক্ষেত্রে ব্যবহার করা উচিৎ নয়। রেগুলার error গুলো ডিফল্টভাবে সার্ভারে সংরক্ষন করা উচিত।
প্রোগ্রামে কোনো নির্দিষ্ট error সংঘটিত হলে এক্সিকিউশন(execution)-র স্বাভাবিক ধারাকে পরিবর্তন করার জন্য এক্সেপশন(Exception) ব্যবহার করা হয়।
এক্সেপশন কি
কোড এক্সিকিউশনের সময় কোনো নির্দিষ্ট error বা ব্যতিক্রমধর্মী কন্ডিশনের সৃষ্টি হলে, কোড এক্সিকিউশন(execution)-র স্বাভাবিক ধারাকে পরিবর্তন করার জন্য এক্সেপশন(Exception) ব্যবহার করা হয়। এই কন্ডিশন(conditon)-কে এক্সেপশন বলা হয়।
পিএইচপি ৫ আসার পরে error নিয়ন্ত্রণে নতুন মাত্রা হিসাবে অবজেক্ট ওরিয়েন্টেড পদ্ধতি যোগ হয়েছে।
এক্সেপশনের উৎপত্তি হলে সাধারণত নিচের বিষয়সমূহ সংঘটিত হয়ঃ
- সাম্প্রতিক কোডের ফিল্ড সংরক্ষিত হয়।
- কোডের এক্সিকিউশন বর্তমান অবস্থা থেকে পূর্ব নির্ধারিত বা কাস্টম এক্সেপশন হ্যান্ডেলার ফাংশনের কাছে সুইচ করবে।
- পরিস্থিতির উপর ভিত্তিকরে হ্যান্ডেলার সংরক্ষিত কোডের ফিল্ড থেকে এক্সিকিউশন চালু করতে পারে, স্ক্রিপ্ট এক্সিকিউশন শেষ করে দিতে পারে অথবা ভিন্ন লোকেশন থেকে স্ক্রিপ্ট চলমান রাখতে পারে।
এই অধ্যায়ে নিম্নোক্ত error হ্যান্ডেলিং মেথডসমূহ নিয়ে আলোচনা করবোঃ
- এক্সেপশনের মৌলিক ব্যবহার
- কাস্টম(custom) এক্সেপশন হ্যান্ডেলার তৈরি
- মাল্টিপল(Multiple) এক্সেপশন
- এক্সেপশনকে পুনরায় নিক্ষেপ(Re-throwing) করা
- টপ লেভেলের এক্সেপশন হ্যান্ডেলার সেট করা
বিঃদ্রঃ শুধুমাত্র error কন্ডিশন নিয়ে কাজ করার জন্য এক্সেপশন ব্যবহার করা উচিৎ। কোনো নির্দিষ্ট পয়েন্টে এক স্থান থেকে অন্য স্থানে লাফ দিয়ে যাওয়ার জন্য এটি ব্যবহার করা উচিৎ নয়।
এক্সেপশনের মৌলিক ব্যবহার
যখন কোনো এক্সেপশন নিক্ষিপ্ত হয় তখন এটিতে যে কোড থাকে তা সম্পাদিত(executed) হয় না, এক্ষেত্রে পিএইচপি এর সাথে মিলসম্পন্ন ক্যাচ( "catch") ব্লককে খুঁজে বের করার চেষ্টা করে।
যদি কোনো এক্সেপশন ধরতে না পারে তাহলে Uncaught Exception ম্যাসেজের মাধ্যমে মারাত্মক ভুল(fatal error) প্রেরণ করবে।
এক্সেপশনকে নিক্ষেপ করে না ধরলে কি হয় তা উদাহরণের মাধ্যমে দেখা যাক।
kt_satt_skill_example_id=326
Try, throw এবং catch
আমরা যদি উপরের উদাহরণে error কে এড়িয়ে চলতে চাই তাহলে এক্সেপশন হ্যান্ডেল করার জন্য উপযুক্ত কোড লেখার প্রয়োজন হবে।
উওযুক্ত এক্সেপশন হ্যান্ডেলিং কোডে নিম্নোক্ত বিষয়সমূহ থাকেঃ
- Try - এক্সেপশন ব্যবহার করে এমন ফাংশনকে "try" ব্লকের মধ্যে রাখতে হয়। যদি কোনো এক্সেপশন না থাকে তাহলে স্বাভাবিকভাবেই কোড সম্পাদিত হোয়বে। কিন্তু যদি এক্সেপশন থাকে তাহলে এটি নিক্ষিপ্ত("thrown") হয়।
- Throw - এটির মাধ্যমে এক্সেপশন ছুড়ে ফেলা হয়। মনে রাখতে হবে প্রত্যেকটি থ্রো("throw") ব্লকের জন্য কমপক্ষে একটি ক্যাচ("catch") ব্লক থাকবে। অর্থাৎ কোনো কিছু ছুড়ে ফেলার পরে তা পূনরুদ্ধার করতে হবে অথবা ধরতে হবে।
- ছুড়ে ফেলা এক্সেপশনকে Catch - ক্যাচ("catch") ব্লক পূনরুদ্ধার করে এবং এক্সেপশনের তথ্য সম্বলিত একটি অবজেক্ট তৈরি করে।
চলুন বৈধ্য কোড সম্বলিত এক্সেপশনকে ট্রিগার(trigger) করার চেষ্টা করিঃ
kt_satt_skill_example_id=327
উপরের উদাহরণের ব্যাখ্যাঃ
উপরের কোড এক্সেপশন থ্রো করে এবং ধরেঃ
- প্রথমে checkNumber() ফাংশনের সৃষ্টি হয়। এটি সংখ্যাটি ১ এর চেয়ে বড় কিনা তা চেক করে। যদি বড় হয় তাহলে এক্সেপশন থ্রো হয়।
- "try" ব্লক থেকে checkNumber() ফাংশনকে কল করা হয়।
- checkNumber() ফাংশনের মধ্যে এক্সেপশনকে ছুড়ে ফেলা হয়।
- "catch" ব্লক ছুড়ে ফেলা এক্সেপশনকে তুলে আনে এবং এক্সেপশনের তথ্য নিয়ে একটি অবজেক্ট($obg) তৈরি করে
- এক্সেপশন অবজেক্ট থেকে $obg->getMessage() কে কল করে এক্সেপশন থেকে error ম্যাসেজকে প্রিন্ট করা হয়।
যাইহোক, প্রত্যেক throw এর জন্য একটি catch থাকে এটি টপ লেভেল হ্যান্ডেলার সেট করে error হ্যান্ডেল করার জন্য।
একটি কাস্টম এক্সেপশন ক্লাস তৈরি
একটি কাস্টম এক্সেপশন হ্যান্ডেলার তৈরি করতে আপনাকে অবশ্যই একটি ফাংশন নিয়ে বিশেষ ক্লাস তৈরি করতে হবে আর যখনই পিএইচপিতে এক্সেপশন ঘটবে তখনই ঐ ফাংশনটি ডাকা হবে। ক্লাসটি অবশ্যই এক্সেপশন ক্লাসের এক্সটেনশন(extension) হতে হবে।
কাস্টম এক্সেপশন ক্লাস পিএইচপি এক্সেপশন ক্লাস থেকে প্রোপার্টি সমুহ ইনহেরিট করতে পারে এবং আপনি এটিতে কাস্টম ফাংশন যোগ করতে পারেন।
চলুন একটি এক্সেপশন ক্লাস তৈরি করা যাকঃ
kt_satt_skill_example_id=328
নতুন ক্লাসটি পুরাতন এক্সেপশন ক্লাসের অনুলিপি এর সাথে নতুন করে errorMessage() ফাংশনটি যুক্ত হয়েছে। যেহেতু নতুন ক্লাসটি পুরাতন ক্লাসের অনুলিপি এবং এটি পুরাতন ক্লাসেরই মেথোড এবং প্রোপার্টি সমুহ ইনহেরিট করছে, সুতরাং আমরা এক্সেপশন ক্লাসের মেথোড সমূহ এইভাবে ব্যবহার করতে পারিঃ- getLine(), getFile() এবং getMessage()
উপরের উদাহরণের ব্যাখ্যাঃ
উপরের কোডটি একটি এক্সেপশন throws করছে এবং কাস্টম এক্সেপশন ক্লাস catches করছেঃ
customException()ক্লাসটি পুরানো এক্সেপশন ক্লাসের এক্সটেনশন হিসাবে তৈরি করা হয়। এই পদ্ধতিটি পুরানো এক্সেপশন ক্লাস থেকে সমস্ত মেথোড এবং প্রোপার্টি সমূহ ইনহেরিট করতে সক্ষম।- এই ক্লাসে
errorMessage()ফাংশনটি তৈরি করা হয়েছে। এই ফাংশনটি একটি ত্রুটি মেসেজ ফেরত পাঠায় যদি কোনো ইমেলের ঠিকানা অবৈদ হয়। - যদি ইমেলের ঠিকানাটি ভুল হয় সেক্ষেত্রে $email ভেরিয়েবিলটি স্ট্রিং দ্বারা পূর্ণ করা হয়।
- "try" ব্লকটি কার্যকর হয় এবং ই-মেইলের ঠিকানাটি অবৈদ হওয়ার কারনে একটি এক্সেপশন নিক্ষেপ করা হয়
- "catch" ব্লকটি নিক্ষিপ্ত এক্সেপশনটি ধারন করে এবং ত্রুটি মেসেজটি প্রদর্শন করে।
একাধিক এক্সেপশন(exceptions)
একাধিক শর্ত পরীক্ষা করার জন্য স্ক্রিপ্টে একাধিক এক্সেপশন ব্যবহার করা সম্ভব।
কয়েকটি if..else ব্লক, একটি switch অথবা নেস্ট একাধিক এক্সেপশন ব্যবহার করা সম্ভব। এই সকল এক্সেপশন গুলো বিভিন্ন এক্সেপশন ক্লাস ব্যবহার করতে পারে এবং বিভিন্ন ত্রুটি মেসেজ রিটার্ন করেঃ
kt_satt_skill_example_id=329
উপরের উদাহরণের ব্যাখ্যাঃ
উপরের কোডটি দুইটি শর্ত পরীক্ষা করে এবং যদি একটিও শর্ত সত্যি না হয় সেক্ষেত্রে একটি এক্সেপশন throws করেঃ
customException()ক্লাসটি পুরানো এক্সেপশন ক্লাসের এক্সটেনশন হিসাবে তৈরি করা হয়। এই পদ্ধতিটি পুরানো এক্সেপশন ক্লাস থেকে সমস্ত মেথোড এবং প্রোপার্টি সমূহ ইনহেরিট করতে সক্ষম।- এই ক্লাসে
errorMessage()ফাংশনটি তৈরি করা হয়েছে। এই ফাংশনটি একটি ত্রুটি মেসেজ ফেরত পাঠায় যদি কোনো ইমেলের ঠিকানা অবৈদ হয়। - $email ভ্যারিয়েবলটি একটি বৈধ ই-মেইল ঠিকানা হয় তবে এটি স্ট্রিং আকারে ধারন করে এবং ই-মেইলের ঠিকানায় "example" লিখাটি উল্লেখ রয়েছে।
- "try" ব্লকটি কার্য-সম্পাদন করে কিন্তু প্রথম শর্তটি কোনো এক্সেপশন নিক্ষেপ করে না।
- ই-মেইলের ঠিকানার মধ্যে "example" লিখাটি উল্লেখ থাকায় দ্বিতীয় শর্তটি সত্য হয় এবং একটি এক্সেপশন নিক্ষেপ করে।
- "catch" ব্লকটি নিক্ষিপ্ত এক্সেপশনটি ধারন করে এবং ত্রুটি মেসেজটি প্রদর্শন করে।
যদি এক্সেপশনটি customException ক্লাসের মাধ্যমে নিক্ষেপ করা হতো এবং সেখানে ক্যাচ করার মত কোনো customException থাকতো না, সেক্ষেত্রে শুধুমাত্র বেস এক্সেপশনটি ক্যাচ করতো এবং এই এক্সেপশোনটি সেখানে হ্যান্ডেল করা হতো।
পুনরায় নিক্ষিপ্ত এক্সেপশন
কখনও কখনও, যখন একটি এক্সেপশন নিক্ষিপ্ত হয়, তখন আপনি ইচ্ছা করলে এর চিরাচরিত উপায় ব্যাতিত ভিন্ন উপায়ে এটিকে হ্যান্ডেল করতে পারেন। একটি "catch" ব্লকের মধ্যে একটি এক্সেপশনকে দ্বিতীয়বার নিক্ষেপ করা সম্ভব।
একটি স্ক্রিপ্ট সিস্টেমের ত্রুটি গুলো ব্যবহারকারীর কাছ থেকে লুকিয়ে ফেলে। একজন কোডারের জন্য সিস্টেমের ত্রুটি গুলো অনেক গুরুত্বপুর্ণ হতে পারে, কিন্তু একজন ব্যবহারকারীর কাছে সিস্টেমের ত্রুটি গুলো বিরক্তিকর মনে হতে পারে। সুতরাং, ব্যবহারকারীর জন্য জিনিসগুলো আরো সহজতর করার জন্য এক্সেপশন গুলোকে পুনরায় দ্বিতীয়বার ব্যবহারকারীর উপযুক্ত মেসেজ সহকারে নিক্ষেপ করা হয়ঃ
kt_satt_skill_example_id=330
উপরের উদাহরণের ব্যাখ্যাঃ
উপরের কোডে ই-মেইলের ঠিকানা পরীক্ষা করা হয় এবং যদি ই-মেইলের ঠিকানার মধ্যে "example" লিখাটি উল্লেখ থাকে, সেক্ষেত্রে এক্সেপশনটি আবার পুনরায় নিক্ষেপ করা হয়ঃ
customException()ক্লাসটি পুরানো এক্সেপশন ক্লাসের এক্সটেনশন হিসাবে তৈরি করা হয়। এই পদ্ধতিটি পুরানো এক্সেপশন ক্লাস থেকে সমস্ত মেথোড এবং প্রোপার্টি সমূহ ইনহেরিট করতে সক্ষম।- এই ক্লাসে
errorMessage()ফাংশনটি তৈরি করা হয়েছে। এই ফাংশনটি একটি ত্রুটি মেসেজ ফেরত পাঠায় যদি কোনো ইমেলের ঠিকানা অবৈদ হয়। - $email ভ্যারিয়েবলটি একটি বৈধ ই-মেইল ঠিকানা হয় তবে এটি স্ট্রিং আকারে ধারন করে এবং ই-মেইলের ঠিকানায় "example" লিখাটি উল্লেখ রয়েছে।
- "try" ব্লকটির মধ্যে আরো একটি "try" ব্লক বিদ্যমান থাকে, যেন এক্সেপশনকে পুনরায় নিক্ষেপ করা সম্ভব হয়।
- যখনই ই-মেইলের মধ্যে "example" লিখাটি উল্লেখ থাকবে, তখনই এক্সেপশনটি নিক্ষেপ করা হবে।
- "catch" ব্লকটি একটি এক্সেপশন ধরবে এবং পুনরায় একটি "customException" নিক্ষেপ করবে।
- অন্য একটি "catch" ব্লক "customException" কে ক্যাচ করবে এবং ত্রুটি মেসেজটি প্রদর্শন করবে।
যদি এক্সেপশনটি তার বর্তমান "try" ব্লকে কোনো "catch" খুঁজে না পায়, সেক্ষেত্রে এটি বর্তমান "try" ব্লকে উপরের স্তরে "catch" ব্লক খুঁজে।
উপরের স্তরের এক্সেপশন হ্যান্ডেলার সেট করুন
set_exception_handler() ফাংশনটি ব্যবহারকারী কর্তৃক ডিফাইনকৃত ফাংশন যা, যে সকল এক্সেপশন গুলো ক্যাচ করা হয়না তাদের হ্যান্ডেল করেঃ
kt_satt_skill_example_id=331
উপরের কোডটিতে কোনো "catch" ব্লক নেই। এর পরিবর্তে উপরের স্তরে ফাংশনটি কাজ করা চালু করে, যা ক্যাচ না হওয়া এক্সেপশন গুলো হ্যান্ডেল করে।
এক্সেপশনের জন্য নিয়মাবলী
- সম্ভাব্য এক্সেপশন গুলো ধরতে সাহায্য করার জন্য কোডগুলো "try" ব্লক দ্বারা বেষ্টিত থাকতে পারে।
- প্রতিটি "try" ব্লক অথবা "throw" এর জন্য অবশ্যই একটি "catch" ব্লক থাকে।
- বিভিন্ন ক্লাসের এক্সেপশন গুলো ধরার জন্য একাধিক "catch" ব্লক ব্যবহার করা যেতে পারে।
- "try" ব্লকে একটি "catch" ব্লকের মধ্যে এক্সেপশন গুলো নিক্ষেপ অথবা পুনরায় নিক্ষেপ করা যেতে পারে।
একটি সাধারন নিয়মঃ যদি আপনি কিছু নিক্ষেপ করেন, আপনাকে তা ধরতেই হবে।
Read more