اعتبارسنجی فیلد ایمیل در PHP
در این آموزش، نحوه ی اعتبارسنجی فیلدهای "نام"، "ایمیل" و "وب سایت" نشان داده خواهد شد.
اعتبارسنجی فیلد "نام" در PHP
کد زیر، یک روش ساده برای چک کردن اینکه آیا فیلد "نام" معتبر است یا نه را نشان می دهد. (فیلد نام فقط شامل حروف و خط فاصله است)
اگر فیلد "نام" معتبر نباشد، در متغیر nameErr$ یک متن مناسب، تنظیم می شود:
if (!preg_match("/^[a-zA-Z ]*$/",$name))
{
$nameErr = "فیلد نام فقط شامل حروف و خط فاصله است";
}
تابع ()preg_match با استفاده از تابع ()preg_match، می توانید یک الگوی خاص را در یک رشته جستجو کنید. اگر الگوی مورد نظر در رشته وجود داشت مقدار true و اگر وجود نداشت مقدار false را برمی گرداند. |
اعتبارسنجی فیلد "ایمیل" در PHP
روش اول: استفاده از تابع ()preg_match
کد زیر، یک روش ساده برای چک کردن اینکه آیا فیلد "ایمیل" معتبر است یا نه را نشان می دهد. (باید شامل فرمت صحیح ایمیل باشد، همراه با علامت @ و .)
اگر فیلد "ایمیل" معتبر نباشد، در متغیر emailErr$ یک متن مناسب، تنظیم می شود:
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr = "فرمت فیلد ایمیل صحیح نیست";
}
روش دوم: استفاده از تابع ()filter_var
یکی دیگر از روش های چک کردن اعتبار ایمیل، استفاده از تابع ()filter_var در PHP است. برای کسب اطلاعات بیشتر درباره تابع ()filter_var به لینک آموزش PHP-فیلتر ورودی ها مراجعه نمایید.
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr ="فرمت فیلد ایمیل صحیح نیست";
}
در این آموزش، از روش اول یعنی تابع ()preg_match استفاده شده است.
اعتبارسنجی فیلد "وب سایت" در PHP
کد زیر، یک روش ساده برای چک کردن اینکه آیا فیلد "وب سایت" معتبر است یا نه را نشان می دهد. (باید شامل فرمت صحیح URL باشد، همچنین عبارت منظم زیر اجازه می دهد که در URL علامت dash "-" نیز استفاده شود)
اگر فیلد "وب سایت" معتبر نباشد، در متغیر websiteErr$ یک متن مناسب، تنظیم می شود:
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
{
$websiteErr = "فرمت فیلد وب سایت صحیح نیست";
}
اعتبارسنجی فیلدهای "نام"، "ایمیل" و "وب سایت" در 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 = "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 syntax is valid
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr = "Invalid email format";
}
}
if (empty($_POST["website"]))
{$website = "";}
else
{
$website = test_input($_POST["website"]);
// check if URL address syntax is valid (this regular expression also allows dashes in the URL)
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"]) || $_GET["gender"]=="undefined")
{$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</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 "جنسیت: $gender";
?>
}
</body>
</html>
خروجی کد بالا:
مثال اعتبارسنجی فرم ها در PHP
در آموزش بعدی نحوه ی جلوگیری از خالی شدن فیلدهای فرم، زمانی که کاربر روی دکمه submit کلیک می کند را نشان خواهیم داد.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 25925
دیدگاهها
سلام
برای اینکه بتوانیم از حروف فارسی در فیلد نام استفاده کنیم باید چه کنیم ؟
سلام این تابع test_input چیه ارور میگیره به ما میگه فانکشن test_input یافت نشد. ممنون
سلام
function test_input($data)
{
$data = trim($data);
$data = stripslashes($d ata);
$data = htmlspecialchar s($data);
return $data;
}
توضیحات بیشتر در مطلب زیر:
beyamooz.com/php/231-php-form/953-%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%B3%D9%86%D8%AC%DB%8C-%D9%81%D8%B1%D9%85-%D8%AF%D8%B1-php
سلام و خداقوت داخل عبارات منظمی که برای فیلد وبسایت نوشتین, اون براکت دوم برای چیه و فرقش با اولی چیه؟ ممنون
درود بر شما.
در کامنت های قبلی به طور مفصل در مورد عبارت های منظم توضیح داده ام. لطفا به پایین کامنت های زیر بروید و اون رو مطالعه کنید.
سلام این اسلش و بک اسلش و علامت ^ و + و - تو شرط if چیه ؟
سلام.
کدش رو دقیقا بذارید تو توضیح بدم، ولی احتمالا منظور شما preg_match هست.
این علایم در عبارات باقاعده کارایی داره که یکی از کاربردش میتونه داخل شرط if باشه.
سلام
این تابع چیه؟
else if(!eregi('^[a-zA-Z0 -9_\-\.]+@[a-zA -Z0-9\-]+\.[a-z A-Z0-9\-\.]+$', $email))
با سلام.
این تابع با عبارات منظم (Regular Expression) کار میکنه. عبارات منظم، عباراتی هستند که دارای شکل و فرمت خاصی هستن که میشه با یه سری علامت، فرمت اون رو به دست آورد و انتها و ابتدای آن با یک کاراکتر خاص جدا میشود.
اگر عبارت منظم در رشته وجود داشت، طولش رو برمیگردونه، و اگه نداشت که false بر میگردونه. از i آخرش این استنباط میشه که این عبارت حساس به حروف یا insensitive نیست.
میشه یکم بیشتر توضیح دهید؟
این تابع چه فرقی با تابع های بالا داره؟
دوست عزیز سؤالاتون خیلی گنگه!!!
اسم توابع رو نام ببر! اگه مشکلی تو کدی هست، یه تیکه از کد رو بیار.
خلاصه سؤالتون رو طوری مطرح کنید که دیگران با خوندنش منظور شما رو درک کنن.
الآن من تابع eregi رو با کدوم تابع مقایسه کنم؟؟؟
با تابع preg_match
با سلام.
هر دو تابع با عبارات منظم کار میکنن. فرقشون نحوهی کار و خروجی هست. preg_match چک میکنه که فرمت رشتهی ورودی با عبارات منظم داخلش یکی هست یا نه. آرگومان سوم این تابع میتونه رشتههای موردنظر رو به صورت یه ارایه به عنوان خروجی بده.
در تابع eregi چک میکنه چقدر از طول رشتهی موردنظر با فرمت عبارت منظم همخوانی داره. طول اون رو بر میگردونه!!!
میشد دیگه از دو تا متغیر استفاده نکنیم!؟
مثلا بگیم اگه آرایه اش خالی بمونه اینو برامون چاپ کن که نباید خالی بمونه....اگه پر بشه این همون متغیره اسممونه مثلا ...
اینجوری اینقدر کدمون شلوغ نمیشد...
بله! اگه فکر میکنید کدتون بهینه و خلوت میشه، ازش استفاده کنید.
مثال ذکر شده صرفا جنبه آموزشی داره و برای فهم مطالب هست. اگر میتونید از کد کمتری استفاده کنید، حتما این کار رو انجام بدید.
چون در آینده خوانایی کد بالاتر میره.
سلام و خسته نباشید ،
میخواستم بدونم آیا تابع آماده ای وجود داره که مثلا بتونه فقط بگرفتن پارامتر نام فیلد و نوع فیلد بصورت کامل یه فرم رو اعتبارسنجی کنه ؟
با سلام و تشکر.
تا جایی که من اطلاع دارم، خیر!!!
ولی شما میتونید یه تابع بنویسید و این مقادیر رو بهش بدید و با استفاده از یکسری کدنویسی با فرمت خاص ایمیل و ... بهش بفهمونید که آیا متغیر موردنظر اعتبار داره یا خیر...
یه تابعی هم هست توی PHP به نام filter_var($var iable, FILTER_VALIDATE _TYPE); //comment که فرمت ip و ایمیل و url و اینا رو میشناسه. می تونید از این تابع هم استفاده کنید. خروجی این تابع مقدار true یا false هست که به این معنی هست که متغیر ورودی اگر برابر با فرمت داده شده بود، مقدار true و در غیر اینصورت مقدار false رو بر میگردونه!
ممنون آقای صلاحی ،
امکان داره لطف کنید و نکات مهمی که برای اعتبارسنجی کامل و ایمن یه فرم لازمه فقط بصورت لیست بگید . منظورم اینه برای اینکه بشه مطئمن بود که میشه از یه فرم توی سایت استفاده کرد باید به چه نکاتی باید توی اعتبارسنجی فرم توجه کرد ؟
خواهش میکنم.
ببینید برای اعتبار سنجی قوانین و قاعدهی خاصی وجود نداره و شما باید بر اساس نیاز خودتون مقادیر رو گرفته و پردازش کنید.
اما به طور کلی مدنظر قرار دادن چند نکته میتونه خیلی مفید باشه:
1- اول از همه اینکه سعی کنید مقادیر رو تمیز کنید. فاصلهی اول و آخر فیلدها رو بگیرید (توسط توابع ltrime و rtrim).
2- سعی کنید مقادیری رو بگیرید که بهش نیاز دارید و اگه توی اون حیطهی مدنظر شما نبود، همونجا اون فیلد رو رد کنید. مثلا برای درج سن فقط نیاز دارید چک کنید که فیلد عدد هست یا نه. اگر عدد نبود، دیگه نیاز نیست چکش کنید.
3- اعتبارسنجی اصلی باید سمت سرور قرار بگیره، ولی از اعتبار سنجی سمت کلاینت میتونید تا حدی کاربر رو از ورود اطلاعات نامعتبر آگاه کنید.
4- برای جلوگیری از حملات و تزریق کدها، مقادیر رو خنثی کنید. توابع خاصی برای این کار هستن که htmlentities($v ariable); //comment یکی از این توابع هست. (میتونید تو یه حلقه تمامی مقادیر رو از این فیلتر رد بدید.)
5- اگر فیلدها قرار هست در دیتابیس ذخیره بشن،علاوه بر موارد بالا بهتره اون رو escapeهم کنید تا از تزریق کدهایی که باعث خرابی در دیتابیس میشن هم جلوگیری کنید. میتونید از تابع mysql_real_scap e_string($varia ble); //comment استفاده کنید.
...
سلام ببخشید مثلا در این قسمت این حروف چیه؟
نشانگر چیه؟
باید همینو همیشه نوشت؟ثابته؟
if(!preg-match
(اینجا,$email)
سلام
-->آموزش اعتبار سنجي فيلد نام :
به عبارت زير توجه داشته باشيد:
^[a-zA-Z ]*$
اين يک عبارت منظم است. از يک عبارت منظم براي جستجوي يک عبارت خاص استفاده مي شود. حالا مي خواهيم نشان دهيم که معني اين عبارت چيست و به دنبال چه عبارت خاصي مي گردد:
1. از علامت ^ براي نشان دادن شروع يک رشته استفاده مي شود.
2.از علامت $ براي نشان دادن پايان يک رشته استفاده مي شود.
بنابراين آنچه بين اين دو علامت قرار مي گيرد نشان دهنده ي يک رشته است و يعني ما مي خواهيم به دنبال يک رشته بگرديم.
3.عبارت [a-zA-Z] مشخص کننده ي يک کاراکتر انگليسي است، چه کوچک باشد، چه بزرگ. يعني اين عبارت به دنبال يک کاراکتر کوچک يا بزرگ انگليسي مي گردد. بنابراين تا اينجا عبارت هاي منظم ما به دنبال تنها يک کاراکتر انگليسي مي گردد.
4.کاراکتر * : اين کاراکتر نشان دهنده ي از صفر تا بي نهايت است.
پس تا اينجا که ما به دنبال يک کاراکتر انگليسي مي گشتيم، اکنون با اضافه کردن *، به دنبال صفر تا بي نهايت کاراکتر انگليسي مي گرديم.
-->آموزش اعتبار سنجي فيلد وب سايت:
همان طور که در آموزش ها اومده، براي اعتبار سنجي فيلد وب سايت از عبارت منظم زير استفاده شده است:
/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i
اکنون مي خواهيم قدم به قدم اين عبارت منظم رو آموزش بديم.
توجه داشته باشيد که بعنوان مثال، آدرس يک وبسايت به صورت هاي زير ممکن هست نوشته بشه:
http://www.beyamooz.com
https://www.beyamooz.com
www.beyamooz.com
ftp://beyamooz.com
و ...
همچنين ممکن هست که www ها به صورت کوچک و بزرگ باشند، يعني به صورت زير:
www.beyamooz.com
Www.beyamooz.com
WWw.beyamooz.com
و ...
براي ساختن اين عبارت منظم، با عبارت http شروع مي کنيم :
http
براي اينکه مشخص کنيم که مي خواهيم به دنبال https هم بگرديم، يک علامت ؟ جلوي حرف s قرار ميدهيم. علامت سوال به معني 0 يا 1 بار تطابق است، يعني اگر که 0 يا 1 کاراکتر s جلوي http وجود داشت آن را بعنوان تطابق برگردان:
https?
حالا مي خواهيم مشخص کنيم که اگر به جاي https، عبارت ftp هم بود، آن را بعنوان تطابق قبول کن:
براي اين کار، يک پرانتز باز مي کنيم به صورت زير:
(?:https?|ftp)
علامت سوال و دونقطه ي اولي يعني مي خواهيم از شرط 'يا' استفاده کنيم و علامت | هم به معني 'يا' است.
پس يعني اگر که اول آدرس مورد نظر عبارت https يا ftpبود (و يا http) آن را بعنوان تطابق بپذير.
در مرحله ي بعد مي خواهيم مشخص کنيم که اين تطابق ها در اول عبارت مورد نظر باشند، مثلا عبارت http را در اول رشته جستجو کند نه در آخر عبارت و ... پس از b\ استفاده مي کنيم:
\b(?:https?|ftp)
در ادامه مي خواهيم مشخص کنيم که جلوي فرضا http يک علامت (:) دو نقطه قرار گرفته باشد، و همچنين دو تا اسلش هم بعد از دو نقطه وجود داشته باشه:
\b(?:https?|ftp):\/\/
حالا مي خواهيم بگيم که اگر در اول آدرس، به جاي ftp يا https (يا http) عبارت .www هم وجود داشت اون رو بعنوان تطابق برگردان، پس دوباره از پرانتز و شرط 'يا' استفاده مي کنيم، به صورت زير(يعني کل پرانتز قبلي رو توي يه پرانتز ديگه قرار ميديم):
\b(?:(?:https?|ftp):\/\/|www\.)
در ادامه هم مي خواهيم مشخص کنيم که هريک از کاراکترهاي مشخص شده در بين براکت ها، به هر تعداد که باشند، را بعنوان تطابق برگرداند:
/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i
و در آخر، مديفاير رو به i ست مي کنيم تا هم به دنبال حروف بزرگ برگردد و هم حروف کوچک.
سلام در مورد عبارت منظم توضیح دادید یه سوال برام پیش اومد
تو عبارات منظم علامت * به معنی 0 تا بینهایت بار تکرار رشته مورد نظره
اما تو عبارات منظم علامت + هم داریم که بمعنی 1 تا بینهایت بار تکرار رشته مورد نظره
میخواستم بدونم تو php از این حالتم میشه استفاده کرد یا نه
میدونم که میشه با الحاق [a-zA-Z] به [a-zA-Z]* اون حالت رو ایجاد کرد که حداقل یک کاراکتر وارد شده باشه
اگر میشه آیا بهتر نیست بجای دو مرحله اعتبارسنجی فیلد و کدنویسی بیشتر یک بار این کارو بکنیم؟
مثلا اگه از * استفاده کنیم باز ممکنه فیلد خالی باشه و باز باید خالی بودنشو چک کنیم
اما اگه از + استفاده کنیم نیازی به کنترل خالی بودن فیلد نیست
ممنون
سلام . بله امکانش هست، می تونید به جای * از + استفاده کنید تا دیگه لازم نباشه خالی بودن فیلد رو چک کنید.
$name = test_input($_POST["name"]);
if (!preg_match("/ ^[a-zA-Z ]+$/",$name))
{
$nameErr = "فیلد نام فقط شامل حروف و خط فاصله است";
}
با سلام
اگر بخواهیم فیلد "نام" در فرم مثال بالا، شامل کاراکترهای فارسی نیز باشد باید از چه دستوری استفاده کنیم؟
باتشکر
سلام
بجای Validation مربوط به فیلد "نام" از کد زیر استفاده نمایید:if (!preg_match("/^\D{1,25}$/",$r_name))
{
$r_name_err = "فقط شامل کاراکترهای غیر عددی";
}
مورد بالا، به زیبایی در پروژه رزرو هتل دیده شده است:
www.beyamooz.com/php/339-project-hotel/2594-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%85%D8%AD%D9%88%D8%B1-php
با تشکر از مظالب بسیار خوبتون .
من یه مشکلی دارم . وقتی با متغیر $_SERVER[PHP_SE LF] میخوام کدها رو به صفحه جاری ارجا بدم بعد از اجرای صفحه تمام کدها از بالا به پایین یه بار اجرا میشن . برای جلوگیری از این مسئله و برای اینکه بخوام کدها زمانی اجرا بشن که من تعیین میکنم باید چکار کنم ؟؟!!
ممنون میشم پاسخ بدید ...
در یک همچین مواقعی از یک تگ input با "type="hidden و "name="action و value دلخواه مثلاً "insert" استفاده می شه و زمانی که فرم submit می شه، این فیلد نیز همراه با بقیه فیلدها به سرور ارسال می شه ...!
خوب حالا می توانید با استفاده از دستور switch و البته مقداری که متغییر action داره، تصمیم بگیرید که چه کاری رو انجام دهید.
نمی دونم جوابم براتون قابل فهم بود یا نه ...!
اجازه دهید تا بیشتر توضیح بدم، تصور کنید در فایل reserve.php قصد داریم فرم رزرو هتل را نمایش دهیم و البته عملیات insert را نیز در همین فایل انجام خواهیم داد.
همان طور که گفتم در ابتدای این فایل مقدار action رو می خونیم و با استفاده از دستور swith تصمیم می گیریم که چی کار کنیم، در قسمت default این دستور تابع "()display_form _reserve" تنظیم شده، پس یعنی در ابتدا که درخواست رویت صفحه reserve.php به سرور ارسال میشه، فقط فرم رزرواسیون نمایش داده می شه ...
حالا اگر کاربر اطلاعات فرم را تکمیل کند و روی دکمه "ذخیره" کلیک کند، مقدار action تنظیم خواهد شد و این بار تابع "()insert" اجرا خواهد شد.
ممنون که جواب دادین . بازم تشکر به خاطر مطالبتون
سلام
برای اعتبار سنجی ایمیل php خودش یه تابعی داره به نام filter_var که در سایت w3schools.com هم با این تابع آموزش داده البته این کدی که شما هم گذاشتید درسته اما فکر کنم از اون موقع که این مطلب رو ترجمه کردید w3schools.com این صفحه اش آپدیت شده خودتون ببینید: http://www.w3schools.com/php/php_form_url_email.asp
به مطلب دوستمون هم اینو اضافه کنم که در مورد چک کردن url هم در همون تابع filter_var می تونین از FILTER_VALIDATE _URL استفاده کنین
http://www.w3schools.com/php/filter_validate_url.asp
با تشکر از دقت نظر شما، اعتبارسنجی ایمیل تحت دو روش مختلف توضیح داده شد.
در مثال مربوط به ایمیل گفتید که کاراکتر @ و . برای اعتبار سنجی هستن
در مورد کاراکترهای دیگه هم توضیح میدین
بقیه کاراکترهای استفاده شده ی زیر چه کاری انجام میدن؟
"/([\w\-]+\@[\w\-]+\.[\w\-]+)/"
و کاراکترهای دیگه که برای اعتبار سنجی در "نام" و "وب سایت" استفاده شدن چه کاری را انجام میدن؟
قطعا با عبارت منظم آشنا هستید، در زیر مفهوم برخی از علائم عبارات منظم آورده شده است:
ممنون از پاسخ کامل و خوبتون