PDA

View Full Version : مبتدی: چك كردن فرم



mirzajavad
دوشنبه 26 مهر 1389, 21:46 عصر
سلام
راستش براي بررسي فرم ها از empty() استفاده ميكردم كه در جوابش بايد dei() بذارم كه نميگذاره قالبم لود بشه اين يك مشكل
بعدش براي بررسي ايميل هم كه از عبارات با قاعده استفاده كردم مجبور شدم از exit استفاده كنم كه اينم همين مشكل رو براي قالبم داره
چون از يك كلاس تمپلت استفاده ميكنم اين مشكلات رو برام به وجود مي ياره
دوستان ممنون ميشم اگر يك راه خوب و اصولي پيشنهاد بدين
با تشكر

xoogle.ir
دوشنبه 26 مهر 1389, 22:23 عصر
خب این 2 تا دستوری که شما استفاده میکنید عملیات پردازش روی متوقف میکنه حالا چه از کلاس تمپلیت استفاده کنید چه نکنید!

برای چاپ پیغام خطا چرا از این راه استفاده میکنید ؟
این بک راه ابتدایی :



if(trim($name) == '') // better than empty()
$nameError = true;
.
.
.
.
if($nameError)
echo 'your error msg';

binyaft
دوشنبه 26 مهر 1389, 22:24 عصر
خوب برای چی پیغام خطا رو echo نمیکنین؟

funpatogh
دوشنبه 26 مهر 1389, 22:36 عصر
خوب این شکلی هم میتونی استفاده کنید


<?php
if(isset($_POST['submit'])){

if(strlen($_POST['email'])==0)
$prompt="error in email<br>";

if(strlen($_POST['username'])==0)
$prompt.="error in username<br>";


}
echo (isset($prompt))?$prompt:"";

?>
<form method="post">
username <input type="text" name="username"><br>
email <input type="text" name="email"><br>
<input type="submit" name="submit" value="submit" name="submit"><br>
</form>

mirzajavad
سه شنبه 27 مهر 1389, 00:23 صبح
funpatogh (http://barnamenevis.org/forum/member.php?u=54136) عزيز من با روش شما تونستم مشكلم رو حل كنم
فقط ممنون ميشم اگر كمي در مورد كدتون توضيح بدين
هر كدوم از نقطه هاي قبل از = رو برداريم مقدارم همون رو مستقيم ميده به ما
ميشه درباره اين نقطه توضيح بدين ؟
و در مورد اون بخشي echo كردين ؟

و نظرتون درباره كد من رو هم بگين



if(isset($_POST['submit'])){
if($fname=="") $error.=$lng['fname'].'<br>';
if($lname=="") $error.=$lng['lname'].'<br>';
if($username=="") $error.=$lng['username'].'<br>';
if($email=="") $error.=$lng['email'].'<br>';
if($password=="") $error.=$lng['password'].'<br>';
if($contact=="") $error.=$lng['contact'].'<br>';
if($city=="") $error.=$lng['city'].'<br>';
}
$MyTpl -> assign('error',$error);

funpatogh
سه شنبه 27 مهر 1389, 01:08 صبح
اون . برای این هستش که اکر کاربر به فرض 3 تا فیلد رو همزمان خالی گزاشت خطای مربوط به هر3 فیلد زیر هم نمایش داده بشه در صورتی که اگر . نباشه فقط یک خطا نمایش داده میشود و اونم اولین خطا خواهد بود
. برای اتصال هستش به مثال زیر نگاه کن شاید عملگر . برات بهتر جا بیفته


<?php

$name="mahammad ";
$family="jamshidi";

$name.=$family;
//OR $name=$name.$family;

echo $name."<br>";
// mohammad jamshidi
$name.=" & php";
echo $name;
// mohammad jamshidi & php

?>
اون echo هم برای محکم کاری گفتم که اگر 100% $prompt ست شده بود مقدارش رو چاپ کنه در غیر این صورت خالی باشه که prompt به هر حال در هر یک از شرایط یک مقداری خواهد داشت
می تونی کاملترش هم کنی


<?php
if(isset($_POST['submit'])){

if(strlen($_POST['email'])==0)
$prompt="error in email<br>";

if(strlen($_POST['username'])==0)
$prompt.="error in username<br>";

if($prompt=="")
$prompt="اطلاعات با موفقیت ثبت شد";


}
echo (isset($prompt))?$prompt:"";

?>
<form method="post">
username <input type="text" name="username"><br>
email <input type="text" name="email"><br>
<input type="submit" name="submit" value="submit" name="submit"><br>
</form>
که البته همه اینها سلیقه ای هست میتونی 100 مدل دیگه تغییر بدهید
کد شما هم خیلی خوبه و صحیح استفاده میکنید

xoogle.ir
سه شنبه 27 مهر 1389, 08:36 صبح
و نظرتون درباره كد من رو هم بگين



برای چک کردن خالی بودن یا نبودن یک فیلد بهتره از راهی که براتون نوشتم استفاده کنید چون با کدی که شما نوشتید اگر کاربر space بزنه مقدار ورودی صحیح ارزیابی میشه. توابعی مثل empty و isset هم همین مشکل رو دارن.

mirzajavad
سه شنبه 27 مهر 1389, 14:39 عصر
برای چک کردن خالی بودن یا نبودن یک فیلد بهتره از راهی که براتون نوشتم استفاده کنید چون با کدی که شما نوشتید اگر کاربر space بزنه مقدار ورودی صحیح ارزیابی میشه. توابعی مثل empty و isset هم همین مشکل رو دارن.

خوب با تابع trim() اين مشكل رو حل ميكنم
و يك سوال راستش الان از اين روشها استفاده كردم توي كوئري با مشكل بر خوردم
يعني الان چه شرطي بنويسم كه در اون صورت كوئري اجرا بشه
هر روشي كه بلد بودم رو استفاده كردم

و يك سوال خدمت از funpatogh عزيز ميشه بگي براي چي طول رشته رو دريافت ميكني ؟ strlen()

xoogle.ir
سه شنبه 27 مهر 1389, 15:59 عصر
خب منم همین رو نوشتم دیگه :



if(trim($name) == '') echo 'error';


تابع strlen هم همین کار رو میکنه funpatogh عزیز هم داره خالی نبودن مقدار رو چک میکنه.

برای اجرا کردن کوئری اگر بخای از روش دوستمون استفاده کنی باید بنویسی که



if(!$prompt)
mysql_query("insert ..........");


یعنی اگر متغیر prompt مقدار نداشت یا false بود کوئری اجرا بشه.

mirzajavad
سه شنبه 27 مهر 1389, 17:25 عصر
مرسي از دوستان با راهنمايي شما كمي تكميل ترش كردم
فقط يك مشكل وقتي دكمه ارسال رو ميزنه و خطاهار رو نمايش ميده مقادير فرم از بين ميره و بايد كاربر يك back بزنه تا مقادير رو مشاهده كنه
چطوري ميشه مشكل رو برطرف كرد ؟

يك نظري در مورد كدها هم بدين :لبخندساده:



if(isset($_POST['submit'])){
// Check For Empty & User Exist & Email Valid
if(strlen($fname)==0) $error.=$lng['fname'].'<br>';
if(strlen($lname)==0) $error.=$lng['lname'].'<br>';
if(strlen($username)==0) $error.=$lng['username'].'<br>';
$user_exist=mysql_query("SELECT `username` FROM `users`");
while($result=mysql_fetch_array($user_exist)){
if($username==$result['username']) $error.=$lng['user_exist'].'<br>';}
if(strlen($email)==0) $error.=$lng['email'].'<br>';
elseif(!eregi('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zAZ09\-\.]+$',$email)) $error.=$lng['email_valid'].'<br>';
if(strlen($password)==0) $error.=$lng['password'].'<br>';
if(strlen($repassword)==0) $error.=$lng['repassword'].'<br>';
if(strlen($contact)==0) $error.=$lng['contact'].'<br>';
if(strlen($city)==0) $error.=$lng['city'].'<br>';
// Match Password
if($password!=$repassword) $error.=$lng['password_match'].'<br>';
$MyTpl -> assign('error',$error);
if(!$error) {
$query=mysql_query("INSERT INTO `users` (`fname`,`lname`,`username`,`email`,`password`,`co ntact`,`city`)
VALUE ('$fname','$lname','$username','$email','$password ','$contact','$city')");
}
}
if(isset($query))
{
$MyTpl -> assign(array(
'register'=>$lng['register'],
));

binyaft
سه شنبه 27 مهر 1389, 17:42 عصر
برای نمایش مقدار فرم در صورت خطا ،

<input type="text" name="fff" value="<?php echo $_POST['request']; ?>">

mirzajavad
سه شنبه 27 مهر 1389, 21:08 عصر
كلآ فرم رو بهم ميريزه راه ديگري براي اين كار نيست ؟

xoogle.ir
سه شنبه 27 مهر 1389, 21:37 عصر
تنها راهش همینه ....
چرا صفحه رو به هم بریزه ؟؟ ربطی به صفحه نداره فقط داخل input های شما میاد و مقدار پیش فرض چاپ میکنه.

mirzajavad
سه شنبه 27 مهر 1389, 21:48 عصر
به غير از فرم مقدار رو نگه نميداره

و بعد از نمايش فرم مقدار <?php echo $_POST['request']; ?> را نمايش ميده

يعني به جاي اينكه مقدار رو ذخيره كنه و دوباره بتونه نمايش بده خود كد رو نمايش ميده !

funpatogh
سه شنبه 27 مهر 1389, 21:52 عصر
خوب با تابع trim() اين مشكل رو حل ميكنم
و يك سوال راستش الان از اين روشها استفاده كردم توي كوئري با مشكل بر خوردم
يعني الان چه شرطي بنويسم كه در اون صورت كوئري اجرا بشه
هر روشي كه بلد بودم رو استفاده كردم

و يك سوال خدمت از funpatogh عزيز ميشه بگي براي چي طول رشته رو دريافت ميكني ؟ strlen()
خوب برای اینکه حتما یک مقدار رو وارد کنه اگر طول 0 باشه یعنی مقداری وارد نکرده اما خوب با sapce مشکل داره که از همون trim باید در if , strlen ,empty هم استفاده کنید

binyaft
سه شنبه 27 مهر 1389, 22:32 عصر
نباید اینطور باشه ، اما میتونید از سشن ها استفاده کنید

mirzajavad
سه شنبه 27 مهر 1389, 22:49 عصر
مثال بزنين
در ضمن به نظر شما چرا با دستوري كه شما دادين نميشه ؟

xoogle.ir
سه شنبه 27 مهر 1389, 23:48 عصر
یعنی شما اگر این کد رو بزنید چیزی چاپ نمیشه ؟



<input type="text" name='first_name' value="<?=$_POST['first_name']?>"


شاید به خاطر اینه که شما جایی از کدتون از تابع header استفاده میکنید در این صورت دیگه داخل POST_$ هیچی نیست و به جاش ارور چاپ میشه.

mirzajavad
چهارشنبه 28 مهر 1389, 00:08 صبح
نا جايي از هدر استفاده نكردم
راستش منظورتون رو درست متوجه نشدم
كل كد بخش ثبت نام اينه



<?php
include('inc/cnf.php');
include('inc/tmp.php');
include('lng/lng.fa.php');
$MyTpl= new Template();
$MyTpl -> load_file( 'tmp/main/register.htm' );
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$username=$_POST['username'];
$email=$_POST['email'];
$password=trim($_POST['password']);
$repassword=trim($_POST['repassword']);
$contact=$_POST['contact'];
$city=$_POST['city'];
if(isset($_POST['submit'])){
// Check For Empty & User Exist & Email Valid
if(strlen($fname)==0) $error.=$lng['fname'].'<br>';
if(strlen($lname)==0) $error.=$lng['lname'].'<br>';
if(strlen($username)==0) $error.=$lng['username'].'<br>';
$user_exist=mysql_query("SELECT `username` FROM `users`");
while($result=mysql_fetch_array($user_exist)){
if($username==$result['username']) $error.=$lng['user_exist'].'<br>';}
if(strlen($email)==0) $error.=$lng['email'].'<br>';
elseif(!eregi('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zAZ09\-\.]+$',$email)) $error.=$lng['email_valid'].'<br>';
if(strlen($password)==0) $error.=$lng['password'].'<br>';
if(strlen($repassword)==0) $error.=$lng['repassword'].'<br>';
if(strlen($contact)==0) $error.=$lng['contact'].'<br>';
if(strlen($city)==0) $error.=$lng['city'].'<br>';
// Match Password
if($password!=$repassword) $error.=$lng['password_match'].'<br>';
$MyTpl -> assign('error',$error);
if(!$error) {
$query=mysql_query("INSERT INTO `users` (`fname`,`lname`,`username`,`email`,`password`,`co ntact`,`city`)
VALUE ('$fname','$lname','$username','$email','$password ','$contact','$city')");
}
}
if(isset($query))
{
$MyTpl -> assign(array(
'register'=>$lng['register'],
));

}
$MyTpl -> print_template();
?>

funpatogh
چهارشنبه 28 مهر 1389, 00:16 صبح
دوست عزیز شما چون داری از Template Engine استفاده می کنید و فرمتون هم داخل یک فایل tpl یا htm قرار داره نمیتونید که مستقیم از <?php ?> استفاده کنید
و توی صفحات استاتیک کد php بنویسید
شما باید توی بخش کدنویسی برنامتون این مقادیر رو براش تگ بنویسید و بعد تگ هارو توی فرم قرار بدهید و وقتی که فرم پر میشه و ارسال میشه توی فرمتون مقادیر تگ جایگزین بشوند
در ضمن تمام جاهایی که strlen گزاشتی برای چک کردن مقادیر یک trim هم بگزار


if(strlen(trim($fname))==0)

mirzajavad
چهارشنبه 28 مهر 1389, 01:17 صبح
دوست عزیز شما چون داری از Template Engine استفاده می کنید و فرمتون هم داخل یک فایل tpl یا htm قرار داره نمیتونید که مستقیم از <?php ?> استفاده کنید
و توی صفحات استاتیک کد php بنویسید
شما باید توی بخش کدنویسی برنامتون این مقادیر رو براش تگ بنویسید و بعد تگ هارو توی فرم قرار بدهید و وقتی که فرم پر میشه و ارسال میشه توی فرمتون مقادیر تگ جایگزین بشوند
[/php]

آقا مرسي:بوس:
راستش خودم گيج ميزنم:لبخند:
اشاره شما به موضوع مشكلم رو حل كرد
چون اين بار كاملآ دارم فرم ها رو هوشمند ميكنم تا از مشكلات بعدي جلوگيري كنم
يك سوال ؟
الان ميخواهم پسوردم رو md5 بكنم بفرستم ديتابيس
توي كوئري اين تابع رو به كار ببرم اشكالي نداره
يا قبل از كوئري اين كار رو انجام بدم
منظورم اينه



$query=mysql_query("INSERT INTO `users` (`fname`,`lname`,`username`,`email`,`password`,`co ntact`,`city`)
VALUE ('$fname','$lname','$username','$email','".md5($password)."','$contact','$city')");


ميشه يك توضيحي در رابطه با كوئري ها بدين
مثلآ اگر ورودي به صورت مستقيم وارد كوئري بشه آيا مشكل امنيتي داره ؟
منظورم همون sql injection

چون توي يك اسكريپت اينجوري استفاده كرده بود



$AddNews = mysql_query ("INSERT INTO `news` VALUES ('', '".$_POST['newsTitle']."', '".$_POST['newsContent']."', '".mktime()."', '0')");

xoogle.ir
چهارشنبه 28 مهر 1389, 11:52 صبح
در مورد کوئری اول فکر میکنم بتونی استفاده کنی. اما مقدارهای ورودی توسط کاربر رو هیچ وقت بدون عملیات پاکسازی توی کوئری نبر. اول اونا رو escape کن با تابع mysql_real_escape_string

funpatogh
چهارشنبه 28 مهر 1389, 21:56 عصر
به نظرم همیشه یک فانکشن برای جلوگیری از injection بنویس و تمام ورودی ها رو با این فانکشن ایزوله کن


antiinject($_POST['username'])

mirzajavad
چهارشنبه 28 مهر 1389, 22:26 عصر
اينارو پيدا كردم

اين يكي از سايت خارجي


function cleanuserinput($dirty){
if (get_magic_quotes_gpc()) {
$clean = mysql_real_escape_string(stripslashes($dirty));
}else{
$clean = mysql_real_escape_string($dirty);
}
return $clean;
}


اينم از انجمن شبگرد



function sql_quote( $value )

{

if( get_magic_quotes_gpc() )

{

$value = stripslashes( $value );

}

//check if this function exists

if( function_exists( "mysql_real_escape_string" ) )

{

$value = mysql_real_escape_string( $value );

}

//for PHP version < 4.3.0 use addslashes

else

{

$value = addslashes( $value );

}

return $value;

}


نظرتون در موردشون چيه ؟

funpatogh
چهارشنبه 28 مهر 1389, 22:45 عصر
اولیه کامل تره


function cleanuserinput($dirty){
if (get_magic_quotes_gpc()) {
$clean = mysql_real_escape_string(stripslashes($dirty));
}else{
$clean = mysql_real_escape_string($dirty);
}
return $clean;
}

xoogle.ir
پنج شنبه 29 مهر 1389, 11:52 صبح
همون طور که گفته شد تابع اولی بهتره اما خودت میتونی کاملترش هم بکنی مثلا بیای یه تابع واسط بسازی و بهش پارامتر پاس بدی بعد داخل این تابع بیای و تابع اولی رو فراخونی کنی این جوری مزیتش اینه که آرایه هم میتونی پاس بدی مثلا این جوری :




function clean($dirty){
if(is_array($dirty)){

$arr = array();
foreach($dirty as $key=>$value){
$arr[$key] = cleanuserinput($value);
} return $arr;
}else{
return cleanuserinput($dirty);
}
}

این جوری مزیتش اینه که در فرمها به جای اینکه برای هر مقدار فرم مجبور باشی یکبار تابع اولی رو اجرا کنی میای آرایه ی POST_$ رو فقط یک بار به این تابع میدی و خروجی رو به صورت آرایه دریافت میکنی.