اعتبارسنجی همزمان فرم با ای جکس (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 و MySQL
آموزش نحوه آپلود فایل با PHP و ای جکس (Ajax)
نمایش زنده آمار و اطلاعات با ای جکس (Ajax)
نمایش داینامیک و صفحه به صفحه مطالب با ای جکس (Ajax)
ساخت قابلیت امتیازدهی با PHP و Ajax


اگه بخوایم اطلاعاتی که کاربر مثلا تو فیلد کد ملی وارد می کنه رو بره و تو پایگاه داده بگرده و اگه تکراری بود نگذاره فرم submit بشه ولی اگه تکراری نبود فرم submit بشه. ممنون میشم کمکم کنید.
این کار در تئوری چندان پیچیده نیست، باید پس از ارسال فرم با آژاکس در سرور با php و mysql بررسی کنید و با توابعی مثل mysql_num_rows تعداد ردیف های موجود متشابه را به دست آورید، اگر ردیف مشابه وجود داشت، یک عبارت به عنوان خطا برای خروجی ارسال کنید و در سمت کاربر در آژاکس خطا را به کاربر نشان دهید، اگر کد ملی وجود نداشت ابتدا در سمت سرور کد جدید را ذخیره کنید و سپس در پاسخ عبارتی مبنی بر ثبت شدن کد ملی ارسال کنید.
نوشتن این کد در این قسمت امکان پذیر نیست، باید خودتان نمونه کدی بنویسید و اگر مشکل داشتید مطرح کنید.
من برای فرمی اعتبار سنجی توسط آژاکس ایجاد کردم
حال توسط تابع responseText مقدار دستوراتی که در php نوشتم مثلا اگر نام کاربری خالی بود = 1 و رمز عبور خالی بود = 2 و ... برمی گردونه که مرتبط با اون هم اخطار میده
و کاملا هم درست است.
اما مشکلم انجاست وقتی تو دستورات php به بانک وصل میشم و می خوام وقتی که نام کاربری یا رمز عبور درست نبود یک مقداری رو چاپ کنه مثلا 3 که تو آژاکس فراخوانی کنه و اخطار بده کار نمی کنه یا اصلا وقتی که نام کاربری و رمز عبور رو درست وارد می کنم به اون صفحه ای که می خوام بره نمیره یعنی کار نمی کنه
خواهش می کنم در صورت امکان راهنماییم کنید
یا گر میشه مثالی برای ارتباط آژاکس با php که با بانک سر و کار داشته باشه بزنید
ممنون از زحماتتون
اگر خروجی کد php شما توسط آژاکس و در سمت کاربر به درستی قابل تجزیه است، کار سختی برای پایگاه داده ندارید، در واقع باید برای عدد 3 که در مشکل اشاره کردید روندی مشابه تعریف کنید، به عبارت دیگر آنچه برای آژاکس مهم است عددی است که کد php برمی گرداند، حال این عدد می تواند بر اثر تجزیه تحلیل پرس و جوهای دیتابیس باشد یا اینکه خود php و به فرض با توابع و دستورات ساده خروجی داده شود، نتیجه اینکه ابتدا باید ببینید خروجی کد php شما چیست و در ثانی در سمت کاربر (کد آژاکس) چگونه آن خروجی را مدیریت می کنید.
به هر صورت رفع دقیق مشکل بدون دیدن سورس کدها و آزمایش و خطا امکان پذیر نیست.
فکر نمیکردم اینقدر زود جوابمو بدین
-------------------------------------------
بنظر شما از اسکریپت استفاده کنم امنیت رو پایین نمیاره یا با همون php بنویسم .
منظور شما این بود که وقتی که کاربر جاوااسکریپتش غیر فعال بود اخطار بده ؟
تو این نوع اعتبار سنجی ها وقتی که جاوا اسکریپت سیستم را غیر فعال کنیم کار نمی کنند. حال راه حلی داره بجز سمت سرور یعنی php که همون لحظه اخطار نمایش داده بشه ؟
خیر، تقریبا اکثر زبان ها و روش های اعتبارسنجی سمت کاربر و وابسته به مرورگر نیاز به فعال بودن جاوا اسکریپت دارند، البته بدون جاوا اسکریپت هم در حد خیلی محدود می توان این کار را انجام داد، به طور مثال maxlength در فرم های وب خود یک نوع اعتبارسنجی است، اما در کل پاسخ پرسش شما خیر است؛ شاید بهترین گزینه استفاده از تگ noscript باشد تا کاربر جاوا اسکریپت را در مرورگر فعال کند.
اگه ممکنه مرحله بعدی که درج در دیتابیس هست هم توضیح بدین
من این کد نوشتم اما به ازای هر تکست فیلد که اعتبار سنجی میشد، در صورت صحت یک رکورد به اون فیلد در جدول اضافه میکنه و یکبار هم در انتها.
اگه ممکنه کمک کنید
require("config/config.php");
$insert = "INSERT INTO `table` (name,email)
VALUES ('$name','$email'')";
mysql_query($insert) or die(mysql_error());
if(mysql_affected_rows()>0)
{
print(" ثبت نام با موفقیت انجام شد ");
exit();
}
else{
print(" ثبت نام ناموفق بود ");
exit();
}
mysql_close();
بهتر است ابتدا از معتبر بودن تمام فیلدها اطمینان حاصل کنید، سپس اگر مشکلی وجود نداشت مقادیر را در یک پرس و جو در دیتابیس ذخیره کنید، در این مورد در مطالب بخش آموزش کاربردی mysql مثال های زیادی وجود دارد.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.