در این آموزش، نحوه ی ساخت فیلدهای الزامی (required) و نمایش پیغام خطای مناسب نشان داده خواهد شد.
فیلدهای الزامی در PHP
در آموزش قبلی، تمام فیلدهای ورودی اختیاری بودند. اما همانطور که در جدول اعتبار سنجی زیر مشخص شده است، فیلدهای "نام"، "ایمیل" و "جنسیت" الزامی اند. این فیلدها نمی توانند خالی باشند و باید حتماً با یک مقدار تنظیم شوند.
قوانین اعتبارسنجی:
فیلد | قوانین اعتبارسنجی |
---|---|
نام | الزامی است. فقط باید شامل حروف الفبا و خط فاصله باشد. |
ایمیل | الزامی است. باید شامل فرمت صحیح ایمیل باشد (همراه با علامت @ و .) |
وب سایت | اختیاری است. اگر پر شد، باید شامل فرمت صحیح URL باشد. |
توضیحات | اختیاری است. می تواند شامل چند خط متن باشد (textarea) |
جنسیت | الزامی است. یکی از دو مورد باید انتخاب شود. |
در کد زیر، تعدادی متغیر جدید با نام های nameErr$ و emailErr$ و genderErr$ و websiteErr$ اضافه شده است. این متغیرهای خطا، متن خطای مورد نظر را برای فیلدهای الزامی در خود نگه می دارند. ما همچنین برای هر متغیر POST_$ یک دستور if ... else اضافه کرده ایم. این دستور شرطی، چک می کند که اگر متغیر POST_$ خالی است (با استفاده از تابع ()empty) یک متن خطای مناسب در متغیرهای خطا ذخیره می کند، و اگر خالی نبود، مقدار برگشتی تابع ()test_input در متغیر متناظرش ذخیره می شود:
// 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"]);}
}
?>
نمایش متن خطا در PHP
در فرم HTML، باید یک اسکریپت PHP اضافه نمایید. که متن خطای مورد نظر را نمایش می دهد:
مثال (فیلدهای الزامی در PHP)
<html>
<head>
<style>
.error {color: #FF0000;}
span{min-width: 200px;float: right;}
</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 = "وارد کردن نام الزامی است";}
else
{$name = test_input($_POST["name"]);}
if (empty($_POST["email"]))
{$emailErr = "وارد کردن ایمیل الزامی است";}
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"]) || $_GET["gender"]=="undefined")
{$genderErr = "انتخاب جنسیت الزامی سات";}
else
{$gender = test_input($_POST["gender"]);}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>مثال اعتبارسنجی فرم ها در PHP</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<div>
<span>نام:</span><input type="text" name="name">
<span class="error">*</span>
</div>
<div>
<span>ایمیل:</span><input type="text" name="email">
<span class="error">*</span>
</div>
<div>
<span>وب سایت:</span><input type="text" name="website">
<span class="error"></span>
</div>
<div>
<span>توضیحات:</span><textarea name="comment" rows="5" cols="40"></textarea>
<span class="error">*</span>
</div>
<div>
<span>جنسیت:</span>
<input type="radio" name="gender" value="female">زن
<input type="radio" name="gender" value="male">مرد
</div>
</div><input type="submit" name="submit" value="ارسال اطلاعات"></div>
</form>
<?php
if ($nameErr!="" || $emailErr!="" || $genderErr!="" || $websiteErr!="")
echo "<span style='color:red' >
$nameErr <br /> $emailErr <br /> $genderErr <br /> $websiteErr
</span>";
else
{
echo "<br /><h2>خروجی کدتان</h2>";
echo "نام :$name";
echo "<br />";
echo "ایمیل: $email";
echo "<br />";
echo "وب سایت: $website";
echo "<br />";
echo "توضیحات: $comment";
echo "<br />";
echo "جنسیت: $ender";
}
?>
</body>
</html>
خروجی کد بالا:
مثال اعتبارسنجی فرم ها در PHP
در آموزش بعدی نحوه اعتبارسنجی فیلدهای "نام"، "ایمیل" و "وب سایت" توضیح داده خواهد شد. (آیا فیلد "نام"، فقط شامل حروف و فاصله خالی است - آیا فیلد "ایمیل"، شامل یک فرمت صحیح است - اگر فیلد "وب سایت" پر شد، آیا شامل یک فرمت صحیح است)
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
آیا این دو روش با هم تفاوتی دارن؟کد زیر
[dir=#555]<input type="text" name="NAME" required />[/dir]
1- سمت کاربر (Client)
2- سمت سرور (PHP یا ASP.NET)
3- سمت پایگاه داده (SQL Server)
در مطلب بالا، اعتبارسنجی سمت سرور با استفاده از کدهای PHP انجام شده است، اما موردی که شما می فرمایید، یعنی استفاده از ویژگی required، اعتبار سنجی سمت کاربر است که باید انجام شود. اما هدف ما در بالا آموزش کدهای PHP بوده است و در مورد ویژگی مذکور، در قسمت HTML5 آموزش داده شده است.
1- ابتدای کدها متغیری برای خطای وبسایت با نام website تعریف کردین اما ازش استفاده نشده.یعنی اونجایی که به مثلا متغیر خطای نام یک عبارت رشته تخصیص دادین, داخل if مربوط به اعتبارسنجی سایت, مقدار خالی گذاشتین داخل متغیر $website. پس websiteErr چه مقداری میگیره که در if پایانی مقدارشو چک میکنیم؟
2- فرض کنیم فقط فیلد نام رو خالی بگذاریم.پس فقط متغیر خطای نام پرمیشه و درنتیجه در if پایانی تمام متغیرهای خطای دیگر هم که فیلدمتناظرشون پرشده هم باید چاپ بشن که البته مقدار خالی دارن.اما چون از تگ br هم استفاده کردین, پس در خروجی خطوط خالی به جای متغیرهای خطای بدون مقدار دیگر, چاپ میشن درسته؟
1- بله حق با شماست، چون فیلد "وب سایت" و "توضیحات" الزامی نیستند، می توانستیم برای فیلد های مذکور متغیرهای websiteErr$ و commentErr$ را ایجاد نکنیم.
2- آفرین به دقت شما ... بله شما درست می فرمایید اما بدلیل انتقال سریع و آسان مطالب مجبور شدیم که کدها را مختصر کنیم.
ممنون از آموزش
نمیدونم این نکته رو ذکر کردن یا نه ولی میتونستیم به جای تعریف متغیر یک آرایه تعریف کنیم و push array کنیم خطاها رو و در آخر با foreach خطاهای فرم رو نمایش بدیم. و ممکنه روش بهتری ام وجود داشته باشه.اگه صلاح دونستید این تغییر رو انجام بدید.
ممنون
در خود تگ input یه خصوصیت هست به نام max که میتونید حد بالای مقدار اون رو کنترل کنید. همینطور برای حد پایین هم خصوصیت هست.
[dir=#555]< input type="text" name="txtFirstname" min="2" max="10" >[/dir]
ولی راه اصولیتر کنترل این مقادیر توسط زبان سمت سرور هست. چون با کمی کدنویسی و ابزار هک میشه قسمت کلاینت رو دور زد.
خب هر فیلدی که پر نشه فقط باید برای اون پیام بده
یه روشش هم اینه!
در ثانی اگر دقت کنید اگر فیلدی دارای خطا نباشه، متن خطای مربوط به اون نشون داده نمیشه، یا در واقع خالی نشون داده میشه.
میشه در مورد این خط توضیح بدین؟
if ($nameErr!="" || $emailErr!="" || $genderErr!="" || $websiteEr
اگر دقت کنید متغیرهای nameErr$، $emailErr و ... متن خطا رو نگه میدارن.
از طرفی علامت =! بیانگر نامساوی بودن هست. عبارت "" =! nameErr$ یعنی اگر متن خطا مساوی با "" نبود.
در واقع این شرط داره این معنی رو میده که متن خطا [color=#FF0000]پر [/color]بود، عبارت خطا رو نشون بده.
متن خطا زمانی پر میشه که فیلد موردنظر دارای خطا باشه.
می خواستم خروجی کد php رو با css استایل داده و در صفحه html نمایش بدم؛ اینکار به چه صورت امکان پذیر است؟
با تشکر
خروجی کدهای PHP در نهایت یک عبارت هست که میتونه رشته هم باشه.
شما میتونید این رشته رو داخل تگهای html قرار بدید و به اون تگها کلاس موردنظر رو اعمال کنید.
با سلام و احترام. ممنون میشم به سوالات من جواب بدین.
من یک فرم تماس با ما دارم به صورت عکس شماره ۱
وقتی فیلدی خالی باشه میگه فیلد رو پر کنه.حالا میخوام کاری کنم که فیلد رو خالی بعد از ارسال نفرسته یعنی کاربر حتما فیلد رو پر کنه.کدهای جاوااسکریپتش رو فقط روی فیلد نام تونستم فعال کنم فقط اجازه نمیده فیلدنام خالی باشه.واسه بقیش چیکار کنم.
کدهای جاوا اسکریپت (تصاویر ۲ و ۳)
کدهای فرم (تصاویر ۴ و ۵)
کد پی اچ پی (تصویر۶)
بد که این اتفاق افتاد میخوام وقتی پیام ارسال کرد علاوه بر این که توی صفحه ی مدیریت پیام رو فرستاد یک ایمیل واسه مدیر هم بفرسته و همچنین یک پیام هم به کاربر و هم به مدیر بفرسته.من باید چیکار کنم?
لینک تصاویر
http://www.uplooder.net/files/26602f681c446cf43cb3df3f5d9f3822/تصاویر_سوالات.zip.html
با سپاس از شما.
سؤال و عکسا تا حدودی گویای منظورتون بود، ولی بهتر بود کد رو کامل به صورت یه فایل txt میفرستادید تا روی همون میشد کد زد.
یه کد براتون نوشتم، تا حدودی خواستههای شما رو درش لحاظ کردم. البته خیلی ابتدایی هست. بیشتر برای این هست که مفهوم رو درک کنید. خودتون باید ویرایش کنید و مواردی لازم من جمله اضافه به دیتابیس رو بهش اضافه کنید.
بخش ارسال ایمیل رو هم خیلی ابتدایی نوشتم. برای ارسال ایمیل میشه از کلاسهای مخصوصی استفاده کرد که خیلی بهتر از کد من هست.
کد رو کامل کپی و در یک فایل php. ذخیره کنید. برای اجرا، باید فایلهای php در سیستم شما قابل اجرا شدن داشته باشن.
[dir=#555]<?php
if(count($_POST) > 0 && isset($_POST['btnSend'])){
$name = isset($_POST['txtName']) ? $_POST['txtName'] : '';
$email = isset($_POST['txtEmail']) ? $_POST['txtEmail'] : '';
$title = isset($_POST['txtTitle']) ? $_POST['txtTitle'] : '';
$content = isset($_POST['txtContent']) ? $_POST['txtContent'] : '';
$error = array();
if(empty($name))
$error[] = 'فیلد نام خالی است.';
if(empty($email))
$error[] = 'فیلد ایمیل خالی است.';
if(empty($title))
$error[] = 'فیلد عنوان خالی است.';
if(empty($content))
$error[] = 'فیلد متن خالی است.';
if(empty($error)){
echo '<p>نام : ' . $name . '</p>';
echo '<p>ایمیل : ' . $email . '</p>';
echo '<p>موضوع : ' . $title . '</p>';
echo '<p>متن : ' . $content . '</p>';
// operation
// save to database
// send mail
mail("[email protected]", 'Subject', 'Content of message for admin');
}
else{
echo '<div class="error"><p>'.implode("</p><p>", $error).'</p></div>';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Contact Us</title>
<meta charset="utf-8" />
<style>
body{direction:rtl;font-family:tahoma;font-size:12px;}
td{padding:5px;vertical-align:top;}
input, textarea{width:100%;border:1px solid #ccc;padding:2px;}
.error{font-weight:bold;color:red;}
</style>
<script>
function checkform(){
var inputName = document.getElementById("txtName");
var inputEmail = document.getElementById("txtEmail");
var inputTitle = document.getElementById("txtTitle");
var inputContent = document.getElementById("txtContent");
var err = 0;
if(inputName.value == ""){
err++;
inputName.style.border = "1px solid red";
}
else{
inputName.style.border = "1px solid #ccc";
}
if(inputEmail.value == ""){
err++;
inputEmail.style.border = "1px solid red";
}
else{
inputEmail.style.border = "1px solid #ccc";
}
if(inputTitle.value == ""){
err++;
inputTitle.style.border = "1px solid red";
}
else{
inputTitle.style.border = "1px solid #ccc";
}
if(inputContent.value == ""){
err++;
inputContent.style.border = "1px solid red";
}
else{
inputContent.style.border = "1px solid #ccc";
}
if(err)
return false;
else
return true;
}
</script>
</head>
<body>
<form method="post" action="" onsubmit="return checkform();">
<table>
<tr>
<td>نام</td>
<td><input type="text" name="txtName" id="txtName"/></td>
</tr>
<tr>
<td>ایمیل</td>
<td><input type="text" name="txtEmail" id="txtEmail"/></td>
</tr>
<tr>
<td>موضوع</td>
<td><input type="text" name="txtTitle" id="txtTitle"/></td>
</tr>
<tr>
<td>متن</td>
<td><textarea name="txtContent" id="txtContent"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="Send" name="btnSend"/></td>
</tr>
</table>
</form>
</body>
</html>[/dir]
تشکر از سایت و مطالب خوبتون
من طبق آموزش جلو رفتم و به نتیجه رسیدم در مرحله بعد میخام با زدن کلید ارسال اطلاعات ، داده های من داخل دیتابیس بنشینه، یک فایل php برای ذخیره کدها در db ایجاد کردم ولی حالا نمیدونم چطور باید داده ها را post کنم به فایل مذکور؟
به لینک های زیر مراجعه نمایید و مثال مربوطه را مشاهده نمایید:
beyamooz.com/php/97-database/118
beyamooz.com/php/339-project-hotel/2594
www.beyamooz.com/php/97-database/3268
از مطالب بسیار مفیدتون هم نهایت تشکر را دارم.
در قسمت آخر جای ۲ تا علامت جابجا نوشته شده لطفا اصلاح بفرمایید.
?>
}
معنيش چيه؟
حالا برای پیاده سازی این امر به چند متغییر برای نگه داری پیغام های خطا نیاز داریم، یکی از این متغیرها، چیزی است که شما به آن اشاره کرده اید، یعنی nameErr ...
پس اگر فیلد "نام" خالی بود، مقدار "وارد کردن نام الزامی است" برای این متغییر، تنظیم خواهد شد.
حالا به قول شما در کد php دوم، اگر این متغیر خالی بود که هیچ، اما اگر مقدار دهی شده بود، یعنی کاربر آنرا خالی ارسال کرده است ...
اصلا این کار لازمه ؟ چون با نبودنش هم خطایی رخ نمیده.
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
مگر اینکه بخوایم اون صفحه رو include کنیم ، وگرنه فکر نکنم در این صفحه مربوط به فرم ها تاثیر بگذاره درسته ؟
وقتی ما به صفحه دیگه میریم اگر مقادیر فیلد ها رو به صفحه ای ارسال نکنیم ، متغیرها از بین میره دیگه درسته ؟