PDA

View Full Version : سوال: جلوگیری از نمایش Duplicate Entry هنگام ورود فیلد تکراری



MohammadGh2011
دوشنبه 17 آذر 1393, 07:07 صبح
Hello علیکم

فرض کنید یه کدی نوشتیم مثلا این:


$fname=$_POST['fname'];$lname = $_POST['lname'];$Phone = $_POST['Phone'];$date = date("Y/m/d");mysql_query ( "INSERT INTO example (fname,lname,Phone,date) VALUES ('$fname' ,'$lname', '$Phone', '$date')")
or die(mysql_error());
کلید ک Phone باشه موقعی که داده ی تکراری وارد میشه این ارور نمایان میشه:

Duplicate entry '' for key 'PRIMARY'


حالا میخوام قبل اینکه اضافه کنه و ارور نمایان بشه چک کنه و اگه مقدار تکراری بود پیام بده نه اینکه به سرور ارسال بشه و خود سیستم پیامشو نشون بده
اگه با جاوااسکریپت بشه ممنون میشم

موفق باشید

***BiDaK***
دوشنبه 17 آذر 1393, 07:20 صبح
قبل از اینسرت یک کوئری select بنویس که چک کنه وجود داره یا نه.

MohammadGh2011
دوشنبه 17 آذر 1393, 08:42 صبح
این کدی ک نوشتم بعضی موقع ها عمل میکنه بعضی موقع ها عمل نمیکنه و فیلد تکراری رو اضافه میکنه
تو phpmyadmin هم کلید پرایمری دوتا برام انتخاب کرده که به هیچ وجه یکیش حذف نمیشه.

$fname=$_POST['fname'];$lname = $_POST['lname'];$Phone = $_POST['Phone'];$date = date("Y/m/d");
$query = "SELECT * FROM example WHERE Phone = '".mysql_real_escape_string($_POST['Phone'])."'";if (mysql_num_rows(mysql_query($query)) > 1){ print "inuse";} else{mysql_query ( "INSERT INTO example (fname,lname,Phone,date) VALUES ('$fname' ,'$lname', '$Phone', '$date')")
or die(mysql_error());
} ?>

***BiDaK***
دوشنبه 17 آذر 1393, 08:49 صبح
شرط رو بذار بزرگتر از صفر.
فیلد phone رو بذار unique...

MohammadGh2011
دوشنبه 17 آذر 1393, 22:45 عصر
شرط رو بذار بزرگتر از صفر.
فیلد phone رو بذار unique...
ظاهرا درست شده ...
من میخوام توی خود صفحم پیام inuse رو نشون بده ینی پیام رو تو صفحه خودش نشون نده و پاس بده به صفحه ای که داره اطلاعات وارد میشه
لطفا قطعه کد ارائه بدید...

***BiDaK***
سه شنبه 18 آذر 1393, 00:54 صبح
بیشتر توضیح بده.
کدت هم بزار

MohammadGh2011
سه شنبه 18 آذر 1393, 09:25 صبح
ببینید:
یه فایل به نام AddToDB.php دارم که همین دستورات داخلشه و ثبت میکنه:


$fname=$_POST['fname'];$lname = $_POST['lname'];$Phone = $_POST['Phone'];$date = date("Y/m/d");
$query = "SELECT * FROM example WHERE Phone = '".mysql_real_escape_string($_POST['Phone'])."'";
if (mysql_num_rows(mysql_query($query)) > 0)
{
print "inuse";
} else{mysql_query ( "INSERT INTO example (fname,lname,Phone,date) VALUES ('$fname' ,'$lname', '$Phone', '$date')")
or die(mysql_error());
header("location: index.php");}
و فایل index هم که برای ثبت پاس میده به اون فایل بالایی:


<form class="f1" action="AddToDb.php" method="post">
<table border=0 cellpadding=0 cellspacing=0 style="color:red;padding:1px;"><tr><td>
نام: </td><td><input type=text size=12 name=fname id=fname placeholder='نام'; style="color:Green;font-family:Tahoma;"><src id="imgTrueFalse1"></td></tr><tr><td>فامیلی:</td><td> <input type=text size=12 name=lname id=lname placeholder='نام خانوادگی'; style="color:Green;font-family:Tahoma;"><src id="imgTrueFalse1.1"></td></tr><tr><td>شماره:</td><td> <input type=text size=12 name=Phone id=Phone placeholder=' شماره موبایل'; style="color:Green;font-family:Tahoma;"><src id="imgTrueFalse2"></td></tr><tr><td></td><td><input type=submit border=0 value=OK onclick='return validate()' /></td></tr></table></form>

validate() کدهای جاوا اسکریپته که خطاها رو چک و بررسی میکنه ک مثلا تلفن فقط 11 تا عدد باشه حالا برای فیلد تکراری هم میخوام توی خود همین صفحه باشه و وصل بشه به پایگاه داده و اگه وجود داشت همینجا اعلام کنه و نره صفحه addtodb...
متوجه اید؟

***BiDaK***
سه شنبه 18 آذر 1393, 09:42 صبح
خوب شما نفرستشون صفحه ی دیگه.action رو خالی بزار تا پست بک بشه به همون صفحه ی فرم.
و شما کافیه یا صفحه ی addToDb رو ایکلود کنین به همین صفحه ی فرم و یا کدهاشو توو همون صفحه بزارین. و کد هارو داخل یک شرط بگذارین که مثلا تا زمانی که دکمه ی سابمیت کلیک نشده و پست نشده کدها اجرا نشن..یعنی تمام کدهای صفحه ی addToDb داخل این شرط قرار بگیره:
یک صفت name = btnSubmit هم بزارین واسه دکمه سابمیت:

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

}

اگر هم میخواین صفحه هم رفرش نشه و همه چی با جاوااسکریپت باشه باید آژاکس بنویسین.

MohammadGh2011
سه شنبه 18 آذر 1393, 09:50 صبح
خب اکشن رو خالی بزارم اضافه میکنه مگه؟!!

***BiDaK***
سه شنبه 18 آذر 1393, 09:53 صبح
خب اکشن رو خالی بزارم اضافه میکنه مگه؟!!
کد های صفحه ی addToDb رو یا include کن به صفحه ی همین فرمت یا کد هاشو کپی کن تو این صفحه و صفحه ی addToDb رو پاک کن و action فرم رو خالی بزار.

MohammadGh2011
سه شنبه 18 آذر 1393, 09:59 صبح
کد های صفحه ی addToDb رو یا include کن به صفحه ی همین فرمت یا کد هاشو کپی کن تو این صفحه و صفحه ی addToDb رو پاک کن و action فرم رو خالی بزار.
ینی اکشن رو خالی بزارم و اینو بنویسم:


if (isset($_POST['btnSubmit']))
{ $fname=$_POST['fname']
;$lname = $_POST['lname']
;$Phone = $_POST['Phone']
;$date = date("Y/m/d");
$query = "SELECT * FROM example WHERE Phone = '".mysql_real_escape_string($_POST['Phone'])."'";
if (mysql_num_rows(mysql_query($query)) > 0
){ print "inuse";
} else{mysql_query ( "INSERT INTO example (fname,lname,Phone,date) VALUES ('$fname' ,'$lname', '$Phone', '$date')")
or die(mysql_error());
header("location: index.php");}}

***BiDaK***
سه شنبه 18 آذر 1393, 10:12 صبح
بله...
توو اکشن اسم همین صفحرو هم میتونی بدی ولی میتونی خالی هم بزاری. اکثر مرورگرها به همین صفحه برمیگردونن.
کد ها توو یک صفحه:

<?php
if (count($_POST) > 0)
{
$fname= mysql_real_escape_string($_POST['fname']);
$lname = mysql_real_escape_string($_POST['lname']);
$Phone = mysql_real_escape_string($_POST['Phone']);
$date = date("Y/m/d");
$query = "SELECT * FROM example WHERE (Phone = '{$Phone}')";
if (mysql_num_rows(mysql_query($query)) > 0)
{
echo "inuse";
}
else
{
$result = mysql_query("INSERT INTO example (fname,lname,Phone,date) VALUES ('$fname', '$lname', '$Phone', '$date')") or die(mysql_error());
if (mysql_affected_rows($result) > 0)
{
header("location: index.php");
}
else
{
echo 'error';
}
}
}
?>
<form class="f1" action="" method="post">
<table border=0 cellpadding=0 cellspacing=0 style="color:red;padding:1px;">
<tr>
<td>نام:</td>
<td>
<input type='text' size='12' name='fname' id=fname placeholder='نام' style="color:Green;font-family:Tahoma;">
<src id="imgTrueFalse1">
</td>
</tr>
<tr>
<td>فامیلی:</td>
<td>
<input type='text' size='12' name=lname id='lname' placeholder='نام خانوادگی' style="color:Green;font-family:Tahoma;">
<src id="imgTrueFalse1.1">
</td>
</tr>
<tr>
<td>شماره:</td>
<td>
<input type='text' size='12' name='Phone' id='Phone' placeholder=' شماره موبایل' style="color:Green;font-family:Tahoma;">
<src id="imgTrueFalse2">
</td>
</tr>
<tr>
<td></td>
<td>
<input type='submit' border='0' value='OK' name='btnSubmit' onclick='return validate()'>
</td>
</tr>
</table>
</form>

MohammadGh2011
سه شنبه 18 آذر 1393, 10:36 صبح
این btnSubmit پس کو؟if (count($_POST) خب _POST کدومش؟
ایندفعه تو خود صفحه اینو میده : Duplicate entry 'محمد' for key 'fname'

***BiDaK***
سه شنبه 18 آذر 1393, 10:55 صبح
فرقی نمیکنه.هرکدومو خواستی بزار.
یا از قسمت indexes در phpmyadmin ایندکس fname رو drop کن یا اگه میخوای یونیک باشه کوئری سلکتو یک OR بهش اضافه کن:

$query = "SELECT * FROM example WHERE (Phone = '{$Phone}' OR fname = '{$fname}')";

MohammadGh2011
سه شنبه 18 آذر 1393, 15:18 عصر
فرقی نمیکنه.هرکدومو خواستی بزار.
یا از قسمت indexes در phpmyadmin ایندکس fname رو drop کن یا اگه میخوای یونیک باشه کوئری سلکتو یک OR بهش اضافه کن:

$query = "SELECT * FROM example WHERE (Phone = '{$Phone}' OR fname = '{$fname}')";
دوباره چرا همون ارور رو میده:
Duplicate entry 'علی' for key 'fname'
فکر کنم مشکل از همونجاس که تو اولین پستا گفتم فیلد نام هم کلید انتخاب شده نمیزاره تکراری وارد بشه و این پیام رو بهش میده ولی نمیشه کلید رو حذف کنم حتما دوتا میشه
بعد هم این inuse رو میخوام تویه جای خاصی نمایش بده و پرینت یا echo نکنه
سپاس