PHP প্রসেসিং ফর্ম (Processing Forms) PHP পোস্ট-রিডাইরেক্ট-গেট (Post-Redirect-Get (PRG) ) Estimated reading: 4 minutes 13 views Contributors সারাংশ: এই টিউটোরিয়ালে, আপনি শিখবেন কিভাবে PHP PRG (পোস্ট-রিডাইরেক্ট-গেট) কৌশলটি ব্যবহার করতে হয় যাতে ডবল ফর্ম জমা দেওয়ার সমস্যা প্রতিরোধ করা যায়। ডবল সাবমিট সমস্যাএকটি ফর্মের মাধ্যমে সার্ভারে ডেটা পরিবর্তন করতে, আপনি প্রায়শই পোস্ট পদ্ধতি ব্যবহার করেন। যখন একটি ফর্ম জমা দেওয়া হয়, আপনি ডেটা যাচাই করেন, ডাটাবেস আপডেট করেন এবং আউটপুট প্রদর্শন করেন।যাইহোক, যদি আপনি ফর্মটি জমা দেওয়ার পরে ব্রাউজারের রিফ্রেশ (বা পুনরায় লোড) বোতামে ক্লিক করেন, ব্রাউজারটি আবার ফর্মটি জমা দেবে।যেহেতু ফর্মটি POST পদ্ধতি ব্যবহার করে, ব্রাউজারটি এইরকম নিশ্চিতকরণের জন্য অনুরোধ করবে:আপনি যদি চালিয়ে যান বোতামটি ক্লিক করেন, ব্রাউজারটি আসলে দ্বিতীয়বার ফর্মটি জমা দেবে। এটি একটি কুখ্যাত ডবল জমা সমস্যা যা অনেক সমস্যার কারণ হতে পারে।উদাহরণস্বরূপ, আপনার ডাটাবেসে ডুপ্লিকেট রেকর্ড থাকতে পারে। যদি ফর্মটি অর্থপ্রদান প্রক্রিয়া করে তবে এটি গ্রাহককে দ্বিগুণ চার্জ করবে।নিম্নলিখিত চিত্রটি ডবল জমা দেওয়ার সমস্যাটি চিত্রিত করে:PHP পোস্ট-রিডাইরেক্ট-গেট কৌশলের ভূমিকাপিআরজি (পোস্ট-রিডাইরেক্ট-গেট) কৌশল আপনাকে ডবল জমা দেওয়ার সমস্যা সমাধান করতে সাহায্য করে। পোস্ট-রিডাইরেক্ট-গেট নিম্নরূপ কাজ করে:প্রথমে, HTTP POST পদ্ধতি ব্যবহার করে ফর্মটি জমা দেওয়া হয়। দ্বিতীয়ত, সার্ভার কিছু করে, যেমন, ডাটাবেস আপডেট করে, একটি অর্থপ্রদান প্রক্রিয়া করে, একটি ইমেল পাঠায় এবং ব্রাউজারটিকে ফলাফল পৃষ্ঠায় পুনঃনির্দেশ করে। তৃতীয়ত, ব্রাউজারটি HTTP GET পদ্ধতি ব্যবহার করে ফলাফল পৃষ্ঠায় দ্বিতীয় অনুরোধ করে। অবশেষে, সার্ভার ফলাফল পৃষ্ঠাটি ফেরত দেয় এবং ব্রাউজার এটি প্রদর্শন করে।ব্যবহারকারী ওয়েব ব্রাউজার রিফ্রেশ করলে, ব্রাউজার HTTP GET পদ্ধতি ব্যবহার করে ফলাফল পৃষ্ঠার অনুরোধ করবে।উল্লেখ্য যে ফলাফলের পৃষ্ঠা এবং যে পৃষ্ঠাটিতে ফর্ম রয়েছে তা একই হতে পারে।নিম্নলিখিত চিত্রটি PRG কীভাবে কাজ করে তা ব্যাখ্যা করে:ডবল সাবমিট সমস্যা চিত্রিতআমরা একটি সাধারণ দান ফর্ম তৈরি করব যা দ্বিগুণ জমা দেওয়ার সমস্যাকে চিত্রিত করে:<?php const MIN_DONATION = 1; $errors = []; $inputs = []; $valid = false; if ($_SERVER['REQUEST_METHOD'] === 'POST') { // sanitize & validate amount $amount = filter_input(INPUT_POST, 'amount', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $inputs['amount'] = $amount; if ($amount !== false && $amount !== null) { $amount = filter_var($amount, FILTER_VALIDATE_FLOAT, ['options' => ['min_range' => MIN_DONATION]]); if ($amount === false) { $errors['amount'] = 'The minimum donation is $1'; } else { $valid = true; } } else { $errors['amount'] = 'Please enter a donation amount'; } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="css/style.css"> <title>PHP - without PRG</title> </head> <body> <main> <form action="index.php" method="post"> <h1>Donation</h1> <?php if ($valid) : ?> <div class="alert alert-success"> Thank you for your donation of $<?= $inputs['amount'] ?? '' ?> </div> <?php endif ?> <div> <label for="amount">Amount:</label> <input type="text" name="amount" value="<?= $inputs['amount'] ?? '' ?>" id="amount" placeholder="Minimum donation $<?= MIN_DONATION ?>"> <small><?= $errors['amount'] ?? '' ?></small> </div> <button type="submit">Donate</button> </form> </main> </body> </html>কিভাবে এটা কাজ করে. ফর্মটিতে একটি ইনপুট ক্ষেত্র রয়েছে যা 1-এর বেশি মান সহ একটি ধনাত্মক পরিমাণ গ্রহণ করে৷ MIN_DONATION ধ্রুবকটি পরিমাণ ক্ষেত্রের সর্বনিম্ন মান নির্দিষ্ট করে:const MIN_DONATION = 1;যখন পোস্ট পদ্ধতি ব্যবহার করে ফর্মটি জমা দেওয়া হয়, তখন আমরা filter_input() এবং filter_var() ফাংশন ব্যবহার করে পরিমাণ স্যানিটাইজ করি এবং যাচাই করি। নিম্নলিখিতগুলি INPUT_POST থেকে পরিমাণের মানকে স্যানিটাইজ করে:$amount = filter_input(INPUT_POST, 'amount', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); লক্ষ্য করুন যে আপনি যদি FILTER_FLAG_ALLOW_FRACTION পতাকা নির্দিষ্ট না করেন তবে ফাংশনটি প্রবেশ করা মান থেকে দশমিক বিন্দু (.) সরিয়ে দেবে।যদি পরিমাণটি INPUT_POST-এ উপস্থিত না থাকে, filter_input() শূন্য প্রদান করে। যদি পরিমাণটি একটি বৈধ ফ্লোট না হয়, filter_input() ফাংশন মিথ্যা প্রদান করে। নিম্নলিখিতটি চেক করে যে পরিমাণটি বৈধ ফ্লোট এবং 1 এর চেয়ে বেশি বা সমান:$amount = filter_var($amount, FILTER_VALIDATE_FLOAT, ['options' => ['min_range' => MIN_DONATION]]);যদি পরিমাণটি বৈধ হয়, আমরা $valid ভেরিয়েবলটিকে সত্যে সেট করি। অন্যথায়, আমরা $errors অ্যারেতে ত্রুটি বার্তা যোগ করি। এছাড়াও, আমরা $inputs অ্যারেতে ফিল্টার করা মান যোগ করি।if ($_SERVER['REQUEST_METHOD'] === 'POST') { // sanitize & validate amount $amount = filter_input(INPUT_POST, 'amount', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $inputs['amount'] = $amount; if ($amount !== false && $amount !== null) { $amount = filter_var($amount, FILTER_VALIDATE_FLOAT, ['options' => ['min_range' => MIN_DONATION]]); if ($amount === false) { $errors['amount'] = 'The minimum donation is $1'; } else { $valid = true; } } else { $errors['amount'] = 'Please enter a donation amount'; } }আকারে, পরিমাণ ক্ষেত্রটি বৈধ হলে আমরা একটি সাফল্যের বার্তা দেখাই। অন্যথায়, আমরা একটি ত্রুটি বার্তা সহ প্রবেশ করা মান দেখাই।<form action="index.php" method="post"> <h1>Donation</h1> <?php if ($valid) : ?> <div class="alert alert-success"> Thank you for your donation of $<?= $inputs['amount'] ?? '' ?> </div> <?php endif ?> <div> <label for="amount">Amount:</label> <input type="text" name="amount" value="<?= $inputs['amount'] ?? '' ?>" id="amount" placeholder="Minimum donation $<?= MIN_DONATION ?>"> <small><?= $errors['amount'] ?? '' ?></small> </div> <button type="submit">Donate</button> </form>ডবল জমা দেওয়ার সমস্যা দেখাতে, আপনি একটি বৈধ মান লিখতে পারেন এবং দান বোতামে ক্লিক করতে পারেন। একবার আপনি সফলতার বার্তাটি দেখতে পেলে, আপনি ওয়েব ব্রাউজারে রিফ্রেশ বোতামে ক্লিক করতে পারেন।PRG কৌশল ব্যবহার করে ডবল ফর্ম জমা দেওয়ার সমস্যা সমাধান করুনডবল সাবমিট সমস্যা সমাধানের জন্য পিআরজি কৌশলটি কীভাবে ব্যবহার করতে হয় তা নিম্নলিখিতটি ব্যাখ্যা করে:<?php session_start(); const MIN_DONATION = 1; $errors = []; $inputs = []; $valid = false; $request_method = strtoupper($_SERVER['REQUEST_METHOD']); if ($request_method === 'POST') { // sanitize & validate amount $amount = filter_input(INPUT_POST, 'amount', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $inputs['amount'] = $amount; if ($amount !== false && $amount !== null) { $amount = filter_var($amount, FILTER_VALIDATE_FLOAT, ['options' => ['min_range' => MIN_DONATION]]); if ($amount === false) { $errors['amount'] = 'The minimum donation is $1'; } else { $valid = true; } } else { $errors['amount'] = 'Please enter a donation amount'; } // process the payment // ... // place variables to sessions $_SESSION['valid'] = $valid; $_SESSION['errors'] = $errors; $_SESSION['inputs'] = $inputs; // redirect to the page itself header('Location: index2.php', true, 303); exit; } elseif ($request_method === 'GET') { if (isset($_SESSION['valid'])) { // get the valid state from the session $valid = $_SESSION['valid']; unset($_SESSION['valid']); } if (isset($_SESSION['errors'])) { $errors = $_SESSION['errors']; unset($_SESSION['errors']); } if (isset($_SESSION['inputs'])) { $errors = $_SESSION['inputs']; unset($_SESSION['inputs']); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="css/style.css"> <title>PHP PRG</title> </head> <body> <main> <?php if ($valid) : ?> <div class="alert alert-success"> Thank you for your donation of $<?= $inputs['amount'] ?? '' ?> </div> <?php endif ?> <form action="index.php" method="post"> <h1>Donation</h1> <div> <label for="amount">Amount:</label> <input type="text" name="amount" value="<?= $inputs['amount'] ?? '' ?>" id="amount" placeholder="Minimum donation $<?= MIN_DONATION ?>"> <small><?= $errors['amount'] ?? '' ?></small> </div> <button type="submit">Donate</button> </form> </main> </body> </html>কিভাবে এটা কাজ করে. প্রথমে, $_SESSION ডেটা অ্যাক্সেস করতে session_start() এ কল করুন:session_start();দ্বিতীয়ত, আগের উদাহরণের মতো পরিমাণ স্যানিটাইজ করুন এবং যাচাই করুন; এছাড়াও, পরবর্তী অনুরোধে সেগুলি অ্যাক্সেস করতে সক্ষম হওয়ার জন্য সেশনে ভেরিয়েবল $valid, $errors এবং $inputs যোগ করুন।// add variables to session $_SESSION['valid'] = $valid; $_SESSION['errors'] = $errors; $_SESSION['inputs'] = $inputs;তৃতীয়ত, হেডার() ফাংশন ব্যবহার করে HTTP স্ট্যাটাস কোড 303 সহ ব্রাউজারটিকে একই পৃষ্ঠায় পুনঃনির্দেশ করুন:// redirect to the page itself header('Location: index.php', true, 303); exit;চতুর্থত, সেশন থেকে ভেরিয়েবলগুলি পান যদি HTTP অনুরোধ পদ্ধতিটি GET হয় এবং সেগুলিকে অবিলম্বে সেশন থেকে সরিয়ে দিন:if (isset($_SESSION['valid'])) { $valid = $_SESSION['valid']; unset($_SESSION['valid']); } if (isset($_SESSION['errors'])) { $errors = $_SESSION['errors']; unset($_SESSION['errors']); } if (isset($_SESSION['inputs'])) { $errors = $_SESSION['inputs']; unset($_SESSION['inputs']); }অবশিষ্ট কোড পূর্ববর্তী উদাহরণ হিসাবে একই. আপনি ফর্ম জমা দেওয়ার পরে রিফ্রেশ বোতামে ক্লিক করলে, ব্রাউজার আর ফর্ম জমা দেবে না। পরিবর্তে, ব্রাউজার GET পদ্ধতি ব্যবহার করে ফর্ম লোড করে।সারসংক্ষেপPRG মানে পোস্ট-রিডাইরেক্ট-গেট। PRG ডবল ফর্ম জমা সমস্যা প্রতিরোধ করতে সাহায্য করে. PHP প্রসেসিং ফর্ম (Processing Forms) - Previous PHP ফ্ল্যাশ বার্তা (Flash messages) Next - PHP প্রসেসিং ফর্ম (Processing Forms) PHP ফাইল আপলোড (File Upload)