PDA

View Full Version : سوال: مشكل در ثبت اطلاعات



mirzajavad
پنج شنبه 29 مهر 1389, 07:24 صبح
سلام
راستش يك برنامه نوشتم روي لوكال كه تست ميكنم درسته
ولي خيلي عجيبه وقتي ميريزن روي هاست اطلاعات توي ديتابيس ثبت نميشه
ولي پيغام ها ارسال ميشه
مثلآ ميزنه ثبت نام انجام شد يعني كوئري اجرا شده ولي اطلاعات ثبت نشده
فايل error_log رو كه روي سرور هستش باز كردم
هميش اين خطا ايجاد شده



[21-Oct-2010 04:11:10] PHP Notice: Undefined index: username in /home/kavironl/public_html/mirzajavad.ir/demo/login.php on line 7
[21-Oct-2010 04:11:10] PHP Notice: Undefined index: password in /home/kavironl/public_html/mirzajavad.ir/demo/login.php on line 8
[21-Oct-2010 04:11:10] PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/kavironl/public_html/mirzajavad.ir/demo/login.php on line 12
[21-Oct-2010 04:11:10] PHP Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/kavironl/public_html/mirzajavad.ir/demo/login.php on line 13
[21-Oct-2010 04:11:10] PHP Notice: Undefined index: submit in /home/kavironl/public_html/mirzajavad.ir/demo/login.php on line 17
[21-Oct-2010 04:11:10] PHP Notice: Undefined variable: error in /home/kavironl/public_html/mirzajavad.ir/demo/login.php on line 20
[21-Oct-2010 04:12:39] PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/kavironl/public_html/mirzajavad.ir/demo/register.php on line 31
[21-Oct-2010 04:12:39] PHP Notice: Undefined variable: error in /home/kavironl/public_html/mirzajavad.ir/demo/register.php on line 41
[21-Oct-2010 04:12:39] PHP Notice: Undefined variable: error in /home/kavironl/public_html/mirzajavad.ir/demo/register.php on line 42


اينم كد بخش ثبت نام



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

xoogle.ir
پنج شنبه 29 مهر 1389, 11:46 صبح
خطاهای سطح notice که مهم نیستند اما اون warning ها مربوط به مقدار اشتباه result شما هستند.
احتمالا توی تابع mysql_query یه مشکلی هست یعنی کوئری که وارد کردی مشکل داره احتمالا مشکل هم اشتباه املایی هست.
مثلا من نگاه کردم به جای values نوشتی value ....

mirzajavad
پنج شنبه 29 مهر 1389, 15:17 عصر
راستش نميدونم هر چي چك كردم نتونستم مشكل رو پيدا كنم
آخه روي لوكال درسته و همه چيز درست انجام ميشه
حتي اون VALUES رو هم درست كردم

xoogle.ir
پنج شنبه 29 مهر 1389, 15:26 عصر
شاید بانکت رو اشتباه ساختی!
اسم یکی از فیلدها ممکنه عوض شده باشه. اگه بانکت رو دستی ساختی بهتره که از بانک لوکالت export بگیری و روی هاستت import بکنی.

funpatogh
پنج شنبه 29 مهر 1389, 22:50 عصر
شما توی تنظیمات php بخش error_reporting رو در بالاترین سطح گزاشتید (E_ALL) که برای خطایابی و باگ گیری خیلی مناسب می باشد برای همین باید تمام نکات ریزه کاری را رعایت کنید تا برنامه E_NOTICE نداشته باشد
که خیلی از این Notice ها مربوط میشه به مقدار اولیه ندادن به متغییر ها و چک کردن متغییر ها با if خالی
با یک فرم ساده توضیح میدهم تا اگر این ریزه کاری ها رو رعایت نکردید درستش کنید


<?php
error_reporting(E_ALL);
$name="";
if($_POST['submit'])
$name=$_POST['bookname'];

echo $name;
?>
<form name="test" method="post">
Book Name <input type="text" name="bookname"><br>
<input type="submit" name="submit" value="send">
</form>
توی بخش php کد بالا متغییر name مقدار اولیه دارد اما کلید submit بدون isset چک شده که خودش این یک notice ایجاد میکنه
اگر به این شکل انجام بدهید حل میشود


if(isset($_POST['submit']))
حتی اگر متغییر name مقدار اولیه هم نداشته باشد باز این خطا ایجاد میشود


<?php
error_reporting(E_ALL);
if(isset($_POST['submit']))
$name=$_POST['bookname'];

echo $name;
?>
<form name="test" method="post">
Book Name <input type="text" name="bookname"><br>
<input type="submit" name="submit" value="send">
</form>
که باید


error_reporting(E_ALL);
$name="";
if(isset($_POST['submit']))
$name=$_POST['bookname'];

echo $name;
?>
به این شکل حل شود
توی query خودت هم این شکلی بنویس تا خطاهای بخش mysql هم ریز به ریز ببینی


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

mirzajavad
جمعه 30 مهر 1389, 00:47 صبح
مرسي از توضيحات جامع و كامل funpatogh عزيز
راستش خيلي از مسائل مهم را توي انجمن از شما ياد گرفتم الان دارم خطاها رو بررسي ميكنم
ولي هنوز سورس رو روي سرور تست نكردم كه ببينم مشكل كوئري هم حل شده يا نه
آخه نميدونم چش شده بود چون من روي wampserver و xampp تست كردم درست بود ولي روي سرور اطلاعات در ديتابيس درج نميشد چك هم كردم مشكل از ترتيب جدول ها نبود
به نظر شما بهترين سرور مجازي كدام است ؟
wampserver OR xampp OR easyphp
كدومش بهتره ؟ چون من خيلي وقته از xampp استفاده ميكنم
راستش دارم يك پروژه مينويسم و ميخواهم تا جايي امكانش هست اصولي و درست نوشته بشه
و خيلي خوشحالم كه اينجا ميتونم مشكلاتم را با كمك دوستان حل كنم

الان كه تست كردم هنوز خطاها رو نشون ميده




Notice: Undefined variable: fname in C:\xampp\htdocs\ebay\register.php on line 8

Notice: Undefined index: fname in C:\xampp\htdocs\ebay\register.php on line 9

Notice: Undefined index: lname in C:\xampp\htdocs\ebay\register.php on line 10

Notice: Undefined index: username in C:\xampp\htdocs\ebay\register.php on line 11

Notice: Undefined index: email in C:\xampp\htdocs\ebay\register.php on line 12

Notice: Undefined index: password in C:\xampp\htdocs\ebay\register.php on line 13

Notice: Undefined index: repassword in C:\xampp\htdocs\ebay\register.php on line 14

Notice: Undefined index: contact in C:\xampp\htdocs\ebay\register.php on line 15

Notice: Undefined index: city in C:\xampp\htdocs\ebay\register.php on line 16


يك سوال ديگه بعد از اتمام برنامه نويسي ايا اين تابع باشه براي نمايش خطا يا فقط جهت رفع مشكلات برنامه نويسي ازش استفاده كنم ؟

mirzajavad
جمعه 30 مهر 1389, 01:33 صبح
اين خطا رو ميده



Table 'kavironl_ebay.users' doesn't exist
ولي هم ديتابيس موجوده و هم جدول يوزر :ناراحت:

__________________________________________________ _________

مشكل اين بخش حل شد
تا حالا به كوچك يا بزرگ بودن اسم جدول ها دقت نكرده بودم آخه روي لوكال هيچي مشخص نيست ولي روي سرور كه تست كردم معين شد :اشتباه:
توي كوئري users بود ولي در هنگام ساخت تيبل ها از USERS استفاده كردم خدا رو شكر حل شد :لبخندساده:

funpatogh
جمعه 30 مهر 1389, 11:58 صبح
خوب پس مشکل بخش دیتابیست حل شده اما برای بخش php کدت رو به این شکل تغییر بده ببین باز هم خطا داری یا نه


<?php
error_reporting(E_ALL);
include('inc/cnf.php');
include('inc/tpl.php');
include('lng/lng.fa.php');
$tpl= new Template();
$tpl -> load_file( 'tpl/main/register.htm' );
$fname=isset($_POST['fname'])?$_POST['fname']:"";
$lname=isset($_POST['lname'])?$_POST['lname']:"";
$username=isset($_POST['username'])?$_POST['username']:"";
$email=isset($_POST['email'])?$_POST['email']:"";
$password=isset($_POST['password'])?$_POST['password']:"";
$repassword=isset($_POST['repassword'])?$_POST['repassword']:"";
$contact=isset($_POST['contact'])?$_POST['contact']:"";
$city=isset($_POST['city'])?$_POST['city']:"";


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


if(!isset($error)) {
$query=mysql_query("INSERT INTO `users` (`fname`,`lname`,`username`,`email`,`password`,`co ntact`,`city`)
VALUE ('$fname','$lname','$username','$email','".md5($password)."','$contact','$city')")or die(mysql_error());
$tpl -> assign('register',$lng['register']);
}else
$tpl -> assign('error',$error);
}

$tpl -> print_template();
?>

?>

در ضمن یک ایراد هم اینجا هست که درست نیست


$exist=mysql_query("SELECT `username`,`email` FROM `users`");
while($result=mysql_fetch_array($exist)){
if($username==$result['username']) $error.=$lng['user_exist'].'<br>';}

اینجا شما کار بررسی username رو میتوانید به راحتی توی mysql انجام بدهید با یک کوئری ساده
الان اینجا شما یک کوئری کلی زده اید و با php تمام username ها رو با username ارسال شده از طرف کاربر مقایسه کرده اید که این کار اگر تعداد رکورد ها زیاد باشد کار زمانبری خواهد بود تا اونجایی که امکان داره باید کار پردازش رو سمت mysql انجام بدهید تا سرعت برنامه شما بالاتر برود


<?php
$exist=mysql_query("SELECT `username` from `users` where `username`='$username'");
if(mysql_num_rows($exist)>0)
$error.=$lng['user_exist'].'<br>';
?>

mirzajavad
جمعه 30 مهر 1389, 12:17 عصر
خطلاي اين بخش هم رفع شد
فقط اگر ميشه يك توضيخ هم بدين يعني كدش رو بخونين:لبخندساده:

funpatogh
جمعه 30 مهر 1389, 12:58 عصر
fname=isset($_POST['fname'])?$_POST['fname']:"";
$lname=isset($_POST['lname'])?$_POST['lname']:"";
$username=isset($_POST['username'])?$_POST['username']:"";
$email=isset($_POST['email'])?$_POST['email']:"";
$password=isset($_POST['password'])?$_POST['password']:"";
$repassword=isset($_POST['repassword'])?$_POST['repassword']:"";
$contact=isset($_POST['contact'])?$_POST['contact']:"";
$city=isset($_POST['city'])?$_POST['city']:"";

اینجا تا وقتی که فرم ارسال نشود تمام متغییر های برنامه با مقدار خالی "" ست میشوند در غیر این صورت وقتی فرم ارسال شد با مقادیر ارسال شده از فرم جایگزین میشوند پس تمام متغغیر ها مقدار اولیه دارند تا E_NOTICE هم ایجاد نشود


if(isset($_POST['submit'])){
if(strlen(trim($fname))==0) $error.=$lng['fname'].'<br>';
if(strlen(trim($lname))==0) $error.=$lng['lname'].'<br>';
if(strlen(trim($username))==0) $error.=$lng['username'].'<br>';
$exist=mysql_query("SELECT `username`,`email` FROM `users`");
while($result=mysql_fetch_array($exist)){
if($username==$result['username']) $error.=$lng['user_exist'].'<br>';}
if(strlen(trim($email))==0) $error.=$lng['email'].'<br>';
elseif(!eregi('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zAZ09\-\.]+$',$email)) $error.=$lng['email_valid'].'<br>';
elseif($email==$result['email']) $error.=$lng['email_exist'].'<br>';
if(strlen(trim($password))==0) $error.=$lng['password'].'<br>';
if(strlen(trim($repassword))==0) $error.=$lng['repassword'].'<br>';
else if($password!=$repassword) $error.=$lng['password_match'].'<br>';
if(strlen(trim($contact))==0) $error.=$lng['contact'].'<br>';
if(strlen(trim($city))==0) $error.=$lng['city'].'<br>';

اینجا وقتی که کلید submit ارسال میشود
تمام متغییر ها چک میشود که مقدار معتبر دارند یا خیر اگر نداشته باشند به ازای هر متغییر مشکل دار یک error توی متغییر error ذخیره میشود


$tpl -> assign(array(
'fname'=>$fname,
'lname'=>$lname,
'username'=>$username,
'email'=>$email,
'password'=>$password,
'repassword'=>$repassword,
'contact'=>$contact,
'city'=>$city,
));

اینجا هم تمام مقادیر رو به صورت تگ با مقدارش ایجاد میکنیم که وقتی فرم ارسال شد مقادیر در input ها قرار بگیرند



if(!isset($error)) {
$query=mysql_query("INSERT INTO `users` (`fname`,`lname`,`username`,`email`,`password`,`co ntact`,`city`)
VALUE ('$fname','$lname','$username','$email','".md5($password)."','$contact','$city')")or die(mysql_error());
$tpl -> assign('register',$lng['register']);
}else
$tpl -> assign('error',$error);
}

اینجا هم چک میکنیم که متغییر error ست شده است یا خیر اگر ست نشده باشد به این معنی هست که
تمام متغییر ها معتبر هستند و ایرادی وجود ندارد پس مقادیر فرم را با insert به دیتابیس می فرستیم و یک تگ هم با نام register ایجاد میکنیم تا پیغام موفقیت به کاربر نمایش بدهیم اگر هم متغییر error ست شده باشد یعنی ایرادی وجود دارد
که یک تگ هم با نام error ایجاد میکنیم تا تمام خطاها را نمایش بدهد

mirzajavad
جمعه 30 مهر 1389, 13:12 عصر
مرسي راستش كد رو كه خودم نوشته بودم:لبخند:
منظورم همون بخش اولش بود
يعني يك خط از اينا



fname=isset($_POST['fname'])?$_POST['fname']:"";
دوست دارم نكته اي نباشه كه متوجه نشده باشم

يك خطا هم براي اين بخشه هر كار كردم درست نشد



Deprecated: Function eregi() is deprecated in C:\xampp\htdocs\ebay\register.php on line 34
آيا همه برنامه نويس ها اين خطاها رو ميگيرن آخه چند تا اسكريپت كه نصب كردم اين ارور ها رو نداشتن يعني فايل ارور روي سرور ايجاد نميشد ؟!
آيا اين خطاها يك باگ دربرنامه هستند يا خطري ايجاد نميكنند ؟
و آيا اينكه امكانش هست كسي براي جلوگيري از ثبت خطاها با دستوري و يا ... از ايجاد فايل خطا جلوگيري كند ؟

funpatogh
جمعه 30 مهر 1389, 17:28 عصر
شما اگر اول فایلت


error_reporting(0);

بگزاری هیچ خطایی گزارش نمیشود
و اگر بخواهی به حالت معمول خطاها گزارش بشود


error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

mirzajavad
جمعه 30 مهر 1389, 17:32 عصر
هدف من رعايت اصول هستش
و دوست دارم هيچ گونه خطايي در ارور لوگ نباشه

xoogle.ir
جمعه 30 مهر 1389, 18:39 عصر
اگر از خطاهای سطح NOTICE چشم پوشی کنی کدت خیلی تمیز تر میشه.
الان خالی بودن error log در نظرت مهمه بعدا تمیز بودن کدت هست که مهم میشه.

خطاهای سطح NOTICE هیچ مشکلی برای شما و برنامه تون به وجود نمیارن مثل این میمونه که مثلا شما یه مقاله بنویسی و من بیام به شما گیر بدم که چرا آخر خطت نقطه نذاشتی !! خیلی مهم نیستن.

mirzajavad
جمعه 30 مهر 1389, 18:48 عصر
شما اگر اول فایلت
[php]
error_reporting(0);


يعني اگر اين مقدار رو بدم اصلآ روي سرور فايل ارور لوگ ساخته نميشه يا خطاها نمايش داده نميشن ؟

آيا دوستان ديگر هم همين نظر رو دارن كه براي تميز بودن كد از خطاهاي NOTICE چشم پوش بشه ؟

دوستان ميشه اينو براي من به صورت فارسي بخونين ؟:خجالت:



fname=isset($_POST['fname'])?$_POST['fname']:"";

xoogle.ir
جمعه 30 مهر 1389, 20:40 عصر
میگه که اگر


$_POST['fname']

ست شده بود یعنی مقدار داشت مقدارش رو بذار توی fname$ در غیر این صورت رشته '' رو داخلش بذار.
یعنی قبل از علامت ؟ یک شرط هست که در صورتی که برقرار باشه قسمت اول (یعنی قبل از :) که در اینجا میشه $_POST['fname'] و در صورتی که برقرار نباشه قسمت دوم اجرا میشه (یعنی بعد از :) که در اینجا میشه ''

mirzajavad
جمعه 30 مهر 1389, 21:01 عصر
ببخشيد اينجاشو فهميدم منظور من اينه كه ؟ يعني چي ؟
يعني كار else رو ميكنه ؟
و چرا به جاي = از : استفاده شده ؟
توي نت جستجو كردم چيزي پيدا نكردم
و بگين چه جاهايي ميشه از اين روش استفاده كرد ؟

funpatogh
جمعه 30 مهر 1389, 23:03 عصر
ببخشيد اينجاشو فهميدم منظور من اينه كه ؟ يعني چي ؟
يعني كار else رو ميكنه ؟
و چرا به جاي = از : استفاده شده ؟
توي نت جستجو كردم چيزي پيدا نكردم
و بگين چه جاهايي ميشه از اين روش استفاده كرد ؟
این یک مدل شرط تک خطی هست
برای ساده تر کردن و کوتاه کردن شرط ها
این 2 تا معادل هم هستند


<?php
if(isset($_POST['fname']))
$fname=$_POST['fname'];
else
$fname="";
//Or
$fname=isset($_POST['fname'])?$_POST['fname']:"";
?>

funpatogh
جمعه 30 مهر 1389, 23:07 عصر
اگر از خطاهای سطح NOTICE چشم پوشی کنی کدت خیلی تمیز تر میشه.
الان خالی بودن error log در نظرت مهمه بعدا تمیز بودن کدت هست که مهم میشه.

خطاهای سطح NOTICE هیچ مشکلی برای شما و برنامه تون به وجود نمیارن مثل این میمونه که مثلا شما یه مقاله بنویسی و من بیام به شما گیر بدم که چرا آخر خطت نقطه نذاشتی !! خیلی مهم نیستن.
تقریبا تمام هاست ها به این شکل هستند


error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

این میگه که تمام خطاها به جز Notice ها و Warning ها را گزارش بدهد
برای اینکه در مرورگر اصلا خطایی مشاهده نشود به این شکل استفاده میشود


ini_set('display_errors',0);