در حال بارگزاری ...

آموزش پردازش فرم‌های HTML با PHP

php
توسط سميه شفيعي
آخرین به روز رسانی یکشنبه 04 آبان 1399

کار با فرم‌ها هنگام ساخت وب سایت بسیار ساده به نظر می‌رسد ولی در حقیقت جزئیات زیادی وجود دارد که باید از آ‌نها آگاه باشید. در این قسمت ار آموزش در لیداوب به بررسی چگونگی پردازش داده‌های جمع آوری شده از فرم می‌پردازیم.

 پردازش فرم‌های HTML با PHP

 لینک‌ها و URLها، داده‌ها را از طریق GET super global منتقل می‌کنند. در این قسمت، ما به بررسی POST super global و چگونگی ارتباط آن با فرم‌های پردازش در PHP می‌پردازیم.

سه راه برای به دست آوردن داده‌های کاربر وجود دارد که عبارتند از:

  1. لینک‌ها و URL‌ها: با استفاده از یک رشته پرس و جو، جفت‌ کلیدها و مقادیر  از داده‌ها و از طریق super global GET می‌توانند منتقل شوند.
  2. فرم‌ها: با استفاده از فرم‌های  HTML، متد  POST متد معمول انتقال داده است و نیازی به رمزگذاری و رمزگشایی لینک‌ها و URLها ندارد.
  3. کوکی‌ها: با تنظیم مقادیر کوکی از طریق PHP، می‌توانید در صورت لزوم، داده‌ها را در یک آرایه انجمنی (associative array) بخوانید و بنویسید.

در این مقاله از لیداوب ما به صورت خاص روش‌ دوم (با استفاده از درخواست POST و استفاده از  فرم‌های HTML  در PHP) را هدف قرار خواهیم داد. این کار توسط متغیر super global $_POST انجام می‌شود که می‌توانیم با آن به داده‌های ارسال شده توسط فرم دسترسی پیدا کنیم. فیلدهای مختلف در فرم HTML دارای یک ویژگی نام هستند که بعداً در $ _POST به کلید آرایه انجمنی تبدیل می‌شوند. شما می‌توانید از پردازش فرم به صورت یک پردازش دو صفحه‌ای یا یک پردازش فرم تک صفحه‌ای استفاده کنید. هر کدام از این‌ها جوانب مثبت و منفی دارند و در حال حاضر ما نگاهی به هر دو روش خواهیم انداخت.

این به این معنی است که صفحه اول شما حاوی مارک آپ html برای فرم خواهد بود. این فرم دارای یک ویژگی action است و مقدار آن ویژگی، دومین صفحه PHP است که داده‌ها را پردازش می‌کند. ساده‌ترین روش برای دیدن نحوه کار، ایجاد آن در کد است، مانند کد زیر:

htmlformbuiltwithlove.php

<html>

<head>

<meta charset="utf-8">

<title>HTML Form Built With Love</title>

<link href="css/bootstrap.min.css" rel="stylesheet">

<script src="js/respond.js"></script>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

<script src="js/bootstrap.min.js"></script>

</head>



<body>



<form action="process_form.php" method="post">

Website: <input type="text" name="website" value="" /><br>

Category: <input type="text" name="category" value="" /><br><br>



<input type="submit" name="submit" value="Submit Website" />

</form>



</body>

</html>

process_form.php

<pre>

<?php

print_r($_POST);

?>

بنابراین، در کد بالا ما دو صفحه تنظیمات برای پردازش فرم در ابتدایی‌ترین آن داریم. اگر ما htmlformbuiltwithlove.php را در مرورگر خود بارگذاری کنیم، می‌توانیم اطلاعاتی را در فرم وارد کنیم. در فیلد اول ما https://ello.co را وارد خواهیم کرد و در فیلد دوم Social را وارد خواهیم کرد. سپس دکمه ارسال را خواهیم زد و خواهیم دید که چه اتفاقی می‌افتد:

Array

(

    [website] => https://ello.co

    [category] => Social

    [submit] => Submit Website

)

شما می‌توانید ببینید که چگونه ویژگی نام به کلید در آرایه ما تبدیل می‌شود و داده‌هایی که ما تایپ کردیم به مقدار آن کلید خاص تبدیل شده است. این داده از یک صفحه به صفحه دیگر از طریق متد POST منتقل شده. بیایید نگاهی بیندازیم تا داده‌ها را از آن آرایه خارج کنیم و در واقع از آن استفاده کنیم. بیایید فقط دو مقدار را به دست آوریم، آن‌ها را در متغیرها قرار دهیم، سپس به نحوی از آن‌ها در صفحه استفاده کنیم. در کد زیر ما فایل process_form.php را به روز خواهیم کرد و خواهیم دید که چه اتفاقی می‌افتد:

process_form.php

<html>

<head>

<link href="css/bootstrap.min.css" rel="stylesheet">

<script src="js/respond.js"></script>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

<script src="js/bootstrap.min.js"></script>

</head>



<body>





<?php

$website = $_POST['website'];

$category = $_POST['category'];



echo "Hi bud, thanks for submitting <b>$website</b> to the <b>$category</b> category.";

?>

 تشخیص ارسال فرم

اکنون که درک درستی از نحوه ایجاد یک فرم HTML ابتدایی در یک صفحه و یک اسکریپت پردازش php در صفحه دیگر داریم، می‌خواهیم نحوه تشخیص اینکه آیا ارسال فرم وجود دارد یا خیر را بررسی کنیم.  این یک مرحله مشترک و ضروری با فرم‌های پردازش در PHP است. دلایل زیادی برای این امر وجود دارد، اما یکی از موارد اصلی این است که اگر کاربر سعی کند صفحه پردازش فرم را مستقیماً بارگذاری کند، بهترین راه برای انجام این کار چیست؟ زیرا این امر باعث ایجاد خطاهایی در برنامه شما خواهد شد.

تنظیم مقادیر پیش فرض

ما می‌توانیم مقادیر را منطقی تنظیم کنیم تا در صورت نیاز مقادیر پیش‌فرض را اختصاص دهیم. به این ترتیب، اگر کاربر صفحه اصلی پردازش فرم را به جای فرم HTML خود ارسال کند، می‌توانیم مقادیر را در صورت نیاز تنظیم کنیم. استفاده از عملگر سه‌گانه راهی آسان برای انجام این کار است.

process_form.php

<html>

<head>

<link href="css/bootstrap.min.css" rel="stylesheet">

<script src="js/respond.js"></script>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

<script src="js/bootstrap.min.js"></script>

</head>



<body>





<?php



$website = isset($_POST['website']) ? ($_POST['website']) : 'http://twitter.com' ;

$category = isset($_POST['category']) ? ($_POST['category']) : 'Social' ;





echo "Hi bud, thanks for submitting <b>$website</b> to the <b>$category</b> category.";

?>

 

 در کد بالا در لود مستقیم این صفحه Hi bud, thanks for submitting http://twitter.com to the Social category  ارائه می‌شود. با این حال در صورت ارسال فرم خالی از htmlformbuiltwithlove.php لود می‌شود، صفحه پردازش همچنان اجرا خواهد شد اما دارای مقادیر خالی است.

یک متد تشخیص فرم بهتر

مثال قبلی یک شروع است، اما روش ساده‌تر و بهتری وجود دارد. برای داشتن فرمت زیر اجازه دهید اسکریپت پردازش فرم را بازبینی کنیم :

process_form.php

<html>

<head>

<link href="css/bootstrap.min.css" rel="stylesheet">

<script src="js/respond.js"></script>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

<script src="js/bootstrap.min.js"></script>

</head>



<body>





<?php



if(isset($_POST['submit'])) {

                echo 'Nice Form Submission!<br>';

} else {

                echo 'Stop trying to hack the form fool!';

                exit;

}



$website = isset($_POST['website']) ? ($_POST['website']) : 'http://twitter.com' ;

$category = isset($_POST['category']) ? ($_POST['category']) : 'Social' ;



echo "Hi bud, thanks for submitting <b>$website</b> to the <b>$category</b> category.";

?>

 این عالی است و اکنون چیزهای بیشتری در امتداد آنچه می‌خواهید جستجو کنید فراهم می‌کند. اگر کاربر داده‌های معتبری را به فرم ارسال کند و سپس دکمه ارسال را فشار دهد، ممکن است به این شکل باشد: 

Nice Form Submission!

Hi bud, thanks for submitting Google+ to the Social category.

 اگر کاربر سعی کند به طور مستقیم process_form.php را لود کند، به آن‌ها این پیام داده می‌شود:

Stop trying to hack the form fool!

کاری که ما انجام می دهیم، بررسی وجود کلید submit در آرایه $ _POST است. تنها زمانی که کلید وجود دارد زمانی است که کاربر روی دکمه ارسال در فرم کلیک کند، بنابراین این راهی است که به راحتی می‌توانید فرم ارسال را تشخیص دهید.

ارسال فرم تک صفحه

راه دیگر برای برخورد با فرم‌ها و ارسال فرم در PHP، تکمیل پردازش فرم در همان صفحه به عنوان فرم HTML  است. در کد زیر می‌توانید ببینید چگونه این کار را انجام می‌دهیم:

htmlformbuiltwithlove.php

<?php



if(isset($_POST['submit']) and strlen($_POST['website']) > 0) {

                $website = htmlspecialchars($_POST['website']);

                $category = htmlspecialchars($_POST['category']);

                echo "Hi bud, thanks for submitting <b>$website</b> to the <b>$category</b> category.";

} else {

                echo 'Enter a Website and Category';

}



?>

<html>

<head>

<meta charset="utf-8">

<title>HTML Form Built With Love</title>

<link href="css/bootstrap.min.css" rel="stylesheet">

<script src="js/respond.js"></script>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

<script src="js/bootstrap.min.js"></script>

</head>



<body>



<form action="htmlformbuiltwithlove.php" method="post">

Website: <input type="text" name="website" value="" /><br>

Category: <input type="text" name="category" value="" /><br><br>



<input type="submit" name="submit" value="Submit Website" />

</form>



</body>

</html>

هنگامی که این صفحه در ابتدا لود شود یا اگر یک فرم خالی ارسال شود ، کاربر این پیام را دریافت می‌کند: Enter a Website and Category  (یک وب سایت و دسته بندی را وارد کنید). اگر کاربر چیزی مانند http://facebook.com و Social را ارائه کند و سپس دکمه ارسال را کلیک کند، پیامی مانند Hi bud, thanks for submitting http://facebook.com to the Social category را دریافت می‌کند.

توجه داشته باشید که ما فقط در اعتبار شرط مقدار حداقل اعتبارسنجی را اضافه کرده‌ایم و همچنین هر نوع ورودی کاربر را از طریق htmlspecialchars که در آموزش htmlentities vs htmlspecialchars آموخته ایم، اضافه کردیم.

اعتبار سنجی فرم اصلی (Basic Form Validation)

استفاده از فریم ورک‌های PHP  مانند  Laravel، Symfony، Zend، Codeigniter، Yii  یا هر یک از بسیاری از راه حل‌های خارق العاده دیگر راهی برای انجام کارهایی مانند  فرم اعتبارسنجی (Validation Form) است.

 مشخصات  اعتبار سنجی

Presence: آیا کاربر واقعاً چیزی را در یک فیلد مشخص وارد کرده است؟

String Length: آیا این رشته به اندازه کافی طولانی است که یک مقدار معتبر را ضمانت کند؟
Type Check: بررسی کنید که نوع داده کاملاً متداول است.

Inclusion: اگر یک لیست کشویی با 10 مقدار وجود داشته باشد، آیا مقدار یکی از آن 10 مقدار ممکن را ارائه می‌دهد؟

Uniqueness: آیا دادههایی که کاربر 100٪ ارسال می‌کند منحصر به فرد است؟ این در ارسال ایمیل آدرس متداول است.

Format: آیا آدرس وب سایت حاوی http: // است یا ایمیل حاوی نماد @ است و غیره.

اعتبار داده‌ها می‌تواند صدها ویژگی داشته باشد، اما young Jedi را بخاطر بسپارید، ما در این قسمت در مورد اصول اولیه صحبت می کنیم. بنابراین، خواهیم دید که این نوع قوانین اعتبارسنجی ممکن است مانند  PHP پایه باشد.  

<?php



// presence

$value = '';



if(!isset($value) or empty($value)) {

    echo 'fail';           

}



// string length

$value = '';

$min = 2;

$max = 25;



if(strlen($value) < $min) {

                echo 'fail - too small';

}



if(strlen($value) > $max) {

                echo 'fail - too big';

}



// type

$value = '';

if(!is_string($value)) {

                echo 'fail - not a string';

}



// set inclusion

$value = '7';

$set = array('1', '2', '3', '4', '5', '6', '7', '8');

if(!in_array($value, $set)) {

                echo 'fail - not in the set';

}



// format

$value = '[email protected]';

if(!preg_match('/@/', $value)) {

    echo 'not a valid email';

}



?>

توابع اعتبار سنجی

در صورت عدم استفاده از یک فریم ورک، بهترین کار این است که منطق اعتبارسنجی خود را در توابع قابل استفاده مجدد قرار دهید. در اینجا مثال‌هایی وجود دارد که ما می‌توانیم از آن‌ها برای آزمایش در مثال تأیید اعتبارسنجی فرم یک صفحه استفاده کنیم.

validation_functions.php

<?php



function has_presence($value) {

                return isset($value) and $value !== '';

}



function max_length($value, $max) {

                return strlen($value) <= $max;

}



function min_length($value, $min) {

                return strlen($value) >= $min;

}



function has_inclusion($value, $set) {

                return in_array($value, $set);

}



function form_errors($errors = array()) {

                $output = '';

                if(!empty($errors)){

                                $output .= '<div class="alert alert-danger">';

                                $output .= 'You might need to fix a few things!<br>';

                                $output .= '<ul>';

                                foreach($errors as $key => $error) {

                                                $output .= '<li>'. $error .'</li>';

                                }

                                $output .= '</ul>';

                                $output .= '</div>';

                }

                return $output;

}



?>

اکنون ما می‌توانیم دقیقاً مانند کد زیر  این فایل را وارد صفحه فرم خود کنیم:

<?php

include('validation_functions.php');

$errors = array();



// was the form submitted?

if(isset($_POST['submit'])) {

    $website = htmlspecialchars($_POST['website']);

    $category = htmlspecialchars($_POST['category']);



                // is the website field present?

                if(!has_presence($website)) {

                                $errors['website'] = 'You need to enter a website!';

                }



                // is the website address at least 4 characters or more?

                if(!min_length($website, 4)) {

                                $errors['minlength'] = 'The website must be 4 characters or more!';

                }



                // is the category field present?

                if(!has_presence($category)) {

                                $errors['category'] = 'You need to provide a category!';

                }



    if(empty($errors)) {

                                    echo "Hi bud, thanks for submitting <b>$website</b> to the <b>$category</b> category.";

                }



} else {

    echo 'Enter a Website and Category';

}



?>

<html>

<head>

<meta charset="utf-8">

<title>HTML Form Built With Love</title>

<link href="css/bootstrap.min.css" rel="stylesheet">

<script src="js/respond.js"></script>

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

<script src="js/bootstrap.min.js"></script>

</head>



<body>



<form action="htmlformbuiltwithlove.php" method="post">

Website: <input type="text" name="website" value="" /><br>

Category: <input type="text" name="category" value="" /><br><br>



<input type="submit" name="submit" value="Submit Website" />

</form>

<?php echo form_errors($errors); ?>

</body>

</html>

اکنون ما یک فرم HTML کاملاً کارآمد داریم که از طریق PHP در همان صفحه پردازش می‌شود، از توابع اعتبارسنجی استفاده می‌کند تا اعتبار سنجی را انجام دهد و اگر اشتباهی رخ دهد، خطایی را با فرمت لیست خوب ارائه می‌دهیم.

 مقالات بیشتر در لیداوب:

.این قسمت از آموزش نیز به پایان رسید برای یادگیری بیشتر با آموزش‌های لیداوب همراه باشید

 

دیدگاه ها

دیدگاه ها : 0


متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند

رایگان

اشتراک گذاری در
سورس خرید و فروش ارزهای دیجیتال
ثبت امتیاز
5 (1 رای)

   لطفا صبر کنید ...