بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

فرم ثبت نام (بخش چهارم فیلم های آموزشی)  [حل شد]

مدیریت گفتگو
Mehrad 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام
من سعی کردم فرم ثبت نامی که استاد توی بخش چهارم درست کردند رو پیشرفته تر کنم، یعنی میخواستم دستوری رو درونش بنویسم که از کاربر ، بعد از اینکه ایمیلش رو وارد کرد ، تایید ایمیل رو هم در فیلد دیگری بخواد ، و در صورتی که کاربر هر دو فیلد رو یکسان پر نکرد بهش اخطار بده .
یک نمونه از دستوری که نوشتم بدین ترتیب هست :

$sql = "SELECT id FROM info WHERE email='$email' " ;
$result = $conn->query($sql);
if ($result->num_rows != 0) { ?>
<div class="submiting">Your email address is submitted already,plz change it and try again.</div>
<? } else {

$sql = "SELECT id FROM info WHERE reemail='$reemail' " ;
$result = $conn->query($sql);
if($result->reemail=='$email'){
$sql = "INSERT INTO info (firstName,email,reemail) VALUES ( '$firstName', '$email' ,'$reemail')";
$result = $conn->query($sql);
?>
<div class="submiting">Your information is submitted</div>


<? } else {?>
<div class="submiting">Your E-mail addresses does not match.plz try again.</div>



<?
} }
$conn->close();
?>


اما این کد درست کار نمیکنه
موارد مشابه این رو هم امتحان کردم ولی فایده نداشت
.

نظرات

پاسخ‌ها 5

JSONObject 11 سال پیش

خیلی کارو سخت کردی
به نظرم بهتره چک کردن ایمیل دوم رو با جاوا اسکریپت انجام بدی

یعنی تو onclick  ِ دکمه ی submit چک کنی که اگه valueی دومی مساوی اولی نبود پیغام بده

نظرات

محسن موحد 11 سال پیش
جاوا اسکریپت سمت کلاینته و توسط کاربر غیر فعال میشه!!!
Mehrad 11 سال پیش

چطوری باید بهش دستور بدیم که مقدار وارد شده در input رو (یا بقول شما مقدار value رو) بخونه؟
الان این کد رو من نوشتم و امتحان کردم ، ولی باز جواب نداد

$conn->query("SET NAMES UTF8");
$sql = "SELECT id FROM info WHERE email='$email' " ;
$result = $conn->query($sql);
if ($result->num_rows != 0) { ?>
<div class="submiting">Your email address is submitted already,plz change it and try again.</div>
<? } else { ?>

<script>
var button = $("#submit");
var reemail = $("#reemail");
var email = $("#email");
button.click( function(){
if("$email"=="$reemail"){
<?$sql = "INSERT INTO info (firstName,email,reemail)
VALUES ( '$firstName', '$email' ,'$reemail')";
$result = $conn->query($sql); ?>
"Your information is submitted"
else{
"Your E-mail addresses does not match.plz try again."
}
}
});
</script>
<?
}
$conn->close();
?>

نظرات

محسن موحد 11 سال پیش
چرا این خط شرطی از پراپرتی استفاده کردی؟ $result->num_rows از چه کلاسی واسه دیتابیس استفاده میکنی؟ مقادیر تکست باکس با .val در جی کوئری گرفته میشه. بهتره php رو با js تا جایی که میتونی قاطی ننویسی. js واسه چک کردن مقادیر امن نیست چون اگه غیر فعال بشه توسط کاربر دیگه عمل نمیکنه. یعنی هم باید سمت کلاینت چک کنی که اگر مثلا مثل هم نبود دکمه سابمیت کار نکنه و هم باید در سمت سرور چک بشه..
Mehrad 11 سال پیش
الان کلا یه راه حل اساسی ارائه بدید برای انجام اینگار ، کدهاش رو هم بذارید!
محسن موحد 11 سال پیش

خوب من الان فایل کدهای جلسه ی 4 رو دیدم که از mysqli استفاده شده بود.فک نمیکردم انقد زود شی گرایی کد زده بشه :دی

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

در کدهای اولین پست قسمت else اینها اضافیه :

$sql ="SELECT id FROM info WHERE reemail='$reemail' ";
$result = $conn->query($sql);
if($result->reemail=='$email'){

بعد از اینسرت بهتره این کدو بزاری:

 if ($result->affected_rows > 0)
{
	echo '<div class="submiting">Your information is submitted</div>';
}
else
{
	// ....
}

کدهای قبلیتو خودت اضافه کن...کلیتش اینجوریه:

 // ........
// ........
$reEmail = $_POST['reEmail'];
if ($reEmail == $email)
{
	$sql = "SELECT id FROM info WHERE email = '{$email}'" ;
	$result = $conn->query($sql);
	if ($result->num_rows > 0)
	{
		echo '<div class="submiting">Your email address is submitted already,plz change it and try again.</div>';
	}
 	else
 	{
			$sql = "INSERT INTO info (firstName,email) VALUES ('{$firstName}', '{$email}')";
			$result = $conn->query($sql);
			 if ($result->affected_rows > 0)
			{
				echo '<div class="submiting">Your information is submitted</div>';
			}
			else
			{
				echo 'There was an error.try again later...'
			}
	}
}
else
{
	echo 'Email address does not match...';
}
?>

البته مقادیر باید بیشتر از این validate بشن.مثلا چک بشن خالی هستن یا نه و آدرس ایمیل وارد شده فرمتش معتبر هست یا نه و ....

نظرات

Mehrad 11 سال پیش

 محسن جان ممنون ،
بالاخره انجامش دادم ؛البته کد من تفاوت هایی داره با کدی که شما نوشتی ، ولی نکته ی کلیدی درونش بود و من استفاده کردم.
کد رو قرار میدم تا سایر دوستان هم استفاده کنند ،
کار جالبی شد در کل.
این کد مربوط به فایل insert-query.php هست که وقتی کاربر اطلاعات رو در فرم پر میکنه ، اطلاعات به این فایل ارسال میشن و در دیتابیس ثبت میشن.

<?php
$firstName=$_POST['firstName'];
$email=$_POST['email'];
$reemail=$_POST['reemail'];

if($email==$reemail){

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "YOUR DATA BASE NAME";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$conn->query("SET NAMES UTF8");
$sql = "SELECT id FROM info WHERE email='$email'";
$result = $conn->query($sql);

if ($result->num_rows == 0) {
$conn->query("INSERT INTO info (firstName,email) VALUES ('$firstName','$email')");
?>
<div class="submiting">Your information is submitted.</div>
<? } else { ?>
<div class="submiting">Your Email address is submitted before,plz
change it and try again.</div>
<?
}
$conn->close();
}else{?>
<div class="submiting">Your Email addresses does not match.</div>

<?}
?>

نظرات

محسن موحد 11 سال پیش
if ($result->affected_rows > 0) این خط چک میکرد که داده مورد نظر ثبت شده که اگه ثبت شده بود مقدار 1 بر میگردوند.پس همیشه استفاده کنید. کد باگ sql injection داره. حتی اگه همین داده های کاربرو فقط اکو کنید باگ xss هم داره. باگ csrf هم داره.
amir Alu 11 سال پیش
خیلی ممنون از راهنمایی شما. منم مشکلم حل شد. مرسی که کدت را اینجا گذاشتی. فقط یه چیزی اگر بخوایم کادر بعد از این که چک کردن صحیح بود سبز بشه باید چه کدی بنویسیم.؟
Mehrad 11 سال پیش
والا من تست کردم باگ نداشت
محسن موحد 11 سال پیش
چجوری تست کردین؟ ابن باگ ها با چشم دیده میشن نیاز به تست نیست.
Mehrad 11 سال پیش
توی مرورگر دیگه (بصورت لوکال)، طبق آموزشی که استاد داد ، فقط این بخشش رو بجای کدهای استاد با این کدها اجرا کردم ، بدون مشکل اطلاعات وارد دیتابیس میشد ، و اون اخطارهایی که تنظیم کرده بودم رو هم (درصورت تکراری بودن ایمیل یا برار نبودن فیلدها) میداد. مشکلی نبود...
محسن موحد 11 سال پیش
این سه تا باگی که گفتمو هکر سوء استفاده میکنه
محسن موحد 11 سال پیش
مثلا شما این عبارتو داخل تکست باکس ایمیل و ری ایمیل بزارید: not an email' or 1=1#
Mehrad 11 سال پیش
هدف من تست کردن این قضیه روی لوکال بود فقط ، وگرنه مشخصه کدی که من نوشتم امنیت نداره ، و حتما استاد توی فیلم ها روش های امن سازی فرم ها و ... رو توضح خواهند داد.
محسن موحد 11 سال پیش
اگه دنبال چیز یاد گرفتنی بجای این هدفاااایی که داری , همون اول بپرس راه حل چیه و من توو چند خط بگم هر سه تا باگ چطوری رفع میشن , نیاز به این همه کش دادن هم نبود. موفق باشید.
Mehrad 11 سال پیش
من دنبال تامین امنیتش نبودم ، سوالمم توی پست اول تاپیک مطرح کرده بودم که جوابشو گرفتم ، شما بحث امنیت رو راه انداختی و کشش دادی.اگر میخواستی راه حل امنیت رو بگی میگفتی اگر نمیخواستی بگی دیگه انقدر لازم نبود بگی این باگو داره اون باگو نداره!
محسن موحد 11 سال پیش
اگه راه حل می خواستی کامل میگفتم...بهر حال من قصدم کمک بود ولی از همون اول درشت حرف زدی ... طبق نظر خودتون بهتره منتظر فیلم ها باشید , یکسال صبر کنید تا مطالب کم کم گفته بشه و یاد بگیری .البته امکانش نزدیک به صفره تمام گستردگیه php در یک کورس آموزشی بشه گنجوندش.
Mehrad 11 سال پیش
به هر حال ما به روش تدریس استاد باور داریم و بر اساس همون زمانبندی هم پیش میریم ، البته متناسب با نیازمون هم به سورس های دیگه مراجعه و استفاده میکنیم. ضمن اینکه تا اینجایی که من فیلم ها رو دیدم "اصلا" هدف استاد این نیست که "تمام گستردگیPHP" رو یاد بدن ، و بارها گفتن که در حد نیاز از PHP استفاده میشه ، هر وقت هم به موارد بشتری نیاز بود از سورس های دیگه مثل اینترنت میشه استفاده کرد.
محسن موحد 11 سال پیش
صحبتام اشتباه برداشت نشه.در مورد استاد و تدریس حرفی نزدم.گفتم مسیر یادگیری هیچوقت نباید متوقف بشه تا سر فصل های بعدی بیاد.و این مطلبو خود استاد هم گفتن که تا جایی که وقت بشه ادامه میدن که اینهم طبیعیه , بخاطر گستردگیه مطالب.
محسن موحد 11 سال پیش

برای چک کردن ایمیل سمت کلاینت از جی کوئری استفاده می کنیم.

یه مثال ساده:

 <form id="target" action="javascript:alert( 'success!' );" method="post">
    Email: <input id='email' type='text'>
    <br><br>
    reEmail: <input id='reEmail' type='text'>
    <br><br>
    <input id='sub' type='submit'>
</form>

$(document).ready(function (){ $('#reEmail').focusout(function () { email = $('#email').val(); reEmail = $('#reEmail').val(); if (email.length > 0) { if (reEmail == email) { $(this).css( "background-color", "#00ff00"); } else { $(this).css( "background-color", "#ff0000"); } } else { $(this).css( "background-color", "#fff"); } }); $('#target').submit(function () { email = $('#email').val(); reEmail = $('#reEmail').val(); if (email == reEmail && email.length > 0) { alert('OK'); return; } alert('NO'); event.preventDefault(); }); });

میتونین با keyup هم reEmail رو پیاده سازی کنید.البته هنوز جا داره کارهای دیگم صورت بگیره و تمیز ترش کرد.

لینک دمو

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .