পিএইচপি - ৯ [পিএইচপি ফাইল আপলোড, কুকি, সেশন] - SMH Amiri

সর্বশেষ লিখাসমূহ

পিএইচপি - ৯ [পিএইচপি ফাইল আপলোড, কুকি, সেশন]



পিএইচপি ফাইল আপলোড

"php.ini" ফাইল কনফিগার

প্রথমতঃ এটি নিশ্চিত করুন যে, ফাইল আপলোড করার জন্য "php.ini" ফাইল কনফিগার করা হয়েছে।

ফাইল আপলোড কনফিগার করার জন্য আপনার "php.ini" ফাইলে file_filelocation লিখে সার্চ করে এটিতে On সেট করুনঃ

file_filelocation = On

ফাইল আপলোডের জন্য এইচটিএমএল ফরম তৈরি

দ্বিতীয়তঃ একটি এইচটিএমএল ফরম তৈরি করুন যার মাধ্যমে একজন ইউজার তার পছন্দ মতো ইমেজ আপলোড করতে পারবে।

উদাহরণ
<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<form action="uploadfile.php" method="post" enctype="multipart/form-data">
    আপলোড করার জন্য ছবি সিলেক্ট করুনঃ
    <input type="file" name="fileUpload" id="fileUpload">
    <input type="submit" value="ছবি আপলোড" name="submit">
</form>

</body>
</html>

উপরের এইচটিএমএল ফরমের জন্য কিছু করনীয় বিষয়ঃ

  • ফরম সাবমিট এর সময় method="post" এর ব্যবহার নিশ্চিত করুন।
  • এছাড়া ফরমের মধ্যে enctype="multipart/form-data" এট্রিবিউটটি ব্যবহার করতে হবে। এই এট্রিবিউট এর মাধ্যমে ফরম সাবমিট এর সময় কন্টেন্ট এর টাইপ নির্ধারণ করা হয়।

উপরোক্ত শর্তসমুহ না মানলে ফাইল আপলোড কাজ করবে না।

ইনপুট এলিমেন্টে type="file" এট্রিবিউটটি ব্যবহারের মাধ্যমে ব্রাউজারে একটি বাটন তৈরি হবে যার মাধ্যমে ফাইল সিলেক্ট করা যাবে।

উপরের ফরমটি প্রসেস করার জন্য method="post" এর সাহায্যে "uploadfile.php" ফাইলের কাছে পাঠানো হয়।

আপনার বুঝার সুবিধার্থে নিম্নে "uploadfile.php" ফাইলের কোডসমূহ ধাপে ধাপে দেখানো হয়েছে এবং পরিশেষে সম্পূর্ণ কোড একসাথে লেখা হয়েছে।


ফাইল আপলোডের পিএইচপি স্ক্রিপ্ট

ফাইল আপলোড করার কোডগুলো "uploadfile.php" ফাইলে থাকেঃ

<?php
$target_directory = "filelocation/";
$target_file = $target_directory . basename($_FILES["fileUpload"]["name"]);
$fileuploadDone = 1;
$fileExtension = pathinfo($target_file,PATHINFO_EXTENSION);
// ইমেজ ফাইলটি আসল না ফেক  চেক করে
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileUpload"]["tmp_name"]);
   if($check !== false) {
        echo	"ফাইলটি ইমেজ - " . $check["mime"] . ".";
        $fileuploadDone = 1;
    } else {
       	echo "ফাইলটি ইমেজ নয়।";
       	$fileuploadDone = 0;
    }
}
?>

পিএইচপি স্ক্রিপ্টের ব্যাখ্যাঃ

  • $target_directory = "filelocation/" - ফাইলটি যে ডিরেক্টরিতে গিয়ে জমা হবে সেটি নির্ধারণ করে।
  • $target_file - যে ফাইলটি আপলোড হবে সেটির path নির্দিষ্ট করে।
  • $fileuploadDone = 1 - ফাইল আপলোড এর স্ট্যাটাস নির্দেশ করে।
  • $fileExtension - ফাইলের এক্সটেনশন ধারন করে।
  •  ইমেজ ফাইলটি আসল ইমেজ নাকি ফেক ইমেজ পরবর্তীতে চেক করা হবে।

নোটঃ যে ডিরেক্টরিতে "uploadfile.php" ফাইলটি রয়েছে, আপনাকে সেখানে "filelocation" নামে নতুন একটি ডিরেক্টরি তৈরি করতে হবে। আপলোডকৃত ফাইলগুলো এই ডিরেক্টরিতে সংরক্ষণ হবে।


ফাইল পূর্ব থেকেই আছে কিনা চেক করা

এখন আমরা অনেকগুলো সীমাবদ্ধতা যুক্ত করতে পারি।

প্রথমতঃ আমরা যে ফাইলটি আপলোড করবো সেই ফাইলটি "filelocation" ফোল্ডারের মধ্যে আছে কিনা চেক করে নিব। যদি পূর্ব থেকেই ফাইল আপলোড করা থাকে তাহলে একটি error মেসেজ প্রদর্শিত হবে এবং $fileuploadDone এ 0 সেট হবেঃ

// ফাইলটি পূর্ব থেকে আছে কিনা  চেক
if (file_exists($target_file)) {
    echo "দুঃখিত, ফাইলটি পূর্ব থেকেই আপলোড রয়েছে।";
    $fileuploadDone = 0;
}

ফাইলের সাইজ লিমিটেশন

আমাদের এইচটিএমএল ফরমের ফাইল ইনপুট ফিল্ডের নাম দেওয়া হয়েছে "fileUpload"।

এখন আমরা ফাইলের সাইজ চেক করবো। ফাইলটি যদি 300kb এর চেয়ে বড় হয় তাহলে একটি error মেসেজ প্রদর্শিত হবে এবং $fileuploadDone এ 0 সেট হবেঃ

 // ফাইল এর সাইজ চেক
if ($_FILES["fileUpload"]["size"] > 300000) {
    echo "দুঃখিত, আপনার ফাইলটি অনেক বড় আকারের।";
    $fileuploadDone = 0;
} 

ফাইলের টাইপ লিমিটেশন

নিচের কোডগুলো একজন ইউজারকে শুধুমাত্র JPG, JPEG, PNG এবং GIF ফাইল আপলোড করার অনুমতি দিবে। এগুলো ব্যতীত অন্য টাইপের ফাইল আপলোড করলে $fileuploadDone এ 0 সেট হওয়ার পূর্বেই একটি error মেসেজ প্রদর্শিত হবেঃ

// কয়েকটি নির্দিষ্ট টাইপের ফাইল আপলোডের অনুমতি
if($fileExtension != "jpg" && $fileExtension!= "png" && $fileExtension != "jpeg" && $fileExtension != "gif" ) {
    echo "দুঃখিত, শুধুমাত্র JPG, JPEG, PNG এবং GIF ফাইল আপলোড করা যাবে।";
    $fileuploadDone = 0;
}

সম্পূর্ণ পিএইচপি ফাইল আপলোড স্ক্রিপ্ট

নিম্নে সম্পূর্ণ "uploadfile.php" ফাইল এর কোড দেওয়া হলোঃ

<?php
$target_directory = "filelocation/";
$target_file = $target_directory . basename($_FILES["fileUpload"]["name"]);
$fileuploadDone = 1;
$fileExtension = pathinfo($target_file,PATHINFO_EXTENSION);
// ফাইলটি ছবি কিনা তা চেক করে
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileUpload"]["tmp_name"]);
    if($check !== false) {
        echo	"ফাইলটি ইমেজ - " . $check["mime"] . ".";
        $fileuploadDone = 1;
    } else {
        echo "ফাইলটি ইমেজ নয়।";
        $fileuploadDone = 0;
    }
}
// ফাইলটি ইতিমধ্যে বিদ্যমান কিনা তা চেক করে
if (file_exists($target_file)) {
    echo "দুঃখিত, ফাইলটি পূর্ব থেকেই আপলোড রয়েছে।";
    $fileuploadDone = 0;
}
// ফাইলের সাইজ চেক
if ($_FILES["fileUpload"]["size"] > 500000) {
    echo "দুঃখিত, আপনার ফাইলটি অনেক বড় আকারের।";
    $fileuploadDone = 0;
}
// কয়েকটি নির্দিষ্ট টাইপের ফাইল আপলোডের অনুমতি
if($fileExtension != "jpg" && $fileExtension != "png" && $fileExtension != "jpeg"
&& $fileExtension != "gif" ) {
    echo "দুঃখিত, শুধুমাত্র JPG, JPEG, PNG এবং GIF ফাইল আপলোড করা যাবে।";
    $fileuploadDone = 0;
}
// $fileuploadDone কি error এর কারনে 0 তে সেট হয়েছে কিনা তা চেক
if ($fileuploadDone == 0) {
    echo "দুঃখিত, আপনার ফাইলটি আপলোড হয়নি।";
// যদি সবকিছু ঠিক থাকে, তাহলে ফাইল আপলোড করা।
} else {
    if (move_uploaded_file($_FILES["fileUpload"]["tmp_name"], $target_file)) {
        echo " ". basename( $_FILES["fileUpload"]["name"]). " ফাইলটি আপলোড হয়েছে। ";
    } else {
        echo "দুঃখিত, আপনার ফাইলটি আপলোডে সমস্যা হচ্ছে।";
    }
}
?> 




কুকি কি?

কুকি হলো একটি ছোট্ট ফাইল। সার্ভার এই ফাইলকে ইউজারের  কম্পিউটারে সংস্থাপন(embed) করে রাখে। প্রত্যেকবার ঐ একই কম্পিউটার থেকে ব্রাউজার এর মাধ্যমে যখন সার্ভারে একটি পেজের জন্য রিকুয়েস্ট পাঠানো হয় তখন ঐ কম্পিউটার থেকে পেজ রিকুয়েস্টের পাশাপাশি কুকিটিও সেন্ড হয়।

পিএইচপির সাহায্যে আপনি কুকি ভ্যালু তৈরি করতে পারবেন এবং উদ্ধারও করতে পারবেন।


পিএইচপির সাহয্যে কুকি তৈরি

setcookie() ফাংশনের মাধ্যমে কুকি তৈরি করা হয়।

সিনট্যাক্স

setcookie(name, value, expire, path, domain, secure, httponly);

শুধুমাত্র name প্যারামিটারটি আবশ্যক। অন্যান্য সকল প্যারামিটারগুলো হলো ঐচ্ছিক।


পিএইচপি কুকি তৈরি/উদ্ধার

নিম্নের উদাহরনে পিএইচপি কুকি তৈরি করে দেখানো হলোঃ

উদাহরণ
<?php
//কুকি ভ্যারিয়েবল তৈরি
$cookieName = "user";
//কুকি ভ্যালু সেট 
$cookieValue = "তামজিদ হাসান";
setcookie($cookieName, $cookieValue, time() + (86400 * 30), "/");
// ৮৬৪০০ সেকেন্ডে = ১ দিন
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
// কুকি সেট করা হয়েছে কিনা চেক করা
if(!isset($_COOKIE[$cookieName])) {
    echo " '" . $cookieName . "' কুকিটি সেট করা হয়নি!";
} else {
    echo " '" . $cookieName . "' কুকিটি সেট করা হয়েছে!<br>";
    echo "কুকি ভ্যালুঃ " . $_COOKIE[$cookieValue];
}
?>

</body>
</html>

ফলাফল

উদাহরণের ব্যাখ্যা

  • উপরের উদাহরণে "তামজীদ হাসান" ভ্যালুযুক্ত একটি কুকি তৈরি করা হয়েছে এবং যার নাম দেওয়া হয়েছে "user"।
  •  ৩০ দিন(৮৬৪০০ * ৩০) পরে কুকিটির মেয়াদর্ত্তীন্ন(expire) হবে। "/" মানে হলো কুকিটি সমগ্র ওয়েবসাইট জুড়েই বিদ্যমান থাকবে। এছাড়া আপনি আপনার প্রয়োজন মতো ডিরেক্টরি সেট করে নিতে পারবেন।
  • isset() ফাংশন ব্যবহার করে কুকি সেট করা হয়েছে কিনা চেক করা হয়।
  • কুকি সেট করা হলে আমরা গ্লোবাল ভ্যারিয়েবল $_COOKIE এর মাধ্যমে "user" কুকির ভ্যালু উদ্ধার করবো।

নোটঃ setcookie() ফাংশনটি অবশ্যই <html> ট্যাগ এর উপরে(আগে) ব্যবহার করতে হবে।

নোটঃ যখন কুকি পাঠানো হয় তখন ভ্যালু স্বয়ংক্রিয়ভাবে URL encoded হয় এবং যখন গ্রহণ করা হয় তখন স্বয়ংক্রিয়ভাবে decoded হবে।

URL encoding প্রতিরোধ করার জন্য setrawcookie() ফাংশনটি ব্যবহার করুন।


কুকি ভ্যালু পরিবর্তন করা

একটি কুকির ভ্যালু পরিবর্তন(modify) করার জন্য setcookie() ফাংশন ব্যবহার করে পূনরায় কুকিটিকে সেট করতে হয়।

উদাহরণ
<?php
$cookieName = "user";
$cookieValue = "তামজীদ হাসান";
setcookie($cookieName, $cookieValue, time() + (86400 * 30), "/");
// ৮৬৪০০ সেকেন্ডে = ১ দিন
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
if(!isset($_COOKIE[$cookieName])) {
    echo " '" . $cookieName . "' কুকিটি সেট করা হয়নি!";
} else {
    echo " '" . $cookieName . "' কুকিটি সেট করা হয়েছে!<br>";
    echo "কুকি ভ্যালুঃ " . $_COOKIE[$cookieValue];
}
?>

</body>
</html>

ফলাফল

কুকি ডিলেট করা

কুকি ডিলেট করার জন্য setcookie() ফাংশন এর expire প্যারামিটারে মেয়াদ উত্তীর্ণ তারিখ ব্যবহার করুনঃ

উদাহরণ
?php
// মেয়াদ উত্তীর্ণের তারিখ ১ঘন্টা আগে সেট করা হয়েছে।
setcookie("user", "", time() - 3600);
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
 echo "'user' কুকিটি ডিলেট হয়েছে।";
?>

</body>
</html>

ফলাফল

কুকি সক্রিয় আছে কিনা চেক করা

নিচের উদাহরণে একটি ছোট php স্ক্রিপ্ট তৈরি করা হয়েছে যা কুকি সক্রিয়(Enable) আছে কিনা চেক করবে।

প্রোগ্রামের প্রথমেই setcookie() ফাংশন ব্যবহার করে একটি কুকি তৈরি করে নেওয়া হয়েছে এবং তারপরে count() ফাংশনের মধ্যে $_COOKIE অ্যারে ভ্যারিয়েবলকে প্যারামিটার হিসাবে ব্যবহার করে কুকি সক্রিয় আছে কিনা চেক করা হয়েছে।

উদাহরণ
<?php
	setcookie("testCookie", "test", time() + 3600, '/');
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি উদাহরণ</title>
</head>
<body>

<?php
if(count($_COOKIE) > 0) {
    echo "কুকি enable রয়েছে।";
} else {
    echo "কুকি disable রয়েছে।";
}
?>

</body>
</html>

ফলাফল



পিএইচপি সেশন কি?

আপনি যখন একটি এপ্লিকেশন দিয়ে আপনার প্রয়োজনীয় কাজ করতে চান তখন প্রথমেই এটিকে চালু করেন, তারপর এর মধ্যে কিছু কাজ করেন, পরিশেষে এটিকে বন্ধ করে দেন। সেশন অনেকটা এই রকমই।

আপনার কম্পিউটার জানে আপনি কে। এটি এও জানে আপনি কখন এপ্লিকেশনটি চালু করেছেন এবং কখন বন্ধ করেছেন। কিন্তু অনলাইনের সমস্যা হলো ওয়েব সার্ভার জানে না আপনি কে অথবা আপনি কি করতে চান। কারন HTTP এড্রেস এ ব্যবহারকারী(user) সম্পর্কিত কোনো তথ্য থাকে না।

সেশন ভ্যারিয়েবল ব্যবহারকারীর username, name, password ইত্যাদি তথ্য সংরক্ষন করে রাখে যা একাধিক পেজে ব্যবহার করা যায়। একজন ব্যবহারকারী ব্রাউজার বন্ধ করার আগ পর্যন্ত সেশন ভ্যারিয়েবল ডিফল্টভাবে সংশ্লিষ্ট তথ্য সংরক্ষন করে রাখে।

সুতরাং সেশন ভ্যারিয়েবল একজন ব্যবহারকারীর তথ্য সংরক্ষন করে রাখে যা শুধুমাত্র ঐ এপ্লিকেশনে অবস্থিত সকল পেজে ব্যবহার করা যায়।

বিঃদ্রঃ আপনি যদি তথ্যসমূহ স্থায়ীভাবে সংরক্ষন করতে চান তাহলে ডাটাবেসে সংরক্ষন করুন।


পিএইচপি সেশন কিভাবে শুরু হয়?

session_start() ফাংশনের মাধ্যমে একটি সেশন শুরু হয়।

পিএইচপি সুপার গ্লোবাল ভ্যারিয়েবল $_SESSION দ্বারা সেশন ভ্যারিয়েবল গুলোকে সেট করতে হয়।

চলুন "test_session1.php" নামে একটি নতুন পেজ তৈরি করি। এই পেজে আমরা একটি নতুন পিএইচপি সেশন শুরু করবো এবং কিছু সেশন ভেবিয়েবল সেট করবোঃ

উদাহরণ: test_session1.php ফাইল
<?php
 // সেশন শুরু
 session_start();
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি সেশন উদাহরণ </title>
</head>
<body>

<?php
 // সেশন ভ্যারিয়েবল সেট
 $_SESSION["userName"] = "tamim";
 $_SESSION["pass"] = "2017";
 echo "সেশন ভ্যরিয়েবল সেট করা হয়েছে।";
?>

</body>
</html>

ফলাফল

বিঃদ্রঃ মনে রাখবেন, session_start() ফাংশনটি ডকুমেন্টের প্রথম লাইনে লিখতে হবে।


কিভাবে পিএইচপি সেশন ভ্যারিয়েবলের মান পাবেন?

এখন আমরা "test_session2.php" নামে আরেকটি পেজ তৈরি করবো। এই পেজ থেকে আমরা সেশনের তথ্যসমূহ এক্সেস করবো যা আমরা প্রথমে "test_session1.php" পেজে সেট করেছিলাম।

একটু লক্ষ্য করলে আপনি দেখবেন, সেশন ভেরিয়েবলগুলো প্রতিটি নতুন পৃষ্ঠায় স্বতন্ত্রভাবে অতিক্রম হচ্ছে না, এই জন্য আপনাকে প্রতিটি পেজের প্রথমেই session_start() ফাংশনটি শুরু করতে হবে।

লক্ষ্য করলে আপনি আরও দেখবেন যে, প্রতিটি সেশন ভ্যারিয়েবলের মান সুপার গ্লোবাল ভ্যারিয়েবল $_SESSION এর মধ্যে সংরক্ষিত হয়ঃ

উদাহরণঃ test_session2.php ফাইল
<?php
    //সেশন শুরু
	session_start();
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি সেশন উদাহরণ</title>
</head>
<body>

<?php
// আমরা এখন পূর্বে সেটকৃত সেশন ভ্যারিয়েবল এর আউটপুট নিব
echo " ব্যবহারকারীর নামঃ " . $_SESSION["userName"] . "। <br>";
echo " এবং পাসওয়ার্ডঃ " . $_SESSION["pass"] . "।";
?>

</body>
</html>

ফলাফল

একজন ব্যবহারকারীর সবগুলো সেশন ভ্যারিয়েবলের মান দেখার জন্য আপনি print_r($_SESSION); ফাংশন ব্যবহার করতে পারেন।

উদাহরণ
<?php
	session_start();
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি সেশন উদাহরণ</title>
</head>
<body>

<?php
 print_r($_SESSION);
?>

</body>
</html>

ফলাফল

সেশন কিভাবে কাজ করে এবং কীভাবে জানতে পারে যে এটাই আপনি?

বেশীরভাগ সেশনই ইউজার কম্পিউটারে ইউজার এর একটি কী(key) সেট করে যা দেখতে কিছুটা 61n3ika5vtee9ro9lb04rqngf6 এর মত। তারপরে যখন অন্য একটি পেজে সেশনটি ওপেন করা হয়, তখন এটি ইউজার কী এর জন্য কম্পিউটারটিকে স্ক্যান করে। এটি যদি পূর্বের কোনো সেশনের সাথে মিল খুঁজে পায় তাহলে সেটিকে অ্যাক্সেস করে।
আর যদি কোনো মিল খুঁজে না পায় তাহলে একটি নতুন একটি সেশন তৈরি করে।


পিএইচপি সেশন ভ্যারিয়েবল কিভাবে পরিবর্তন করা হয়?

ওভাররাইট(overwrite) করার মাধ্যমে আপনি সেশন ভ্যারিয়েবল পরিবর্তন করতে পারবেনঃ

উদাহরণ
<?php
	session_start();
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি সেশন উদাহরণ</title>
</head>
<body>

<?php
// সেশন ভ্যারিয়েবল ওভার রাইট
$_SESSION["userName"] = "tahmid";
print_r($_SESSION);
?>

</body>
</html>

ফলাফল

পিএইচপি সেশন বাতিল করা

সকল গ্লোবাল সেশন ভ্যারিয়েবলগুলো রিমুভ এবং বাতিল করতে যথাক্রমে session_unset() এবং session_destroy() ফাংশন ব্যবহার করতে হবেঃ

উদাহরণ
<?php
	session_start();
?>

<!DOCTYPE html>
<html>
<head>
 <title>পিএইচপি সেশন উদাহরণ</title>
</head>
<body>

<?php
// সেশনের সকল ভ্যারিয়েবলকে রিমুভ করবে
session_unset();
// সেশন বাতিল করবে
session_destroy();

echo "সকল সেশন ভ্যারিয়েবল রিমুভ এবং  বাতিল হয়েছে";
?>

</body>
</html>

ফলাফল

উপরের উদাহরনে session_unset() এবং session_destroy() ফাংশন ব্যবহার করার ফলে সবগুলো সেশন ভ্যারিয়েবল মুছে গেছে, তাই কোড রান করালে ফলাফল হিসাবে কিছুই দেখাবে না।