PDA

View Full Version : راهنمایی برای ساخت کلاس برای Form Validation



sargardoon
شنبه 06 فروردین 1390, 16:41 عصر
سلام دوستان
من زیاد از کلاس سر در نمیارم و فعلا یه چیزهای ابتدایی یاد گرفتم کمکی میخواستم اگر ممکنه راهنمایی ام کنید.


<?php
include "validation.php";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Class :: Validation Form</title>
</head>
<body>
<form action="" method="post">
<?php echo error_msg("general"); ?>
<table border="0" cellpadding="2" cellspacing="2">
<tr>
<td>Name:</td>
<td>
<input type="text" name="name" /><br />
<?php echo error_msg("name"); ?>
</td>
</tr>
<tr>
<td>email:</td>
<td>
<input type="text" name="email" /><br />
<?php echo error_msg("email"); ?>
</td>
</tr>
<tr>
<td>website:</td>
<td>
<input type="text" name="website" /><br />
<?php echo error_msg("website"); ?>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="submit" value=" Register " /></td>
</tr>
</table>
</form>
</body>
</html>


<?php

$errors = array();

if (isset($_POST['submit'])) {
$name = $_POST['name'];
$email = $_POST['email'];
$website = $_POST['website'];

if (strlen(trim($name)) > 0) {
validate('name',$name);
if ($errstatus == 'yes') {
$errors['name'] = "Name must be from letters, dashes, spaces and must not start with dash";
}
} else {
$errors['name'] = "First name cannot be blank, Please enter your first name";
}

if (strlen(trim($email)) > 0) {
validate('email',$email);
if ($errstatus == 'yes') {
$errors['email'] = "Please enter valid e-mail address";
}
} else {
$errors['email'] = "E-mail cannot be blank, Please Enter valid e-mail address";
}

if (strlen(trim($website)) > 0) {
validate('website',$website);
if ($errstatus == 'yes') {
$errors['website'] = "Please enter valid website address. with http://";
}
}

if (count($errors)== 0){
echo '<h3>You have registered successfully</h3>';
} else {
$errors['general'] = "Please fill the required field";
}

}

// Print Error message
function error_msg($error_name){
global $errors;
if($errors[$error_name]){
return $errors[$error_name];
} else {
return "";
}
}


function validate($string, $fldname){
global $errstatus;
switch ($string) {
case ('name'):
$pattern = "#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r\\'\-\_\.\:\,0-9a-zA-Z]+$#u";
break;

case ('email'):
$pattern = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/";
break;
break;

case ('website'):
$pattern = "#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i";
}

if(preg_match($pattern,$fldname) === 0) {
return $errstatus = 'yes';
} else {
return $errstatus = 'no';
}
}

?>

من قبلا از این روش برای ازریابی داده های فورم میکردم حالا میخوام برای اینکه برنامه مرتبط بشه از کلاس استفاده کنم ولی متاسفانه هرچقدر باهاش کلنجار رفتم زیاد متوجه نشدم ممنون میشم که راهنمایی کنید.

اگر توجه کنید در مثال بالا اطلاعات برای اسم و ایمیل الزامی هستش ولی برای وبسایت الزامی نیست، ولی اگر اطلاعاتی در آن نوشته شد چک میکنه آیا این آدرس درست یا نه؟

sargardoon
شنبه 06 فروردین 1390, 19:12 عصر
کسی نبود یه راهنمایی بکنه؟ به شدت لازمش دارم

Cyletech
یک شنبه 07 فروردین 1390, 11:24 صبح
شی ء گرایی خیلی آسون و جذابه و خیلی هم خوب. پیشنهاد می کنم سریع تر یاد بگیرید. اگر کد PHP تون رو بخوایم داخل کلاس بکار ببریم اینطوری میشه.




<?php





class Validation {





public $errors = array();


public $name;


public $email;


public $website;


public $errstatus;





public function CheckValue() {


if (isset($_POST['submit'])) {


$this->name = $_POST['name'];


$this->email = $_POST['email'];


$this->website = $_POST['website'];





if (strlen(trim($this->name)) > 0) {


validate('name',$this->name);


if ($this->errstatus == 'yes') {


$this->errors['name'] = "Name must be from letters, dashes,
spaces and must not start with dash";


}


} else {


$this->errors['name'] = "First name cannot be blank, Please enter
your first name";


}





if (strlen(trim($this->email)) > 0) {


validate('email',$this->email);


if ($this->errstatus == 'yes') {


$this->errors['email'] = "Please enter valid e-mail
address";


}


} else {


$this->errors['email'] = "E-mail cannot be blank, Please Enter
valid e-mail address";


}





if (strlen(trim($this->website)) > 0) {


validate('website',$this->website);


if ($this->errstatus == 'yes') {


$this->errors['website'] = "Please enter valid website
address. with http://";


}


}





if (count($this->errors)== 0){


echo '<h3>You have registered successfully</h3>';


} else {


$this->errors['general'] = "Please fill the required field";



}





}


}





public function PrintMsg( $error_name ) {


if($this->errors[$error_name]){


return $this->errors[$error_name];


} else {


return "";


}


}





public function validatation($string, $fldname){


switch ($string) {


case 'name':


$pattern =
"#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r\\'\-\_\.\:\,0-9a-zA-Z]+$#u";


break;





case 'email':


$pattern =
"/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/";


break;





case 'website':


$pattern = "#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i";



break;


}





if(preg_match($pattern,$fldname) === 0) {


return $this->errstatus = 'yes';


} else {


return $this->errstatus = 'no';


}


}


}





?>


حالا کافیه جایی که میخوای از محتوای این کلاس استفاده کنی اول باید اینکلودش کنی بعد از کلاست یک شیء بسازی که باید اینطوری عمل کنی:

require_once( 'file_name.php' );



$Validate = new Validation();
بعد هرجا که بخوای بری داخل تابعی و از محتواش استفاده کنی باید مثلاً اینطوری عمل کنی:


$Validate->function_name(expressions);
function_ name نام تابع هست و expression رو گذاشتم تا در صورتی که اگر قرار بود از بیرون چیزی دریافت کنه شما وارد کنید مثل تابع PrinMsg و اگر نداشت باید داخلش خالی بمونه و پرانتز ها باشه!

sargardoon
یک شنبه 07 فروردین 1390, 17:22 عصر
ممنونم از راهنماییتون ولی من خودم به روش دیگری نوشتم که بصورت زیر میباشد:

$errors = array();

if (isset($_POST['submit'])) {
$name = $_POST['name'];
$email = $_POST['email'];
$website = $_POST['website'];


if ( validation::blank_field($name) == TRUE){
$errors['name'] = "First name cannot be blank, Please enter your first name";
} else {
if ( validation::validateData($name, 'name') == TRUE){
$errors['name'] = "Name must be from letters, dashes, spaces and must not start with dash";
} else {
echo '<h4>Your name is: '.$name.'</h4>';
}
}

if ( validation::blank_field($email) == TRUE){
$errors['email'] = "E-mail cannot be blank, Please Enter valid e-mail address";
} else {
if ( validation::validateData($email, 'email') == TRUE){
$errors['email'] = "Please enter valid e-mail address";
} else {
echo '<h4>Your Email is: '.$email.'</h4>';
}
}

if (strlen(trim($website)) > 0 ) {
if ( validation::validateData($website, 'website') == TRUE){
$errors['website'] = "Please enter valid website address. with http://";
} else {
echo '<h4>Your Website is: '.$website.'</h4>';
}
}

if (count($errors)== 0){
echo '<h3>You have registered successfully</h3>';
} else {
$errors['general'] = "Please fill the required field";
}

}

// Print Error message
function error_msg($error_name){
global $errors;
if($errors[$error_name]){
return $errors[$error_name];
} else {
return "";
}
}

کلاس رو هم به این صورت نوشتم:

class validation
{

public static function blank_field($string) {
if (strlen(trim($string)) < 1) {
return TRUE;
} else {
return FALSE;
}
}

public static function validateData ($string, $type) {
switch ($type) {
case ('name'):
$pattern = "#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r\\'\-\_\.\:\,0-9a-zA-Z]+$#u";
break;

case ('email'):
$pattern = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/";
break;

case ('website'):
$pattern = "#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i";
break;

}

if(preg_match($pattern, $string) === 0) {
return TRUE;
} else {
return FALSE;
}

}
}

حالا توی این فکرم که چطور میشه باز هم جمع و جورترش کرد. مثلا اینکه
1. بعد از چک کردن اینکه فیلد خالی نیست، مقدار داده رو بررسی کنه که آیا معتبر هستش؟؟؟
2. یه کلاسی درست کنم که تمامی پیامهای خطا با شماره درست کنم و در برنامه نشون بدم،

Mr.Moghadam
یک شنبه 07 فروردین 1390, 17:57 عصر
سلام
این کلاسی که شما نوشتید زیاد بهینه نیست
اگر خطاها رو هم در خود کلاس مدیریت کنید خیلی بهتره چون اگر شما دوباره بخواید از این کلاستون استفاده کنید باید تمام کدهایی که خارج از کلاس نوشتید رو هم درباره بنویسید.
روی همین کار کن و از کلاسهای زیادی که توی اینترنت هست ایده بگیر و کلاسی رو که خودت دوست داری و توی کار باهاش راحت تری رو ایجاد کن اما بهینه و کارامد
موفق باشی

sargardoon
یک شنبه 07 فروردین 1390, 18:07 عصر
سلام
این کلاسی که شما نوشتید زیاد بهینه نیست
اگر خطاها رو هم در خود کلاس مدیریت کنید خیلی بهتره چون اگر شما دوباره بخواید از این کلاستون استفاده کنید باید تمام کدهایی که خارج از کلاس نوشتید رو هم درباره بنویسید.
روی همین کار کن و از کلاسهای زیادی که توی اینترنت هست ایده بگیر و کلاسی رو که خودت دوست داری و توی کار باهاش راحت تری رو ایجاد کن اما بهینه و کارامد
موفق باشی

این اولین کدی هستش که برای کلاس نوشتم و هنوز اول کارم، اتفاقا در فکر این هستم که یه بار بیشتر کلاس رو برای هر فیلد فرا خوانی نکنم، ممنون میشم اگر کدی مشابه این سراغ دارید راهنمایی کنید،
یه چیزی میخوام که بتوانم خطاها را هم تولید کنم و از اون در جاهای دیگر هم استفاده کنم

Cyletech
یک شنبه 07 فروردین 1390, 19:38 عصر
حالا توی این فکرم که چطور میشه باز هم جمع و جورترش کرد.
چون توی این فکری می تونم بهت اشکالات کلاست رو بگم که میتونه در جمع و جور شدنش و بهینه تر شدنش کمکت کنه. اول اینکه چون شروط if یک خطی هستند و بهتره از else هم استفاده نشه ، بهتره از if یک خطی استفاده کنی مثل زیر:



($x === $y)?TRUE:FALSE




بعد از چک کردن اینکه فیلد خالی نیست، مقدار داده رو بررسی کنه که آیا معتبر
هستش؟؟؟
کافیه چک کنی اگر فیلد خالی نبود !empty( $_POST['field_name'] ) بعد تو دستورات مثل تابع ValidateDate عمل کنی یعنی مقدار رو محدود کنی.



یه کلاسی درست کنم که تمامی پیامهای خطا با شماره درست کنم و در برنامه نشون بدم.
اگر در همین کلاس بخوای اینکارو کنی که کافیه بعد از class یک متغیر بسازی و دسترسی public بهش بدی و برابر آرایه قرار بدی. اونوقت هر جا که خطا رخ میده یک عدد بهش خاص و غیر تکراری بهش اختصاص بده. اونوقت هر جا که بخوای خطای مربوط به مثلاً تابعی رو نمایش بدی کافیه فرضاً چاپ کنی $this->errornum[2] یا شبیه این عمل کنی.
راه بعدی برای بهینه سازی کردن کلاست اینه که بجای اینکه بیای طول رشته رو ببینی و کوچکتر از عددی قرار بدی که منظورت این باشه که آیا وجود داره یا نه بهتره از isset() استفاده کنی در صورتی که بخوای ببینی وارد شده یا نه ولی اگر بخوای ببینی خالیه نباشه باید از empty() استفاده کنی:قلب:

sargardoon
دوشنبه 08 فروردین 1390, 18:51 عصر
ممنونم دوست عزیز آخرش اون چیزی که میخواستم ساختم :لبخند:

این هم نمونه کلاسی که ساختم:

<?php

class Validation
{
public $errors = array();

public function isValidStr($strVal, $strType, $minChar=2, $maxChar = 1000) {
if(strlen($strVal) < intval($minChar)) {
$this -> setError($strType, ucfirst($strType)." must be at least {$minChar} characters long.");
} elseif (strlen($strVal) > intval($maxChar)) {
$this -> setError($strType, ucfirst($strType)." must be less than {$maxChar} characters long.");
} else {
// validate data entry
$pattern = "#^[\s\x{0621}-\x{063A}\x{0640}-\x{0691}\x{0698}-\x{06D2}\x{06F0}-\x{06F9}\x{0661}-\x{0669}0-9\n\r\\'\-\_\.\:\,0-9a-zA-Z]+$#u";
if (!preg_match($pattern, $strVal)) {
$this -> setError($strType, ucfirst($strType)." must be from letters, dashes, spaces and must not start with dash");
}
}
}

public function isValidEmail($emailVal) {
if(strlen($strVal) < 0 ) {
$this -> setError('email', 'E-mail Address cannot be blank');
} else {
// validate data entry
$pattern = "/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/";
if (!preg_match($pattern, $emailVal)) {
$this -> setError('email', 'Please enter valid E-mail Address');
}
}
}


public function isValidURL($urlVal) {
if(!empty($urlVal)) {
$pattern = "#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i";
if (!preg_match($pattern, $urlVal)) {
$this -> setError('url', 'Please enter valid URL Address with http://');
}
}
}


public function setError($key, $value) {
$this -> errors[$key] = $value;
}

public function getError($key) {
if ($this -> errors[$key]) {
return $this -> errors[$key];
} else {
return false;
}
}


public function errCount() {
return (count($this -> errors) > 0) ? count($this -> errors) : false;
}
}

?>

این رو هم توی صفحه فرم میذارم

if (isset($_POST['submit'])) {
require_once "validation.class.php";

$name = trim($_POST['name']);
$email = trim($_POST['email']);
$website = trim($_POST['website']);

$validate = new Validation();
$validate -> isValidStr($name, 'name', 2, 32);
$validate -> isValidEmail($email);
$validate -> isValidURL($website);

if (!$validate -> errCount()) {
echo '<h3>You have Successfully Registered</h3>';
echo "Name: {$name} | Email: {$email} | Website: {$website}";
} else {
$errCount = $validate -> errCount();
$errCount = 'There were '.$errCount.' errors, Please fill the required fields';
$errName = $validate -> getError('name');
$errEmail = $validate -> getError('email');
$errURL = $validate -> getError('url');
}
}

با اضافه کردن چند تا ارزیابی دیگه (مثل تاریخ، شماره، پست کد، شماره کارت و ....) میشه اون در همه جا ازش استفاده کرد.

یه سوال آیا با این که فیلتر کردم دیگه هم لازم به sanitize هستش؟ آیا داده هایی که با isValidStr ازیابی میشند لازمه برای ذخیره در دیتابیس باز هم mysql_real_escape_string استفاده بشه؟

ممنونم میشم اگر باز هم اشکاتی داره بهم گوشزد کنید.

Mr.Moghadam
دوشنبه 08 فروردین 1390, 20:13 عصر
سلام
وقت نکردم تستش کنم ولی خیلی خوبه آفرین تا میتونی کاملش کن

در ضمن اسم توابع رو هم کوتاه انتخاب کنی بهتره
مثلا :

$validate -> isValidEmail($email);
رو اگه به صورت زیر بنویسی بهتره :

$validate ->email($email);

البته نامگذاری متغیرها و توابع یه چیز سلیقه ایه .
موفق باشی

sargardoon
دوشنبه 08 فروردین 1390, 21:14 عصر
سلام
وقت نکردم تستش کنم ولی خیلی خوبه آفرین تا میتونی کاملش کن

در ضمن اسم توابع رو هم کوتاه انتخاب کنی بهتره
مثلا :

$validate -> isValidEmail($email);
رو اگه به صورت زیر بنویسی بهتره :

$validate ->email($email);

البته نامگذاری متغیرها و توابع یه چیز سلیقه ایه .
موفق باشی
ممنونم دوست عزیز از راهنماییتون، دلیل اینکه اینطوری اسم گذاری کردم برای خوانا بودن آن بود. دارم قسمتهای دیگه هم کاملش میکنم، این رو تستی نوشتم که بعد تکمیلش کنم.

در این مورد نظری دارید؟

یه سوال آیا با این که فیلتر کردم دیگه هم لازم به sanitize هستش؟ آیا داده هایی که با isValidStr ازیابی میشند لازمه برای ذخیره در دیتابیس باز هم mysql_real_escape_string استفاده بشه؟

Mr.Moghadam
سه شنبه 09 فروردین 1390, 00:18 صبح
شما دونوع ولیدیشن داری

یکی اول اینکه کاربر میخواد تو سایت ثبت نام کنه
1 - اول اینکه فرمت ایلیملش درست باشه
2 - مثلا پسورداش باهم برابر باشه و
3 - . . .
این اعتبار سنجی برای اینه که کابری که ثبت نام میکنه توی فیلدای ورودی هر چی دلش خواست نتونه بنویسه و فرم رو ارسال کنه.

نوع دوم زمانیه که کاربر اطلاعات درست با فرمت درست رو وارد کرد و حالا اطلاعاتش میخواد توی بانک ذخیره بشه.
حالا وقتیه که باید اطلاعاتی رو که کاربر ارسال کرده رو برای ذخیره توی بانک فیلتر و پاک سازی کنی.mysql_real_escape_string

این کلاسی که شما نوشتید برای اعتبار سنجی نوع اول کاربرد داره.برای اعتبار سنجی نوع دوم میتونی کلاسی برای دیتابیس بنویسی که کارهای معمول رو روی دیتابیس انجام بده و اعتبار سنجی نوع دوم رو هم توی همون کلاس انجام بدی.

موفق باشی

sargardoon
سه شنبه 09 فروردین 1390, 02:14 صبح
شما دونوع ولیدیشن داری

یکی اول اینکه کاربر میخواد تو سایت ثبت نام کنه
1 - اول اینکه فرمت ایلیملش درست باشه
2 - مثلا پسورداش باهم برابر باشه و
3 - . . .
این اعتبار سنجی برای اینه که کابری که ثبت نام میکنه توی فیلدای ورودی هر چی دلش خواست نتونه بنویسه و فرم رو ارسال کنه.

نوع دوم زمانیه که کاربر اطلاعات درست با فرمت درست رو وارد کرد و حالا اطلاعاتش میخواد توی بانک ذخیره بشه.
حالا وقتیه که باید اطلاعاتی رو که کاربر ارسال کرده رو برای ذخیره توی بانک فیلتر و پاک سازی کنی.mysql_real_escape_string

این کلاسی که شما نوشتید برای اعتبار سنجی نوع اول کاربرد داره.برای اعتبار سنجی نوع دوم میتونی کلاسی برای دیتابیس بنویسی که کارهای معمول رو روی دیتابیس انجام بده و اعتبار سنجی نوع دوم رو هم توی همون کلاس انجام بدی.

موفق باشی

ممنون از راهنماییتون برنامه بعدی که دارم یه کلاس برای ذخیره، بازیابی، ویرایش و پاک کردن اطلاعات از دیتابیس بنویسم قبلا یه کلاس ساده توی یه آموزش یاد گرفتم که به دیتابیس وصل میشد حالا میخوام اون رو هم کاملاش کنم قبلا اینجا (http://barnamenevis.org/showthread.php?279768-%D9%85%D8%B2%DB%8C%D8%AA-%D8%A7%DB%8C%D9%86-%DA%A9%D9%84%D8%A7%D8%B3-%DA%86%DB%8C%D9%87%D8%9F) در این مورد نوشتم .

یکی از دوستان در یکجا نوشته بود بهتره از روش MVC استفاده بشه که در آینده هم به مشکل برنخوریم که فعلا دارم این روش رو یاد میگیرم.

Mr.Moghadam
سه شنبه 09 فروردین 1390, 02:26 صبح
اینکه از روش mvc استفاده کنید و بهش عادت کنید خیلی عالیه

برای آموزش ساخت یه فریم ورک بر اساس MVC اینجارو (http://barnamenevis.org/showthread.php?277817-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-MVC&highlight=)یه نگا بنداز.