اعتبارسنجی همزمان فرم با ای جکس (Ajax) و PHP

استفاده از ای جکس (Ajax) به جهت قابلیت منحصر به فرد آن یعنی عدم نیاز به بارگذاری مجدد صفحه وب و رفرش کامل می تواند در بسیاری از مواقع و بنا بر نیاز برنامه نویسان کاربردی و رهگشا باشد، یکی از این موارد اعتبارسنجی فرم های وب پیش از ارسال و حین تکمیل است، همان طور که می دانیم اعتبارسنجی به فرآیند بررسی معتبر بودن داده های ارائه شده توسط کاربر یا تطبیق آنها با الگوهای مورد انتظار گفته می شود که در مجموع در دو حالت سمت کاربر (در مرورگر و با زبان هایی مانند جاوا اسکریپت) یا سمت سرور (در سرور و با زبان های سمت سرور مانند PHP، ASP.NET، Python و...) انجام می شود، اما استفاده از Ajax قابلیت دیگری نیز در اختیارمان قرار می دهد و آن بررسی همزمان فرم های وب در سمت سرور بدون رفرش یا نیاز به بارگذاری مجدد صفحات در سمت کاربر است، به این صورت داده ها حین تکمیل فرم به سرور ارسال، اعتبارسنجی شده و در نهایت پاسخ در سمت کاربر دریافت و نمایش داده شده یا پردازش می شوند.
کد ای جکس (Ajax) برای ارسال اطلاعات فرم
برای ارسال اطلاعات فرم قبل از هر چیز باید موتور پایه مبتنی بر ای جکس (Ajax) را برنامه نویسی کنیم، همان طور که در آموزش های مقدماتی دیدیم درخواست های ای جکس مبتنی بر آبجکت XMLHttpRequest (برای تمام مرورگرها به جزء نسخه های قدیمی اینترنت اکسپلورر) یا ActiveXObject (برای اینترنت اکسپلورر نسخه 7 و ماقبل) هستند، بر همین مبنا در نمونه کد زیر ابتدا با دستورات جاوا اسکریپت اطلاعات فیلدهای فرم دریافت و به سرور ارسال می شوند، پس از ارسال درخواست و تا زمان بازگشت پاسخ از سرور پیام یا تصویری مبنی بر درحال پردازش بودن درخواست نمایش داده و در نهایت پاسخ سرور را تجزیه تحلیل یا در بلاک div خروجی می دهیم:
<script>
function ajaxRequest(input_name, input_value, div_id){
var form_value = input_name + "=" + input_value;
var loading_message = '<img src="loading.gif" alt="loading" height="16" width="16"> لطفا کمی صبر کنید...';
var xmlhttp;
if(window.XMLHttpRequest){
//IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
//IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState < 4){
document.getElementById(div_id).innerHTML = loading_message;
} else if(xmlhttp.readyState === 4 && xmlhttp.status === 200){
document.getElementById(div_id).innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("POST","ajax-validate.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(form_value);
}
</script>
توضیح:- تابع اصلی کد ajaxRequest (نام دلخواه) است و از سه آرگیومنت استفاده می کند که به ترتیب شامل نام فیلد مورد نظر، مقادیر و آی دی فیلد می شوند، این آرگیومنت ها در قسمت های مختلف تابع استفاده شده اند.
- در متغیر form_value پارامتر و مقادیر را برای ارسال از طریق متد xmlhttp.send آماده می کنیم، به طور مثال اگر input_name برابر usertext باشد و input_value برابر 1، مقادیر متغیر form_value به صورت usertext=1 خواهد بود، به این صورت در سمت سرور می توانیم اطلاعات را با متد POST دریافت کنیم، به طور مثال:
<?php
$usertext = $_POST['usertext'];
?>
- متغیر loading_message برای نمایش تصویر و پیام "در حال پردازش ..." یا "لطفا کمی صبر کنید..." در حالتی که xmlhttp.readyState < 4 است استفاده می شود.- با توجه به تنظیمات قسمت xmlhttp.open اطلاعات فیلدهای فرم با متد POST به فایل ajax-validate.php ارسال می شوند.
- در نهایت نیز پاسخ سرور با متد responseText دریافت و با innerHTML در بلاک div هدف (که آی دی آن را با آرگیومنت div_id دریافت کرده ایم) خروجی داده می شود.
نحوه استفاده و فراخوانی تابع ای جکس
برای اینکه موتور ای جکس ما به کار بیفتد لازم است که با استفاده از رویدادهای جاوا اسکریپتی نظیر onkeyup یا onchange تابع را فراخوانی کنیم، در نمونه کدهای زیر از رویداد onchange بدین منظور استفاده کرده ایم:
<form action="ajax-validate.php" method="post">
<label for="usertext">اعتبار سنجی عدد بودن مقادیر:</label><br>
<input type="text" name="usertext" id="usertext" dir="ltr" onchange="ajaxRequest('usertext', this.value, 'showresult-1');">
<div class="inline" id="showresult-1"></div>
<br><br>
<label for="usermail">اعتبار سنجی معتبر بودن ایمیل:</label><br>
<input type="text" name="usermail" id="usermail" dir="ltr" onchange="ajaxRequest('usermail', this.value, 'showresult-2');">
<div class="inline" id="showresult-2"></div>
<br><br>
<label for="usersite">اعتبار سنجی معتبر بودن آدرس سایت:</label><br>
<input type="text" name="usersite" id="usersite" dir="ltr" onchange="ajaxRequest('usersite', this.value, 'showresult-3');">
<div class="inline" id="showresult-3"></div>
</form>
توضیح:- همان طور که گفتیم برای هر فیلد تابع ajaxRequest را با سه آرگیومنت متفاوت فراخوانی می کنیم که آرگیومنت اول نام فیلد، آرگیومنت دوم مقادیر فیلد و آرگیومنت سوم آی دی بلاک div است که قصد داریم نتیجه را در آن نمایش دهیم، به این صورت مواد اولیه به تابع داده شده و تابع پس از آماده سازی پارامترها و مقادیر درخواست را به سرور ارسال می کند، در نهایت پاسخ سرور در بلاک div (که آی دی آن را با آرگیومنت div_id تنظیم کرده ایم) خروجی داده می شود.
- در این مثال از رویداد onchange استفاده کرده ایم که بنا به نیاز می توانیم از سایر رویدادها مانند onkeyup، onblur، onfocus و... نیز استفاده کنیم.
کد PHP برای پردازش اطلاعات ارسالی
با توجه به هدفمان از اعتبارسنجی شکل برنامه نویسی سمت سرور نیز متفاوت خواهد بود، برای نمونه در مثال زیر سه فیلد را از لحاظ اینکه مقادیر ارسال شده عدد، آدرس ایمیل معتبر و یا آدرس وبسایت یا وبلاگ باشد بررسی و نتیجه را چاپ کرده ایم:
<?php
@$usertext = $_POST['usertext'];
@$usermail = $_POST['usermail'];
@$usersite = $_POST['usersite'];
if(isset($usertext) && is_numeric($usertext)){
echo '<div class="result-true">عبارت وارد شده یک عدد است!</div>';
} elseif(isset($usertext) && !is_numeric($usertext)){
echo '<div class="result-false">عبارت وارد شده یک عدد نیست!</div>';
}
if(isset($usermail) && preg_match("/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i", $usermail) > 0){
echo '<div class="result-true">ایمیل وارد شده معتبر است!</div>';
} elseif(isset($usermail) && preg_match("/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i", $usermail) == 0){
echo '<div class="result-false">ایمیل وارد شده معتبر نیست!</div>';
}
if(isset($usersite) && preg_match("/^\S+\.\S+.+$/i", $usersite) > 0){
echo '<div class="result-true">آدرس سایت وارد شده معتبر است!</div>';
} elseif(isset($usersite) && preg_match("/^\S+\.\S+.+$/i", $usersite) == 0){
echo '<div class="result-false">آدرس سایت وارد شده معتبر نیست!</div>';
}
?>
توضیح:- متغیر usertext به لحاظ اینکه یک مقدار عددی باشد یا خیر بررسی می شود، در این بررسی از تابع is_numeric در PHP استفاده کرده ایم.
- متغیر usermail به لحاظ اینکه آدرس ایمیل معتبر باشد بررسی می شود، در اینجا از تابع preg_match و یک الگو بر اساس عبارات باقاعده (Regular Expression) استفاده کرده ایم.
- متغیر usersite نیز به لحاظ پیروی کردن از الگوی صحیح آدرس وبسایت بررسی می شود، در اینجا نیز از تابع preg_match و الگو بر اساس عبارات باقاعده (Regular Expression) استفاده کرده ایم.
نکته 1: تابع preg_match با توجه به الگوی در نظر گرفته شده رشته ارسالی را بررسی می کند، اگر مقادیر ارسال شده مطابق با الگو باشد، مقدار 1 (یا true) و در غیر این صورت مقدار 0 (یا false) را برمی گرداند.
نکته 2: علامت @ در ابتدای متغیرها برای جلوگیری از نمایش خطاها و نادیده گرفته شدن آنها در PHP است.
کد و پیش نمایش آنلاین
در ادامه کد نهایی و پیش نمایش آنلاین اعتبارسنجی همزمان فیلدهای فرم با ای جکس (Ajax) و PHP را جهت تست و بررسی بیشتر درج کرده ایم:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | اعتبارسنجی فرم های وب با ای جکس</title>
<!-- Webgoo.ir -->
<style>
body {
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
direction: rtl;
}
.inline {
display: inline-block;
}
.result-true {
color: #090;
}
.result-false {
color: #C00;
}
</style>
<script>
function ajaxRequest(input_name, input_value, div_id){
var form_value = input_name + "=" + input_value;
var loading_message = '<img src="loading.gif" alt="loading" height="16" width="16"> لطفا کمی صبر کنید...';
var xmlhttp;
if(window.XMLHttpRequest){
//IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
//IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState < 4){
document.getElementById(div_id).innerHTML = loading_message;
} else if(xmlhttp.readyState === 4 && xmlhttp.status === 200){
document.getElementById(div_id).innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("POST","ajax-validate.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(form_value);
}
</script>
</head>
<body>
<noscript>
جاوا اسکریپت در مرورگر شما غیرفعال است یا پشتیبانی نمی شود!<br>
</noscript>
<form action="ajax-validate.php" method="post">
<label for="usertext">اعتبار سنجی عدد بودن مقادیر:</label><br>
<input type="text" name="usertext" id="usertext" dir="ltr" onchange="ajaxRequest('usertext', this.value, 'showresult-1');">
<div class="inline" id="showresult-1"></div>
<br><br>
<label for="usermail">اعتبار سنجی معتبر بودن ایمیل:</label><br>
<input type="text" name="usermail" id="usermail" dir="ltr" onchange="ajaxRequest('usermail', this.value, 'showresult-2');">
<div class="inline" id="showresult-2"></div>
<br><br>
<label for="usersite">اعتبار سنجی معتبر بودن آدرس سایت:</label><br>
<input type="text" name="usersite" id="usersite" dir="ltr" onchange="ajaxRequest('usersite', this.value, 'showresult-3');">
<div class="inline" id="showresult-3"></div>
</form>
<br>
<hr>
پس از تایپ یک عبارت در هر فیلد، در فیلد بعدی یا فضای خالی صفحه کلیک کنید تا رویداد onchange اجرا شود.
</body>
</html>
پیش نمایش آنلاین
ساخت قابلیت امتیازدهی با PHP و Ajax
آموزش نحوه آپلود فایل با PHP و ای جکس (Ajax)
نمایش داینامیک و صفحه به صفحه مطالب با ای جکس (Ajax)
لیست داینامیک پیشنهاد کلمات، مبتنی بر ای جکس، PHP و MySQL
ارسال اطلاعات فرم با ای جکس (Ajax) و نمایش پیام در حال پردازش


اعتبارسنجی به تنهایی با ایجکس یا php معایبی داره که این مشکل با اعتبارسنجی همزمان حل شده
بسیار عالی
ممنون از محبتتون
این گونه موارد نیازمند نوشتن الگوریتم ها و توابعی (با PHP یا JavaScript) است تا تمام موارد را به صورت هوشمندانه سنجش کند، هر چند انتشار این آموزش در کوتاه مدت میسر نیست، اما ممکن است در آینده آموزشی در این رابطه منتشر کنیم.
کد جاوا اسکریپت مربوطه رو کاملا متوجهم اما کجا باید پاسخ سرور رو تجزیه تحلیل کنم و کد جاوا رو کجا به کار ببرم. مثلا من میخوام در صورت داشتن خطا یه پیام خطا ارائه بشه و با صحیح بودن، رنگ فیلد سبز بشه.
دقیقتر بگم. میخواهم برای ارسال فرم از یه رویداد onclick استفاده کرده و با جاوا رنگ فیلدها رو چک کنم که اگه رنگ همه فیلدها مثلا سبز نباشه از ارسال فرم جلوگیری بشه.
ممکن هست یا نه ؟
درضمن "معرکه و محشرید" متشکر
xmlhttp.responseText
قرار دارد که متناسب با هدف ما می تواند هر چیزی باشد، به فرض اعدادی از 0 تا 3، سپس در تابع آژاکسی می توان این مقدار را به فرض به یک متغیر نسب داد و متغیر را در یک شرط if و else یا switch و case سنجید، به طور مثال:if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
var element_id = 'input_id';
var response = xmlhttp.responseText;
switch(response){
case '0':
document.getElementById(element_id).style.borderColor = '#FF0000';
break;
case '1':
//
break;
case '2':
//
break;
}
}
در واقع اعتبار سنجی اصلی در سرور انجام می شود، به هر صورت به نظر منظور شما اعتبارسنجی سمت کاربر توسط جاوا اسکریپت است که در این صورت آموزش جداگانه ای برای آن در سایت وجود دارد، عبارت "اعتبار سنجی" را در قسمت جستجو وارد کنید.میخواستم بدونم آیا میشه به همراه بازخورد از طرف پی اچ پی،
border-color
مربوط به فیلد هم تغییر کنه. مثلا اگه پیغام خطا داشته باشه رنگ کادر فیلد قرمز و اگه درست باشه رنگ کادر فیلد سبز بشه.بله، این کار با دستورات جاوا اسکریپتی امکان پذیر است، به طور مثال:
var element_id = 'input_id';
document.getElementById(element_id).style.borderColor = '#FF0000';
می توانید در سمت کاربر پاسخ سرور را به یک آرایه تجزیه کنید ، یا به فرض به صورت عدد 0 و 1 نتیجه را برگردانید و با دستورات شرطی آن را تحلیل کرده و متناسب با نتیجه، رفتاری منطقی برای کدهای خود تعریف کنید.کاش میشد این مطالب رو برای وبلاگ نویس ها هم آموزش بدین
ما که سرور php نداریم
من فرم html رو طراحی کردم
php رم طراحی کردم
ولی نمیدونم الان تو اکشن html آدرس php اعتبار سنجی رو چطور وارد کنم؟
php رو آپلود کردم و ادرسش رو گذاشتم تو اکشن html ولی نمیشه کار نمیکنه :(
همان طور که اشاره کردید، برای اجرای فایل های PHP نیاز به یک سرور است، نمی توانید فایل های سمت سرور که به زبان PHP، ASP و... هستند را در سرویس های معمولی اجرا کنید! به عبارت دیگر سرویس های وبلاگی این امکان را ندارند که کدهای PHP را پشتیبانی کنند، یا باید هاست خریداری کنید یا از سرویس های رایگان با قابلیت پشتیبانی PHP استفاده کنید.
برای این موارد باید از اعتبار سنجی جاوا اسکریپت استفاده کنید که در بخش آموزش های کاربردی توضیح داده شده است.
فقط با این مثال اگه فرممون submit داشته باشه میره به صفحه validate و همون متن های اون صفحه مثل " عبارت وارد شده یک عدد نیست! " چاپ میشه! اما من نمیخوام به هیچ صفحه ای بره باید چی کار کنم! تشکر
آژاکس به تنهایی نمی تواند مانع ارسال فرم شود، باید از جاوا اسکریپت و رویداد onsubmit نیز استفاده کنید، جهت آشنایی بیشتر به مطلبی با عنوان "اعتبار سنجی فرم های وب با جاوا اسکریپت" در قسمت آموزش های کاربردی جاوا اسکریپت مراجعه کنید.
if(inputname == 'userpass_confirm'){
var userpass = "&userpass="+document.getElementById('userpass').value;
}
else{
var userpass = '';
}
var formvalue = inputname+"="+inputvalue.value+userpass;
به این ترتیب هر زمان بر روی فیلد userpass_confirm رویداد onchange اجرا شود، تابع مقادیر فیلد userpass را هم به سرور ارسال می کند.if($pass === $pass_confirm){
echo 'کلمه عبور با تکرار آن همخوانی دارد';
}
برای بررسی میزان کاراکتر یک رشته نیز از strlen و نمونه کد زیر استفاده کنید:$strlen = strlen($pass);
if($strlen <= 5){
echo 'کلمه عبور نباید کمتر از 6 کاراکتر باشد';
}
<?php
function strSplitUTF8($str) {
$split = 1;
@$array = array();
for($i = 0; $i < strlen($str);) {
$value = ord($str[$i]);
if($value > 127) {
if($value >= 192 && $value <= 223)
$split = 2;
elseif($value >= 224 && $value <= 239)
$split = 3;
elseif($value >= 240 && $value <= 247)
$split = 4;
} else {
$split = 1;
}
$key = null;
for($j = 0; $j < $split; $j++, $i++) {
$key .= $str[$i];
}
array_push($array, $key);
}
return $array;
}
function isPersian($str) {
/* function by: http://webgoo.ir */
$persian_status = true;
$str_to_array = strSplitUTF8($str);
foreach($str_to_array as $key => $value) {
if($value == ' ') {
unset($str_to_array[$key]);
}
}
$persian_alphabet = array('ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی', 'ء', 'آ', 'اً', 'َ', 'ِ', 'ًُ', 'ي');
foreach($str_to_array as $key => $value) {
if(!in_array($value, $persian_alphabet)) {
$persian_status = false;
}
}
return $persian_status;
}
//نحوه استفاده
$username = 'نام کاربری';
if(isPersian($username) == true) {
echo 'Valid: این نام کاربری فارسی و قابل ثبت است';
} else {
echo 'Invalid: این نام کاربری فارسی نیست یا دارای کاراکترهای غیر مجاز است';
}
?>
تابع اول برای تجزیه حرف به حرف کلمات فارسی است و در تابع دوم حروف بررسی می شوند، اگر حرفی جزء حروف الفبای فارسی نبود، تابع isPersian مقادیر false را برمی گرداند و اگر کلمه فارسی بود، true را برمی گرداند، به این ترتیب می توانید به کاربران اجازه ثبت نام کاربری فارسی را بدهید.نکته: برای اینکه کاربران بتوانند هم کاراکترهای انگلیسی و هم فارسی را استفاده کنند، باید از این تابع در کنار سایر روش های اعتبار سنجی استفاده کنید، یعنی کاربر هم مجاز به استفاده از کاراکترهای مجاز انگلیسی باشد و هم فارسی (استفاده ترکیبی مجاز نیست)، به فرض:
if(isset($username) && (preg_match("/^[a-zA-Z0-9]+$/", $username) > 0) || isPersian($username) == true){
echo 'Valid: این نام کاربری قابل ثبت است';
}
روش دوم ساده است و در آن از modifier u استفاده می کنیم:<?php
$str = 'متن فارسی';
if(preg_match('/^[آ-ی\s]+$/u', $str)){
echo 'Valid' . '<br>';
}
else{
echo 'Invalid' . '<br>';
}
?>
میشه کد اعتبار سنجی اینکه فقط استفاده از عدد و حروف مجاز باشه و چیزه دیگه ای مجاز نباشه مثلا ( ' " @ $ % # ) مثلا من یه فرم لوگین می خوام طراحی کنم و از این کد تو اون استفاده کنم اگه میشه برام میل کنین یا تو سایت آموزش بدین
با تشکر
برای این کار کافی است از تابع preg_match مطابق الگوی زیر استفاده کنید:
preg_match("/^[a-zA-Z0-9]+$/", $username)
اگر رشته ارسالی دارای کاراکتری خارج از 0-9 a-z یا A-Z باشد تابع عدد 0 و در غیر این صورت عدد 1 را برمی گرداند، به طور مثال:if(isset($username) && preg_match("/^[a-zA-Z0-9]+$/", $username) == 1){
echo "<div class=\"result-true\">نام کاربری وارد شده معتبر است!</div>";
}
elseif(isset($username) && preg_match("/^[a-zA-Z0-9]+$/", $username) == 0){
echo "<div class=\"result-false\">نام کاربری وارد شده معتبر نیست!</div>";
}
البته دقت کنید که در قسمت دریافت متغیرها در php (قسمت POST) و همچنین فرم html موارد مربوط به نام فیلد و آی دی و... را متناسب با نام متغیر جدید (username) تعریف کرده باشید.من اعتبار سنجی رو طبق دستور درست کردم همچیش درسته ولی وقتی می خوام که روی گزینه بعد کلیک کنم فرم ها دو تا میشن یعنی عین 3 تا تکست دیگه رو صفحه کپی میشه
به احتمال زیاد قسمتی را اشتباه انجام داده اید، دقت کنید که نام گذاری فیلد ها و فراخوانی آنها درست و مطابق الگو انجام شده باشد، در واقع مرورگر هیچ کاری را بی علت انجام نمی دهد، باید ببینید کجای کد ایراد دارد، در صورت تمایل می توانید آن را به ایمیل ما بفرستید تا بررسی کنیم.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.