فرم ها در PHP: الزامی کردن فیلد ها + اعتبار سنجی نام، URL و ایمیل

درسنامه درس 14 از سری آموزش PHP 7
فرم ها در PHP: الزامی کردن فیلد ها + اعتبار سنجی نام، URL و ایمیل

الزامی کردن فیلدها برای کاربران

در جلسه ی قبل فرمی را پاک سازی کردیم اما فیلدهای آن اختیاری بودند. جدول جلسه ی قبل را به یاد دارید؟

فیلد مورد نظر قانون اعتبار سنجی
Name (نام کاربر) Required (یعنی پر کردن این قسمت الزامی است). فقط باید شامل حروف و اسپیس باشد (نمیتواند هیچ عددی، علامت خاصی یا ... بگیرد).
E-mail (ایمیل) Required. همچنین باید قالب ایمیل را داشته باشد یعنی دارای علامت @ و . (نقطه) باشد.
Website (وب سایت کاربر) Optional (یعنی پر کردن این قسمت دلخواه است). همچنین باید از قالب URL ها پیروی کند.
Comment (نظر کاربر) Optional و درون یک textarea است.
Gender (جنسیت کاربر) Required حتما باید یکی را انتخاب کرده باشد.

بنابراین در این جلسه می خواهیم فیلدهای فرم ها در PHP 7 را الزامی کنیم تا اگر کاربران فیلدی را خالی گذاشتند پیام خطا برایشان ارسال شود.

در کد امروز چند متغیر جدید تعریف کرده ایم: nameErr و emailErr و genderErr و websiteErr. این متغیرها پیام های خطا را برای هر یک از فیلدهای الزامی می گیرند و بعدا به کاربر نشان می دهند. همچنین به کدها و برای هر متغیر POST_$ یک if else اضافه کرده ایم تا ببینیم متغیر خالی است یا خیر (با کمک تابع ()empty در PHP). اگر متغیر خالی باشد پیام خطایی را در متغیر مربوطه اش قرار می دهیم در غیر این صورت اطلاعات را از تابع ()test_input رد خواهیم کرد.

کد ما تا این لحظه به شکل زیر است:

<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
  }

  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}
?>

سپس به فیلدهای فرم در قسمت HTML اسکریپت کوچکی اضافه کرده ایم تا پیام خطا را به کاربر نمایش دهد. بنابراین:

<!DOCTYPE HTML>  
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>  

<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
  }
  
  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
  }
    
  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  Name: <input type="text" name="name">
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  E-mail: <input type="text" name="email">
  <span class="error">* <?php echo $emailErr;?></span>
  <br><br>
  Website: <input type="text" name="website">
  <span class="error"><?php echo $websiteErr;?></span>
  <br><br>
  Comment: <textarea name="comment" rows="5" cols="40"></textarea>
  <br><br>
  Gender:
  <input type="radio" name="gender" value="female">Female
  <input type="radio" name="gender" value="male">Male
  <input type="radio" name="gender" value="other">Other
  <span class="error">* <?php echo $genderErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit">  
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

</body>
</html>

صفحه ی تست این کد

اعتبارسنجی نام، URL و ایمیل

بر اساس جدولی که اول مقاله دیدیم قرار است نام کاربر تنها از حروف و فاصله (اسپیس) تشکل شده باشد. با کد زیر به راحتی می توان این کار را انجام داد:

$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
  $nameErr = "Only letters and white space allowed"; 
}

این کد ابتدا نام کاربر را بر اساس regular expression خاصی چک می کند (تابع ()preg_match) تا ببیند آیا شرط برقرار است یا خیر. اگر برقرار بود که مشکلی وجود ندارد اما اگر برقرار نبود پیام خطای Only letters and white space allowed برای کاربر نمایش داده خواهد شد.

برای اعتبارسنجی ایمیل کارمان راحت تر است چرا که filter_var این کار را برایمان انجام می دهد و نیازی به استفاده از regular expression ها نیست. به کد زیر توجه کنید:

$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $emailErr = "Invalid email format"; 
}

برای اعتبار سنجی URL باید دوباره به سراغ regular expression ها برویم. regular expression خاصی که ما استفاده کرده ایم به کاربر اجازه ی استفاده از - (خط فاصله) را نیز می دهد:

$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
  $websiteErr = "Invalid URL"; 
}

حالا اسکریپت ما به شکل زیر درآمده است:

<!DOCTYPE HTML>  
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>  

<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
      $nameErr = "Only letters and white space allowed"; 
    }
  }
  
  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Invalid email format"; 
    }
  }
    
  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
    // check if URL address syntax is valid
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
      $websiteErr = "Invalid URL"; 
    }    
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  Name: <input type="text" name="name">
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  E-mail: <input type="text" name="email">
  <span class="error">* <?php echo $emailErr;?></span>
  <br><br>
  Website: <input type="text" name="website">
  <span class="error"><?php echo $websiteErr;?></span>
  <br><br>
  Comment: <textarea name="comment" rows="5" cols="40"></textarea>
  <br><br>
  Gender:
  <input type="radio" name="gender" value="female">Female
  <input type="radio" name="gender" value="male">Male
  <input type="radio" name="gender" value="other">Other
  <span class="error">* <?php echo $genderErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit">  
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

</body>
</html>

صفحه ی تست این کد

قدم آخر برای تکمیل فرم این است که مقادیر ارسالی کاربر را در صورت بروز خطا نگه داریم. متاسفانه اکثر فرم ها در وب سایت ها در صورت بروز خطا تمامی اطلاعات را دور میریزند و کاربر باید دوباره آن ها را وارد کند که به نوبه ی خود بسیار آزاد دهنده است اما ما می خواهیم این مشکل را حل کنیم؛ برای این کار اسکریپت کوچکی در قسمت value فرم (قسمت های name و email و website) اضافه می کنیم. برای textarea نیز اسکریپت را بین تگ های <textarea> و </textarea> قرار می دهیم. برای radio button نیز باید attribute ای به نام checked (نه مقدار value) را تنظیم کنیم. این اسکریپت کوچک مقادیر این فیلدها را نگه می دارد:

Name: <input type="text" name="name" value="<?php echo $name;?>">

E-mail: <input type="text" name="email" value="<?php echo $email;?>">

Website: <input type="text" name="website" value="<?php echo $website;?>">

Comment: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>

Gender:
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="female") echo "checked";?>
value="female">Female
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="male") echo "checked";?>
value="male">Male
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="other") echo "checked";?>
value="other">Other

صفحه ی تست کد تکمیل شده

نکته: این مقاله و قسمت قبلی موارد پایه ای را شامل می شوند اما به مباحث پایگاه داده و ... نپرداخته اند. برای مرور بحث های پایگاه داده باید به دوره ی آموزش PDO سر بزنید.

امیدواریم از بحث فرم ها در PHP 7 استفاده کافی را برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PHP 7 توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.