PDA

View Full Version : کمک فوری-این Error بره چیه؟



persian_farvahar
سه شنبه 21 خرداد 1387, 19:35 عصر
من تازه چند وقته شروع به کار با php کردم .
من دارم یه سیستم لاگین برای کاربرایی که عضو شده اند را ایجاد می کنم ولی هنگام ورود با با error زیر در مورد session مواجه شدم .


Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\program files\easyphp1-8\www\login.php:2) in c:\program files\easyphp1-8\www\login.php on line 3

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\login.php:2) in c:\program files\easyphp1-8\www\login.php on line 3
Resource id #3کاربری با این نام وجود ندارد
Notice: Undefined variable: storedpassw in c:\program files\easyphp1-8\www\login.php on line 26
رمز عبور اشتباه است!



در ضمن من رمز عبور و نام کاربری را صحیح وارد می کنم ولی در error بالا از نام کاربری و رمز عبور هم ایراد می گیرد.
و اینکه من اصلآ به تنظیمات php.ini دست نزدم.

اینم کد لاگین من



<meta http-equiv="content-type" content="text/html; charset=utf-8">
<?php
session_start();

$username = $_GET['user_n'];
$password = $_GET['passw'];

mysql_connect('localhost', 'root','') or die(mysql_error());
mysql_select_db('ebay') or die(mysql_error());

$username = mysql_real_escape_string(htmlentities($username, ENT_QUOTES, 'UTF-8'));
$password = mysql_real_escape_string($password);

$query = mysql_query("SELECT passw FROM register WHERE user_n = '$username';");

if (mysql_num_rows($query) == 1)
{

list($storedpassw) = mysql_fetch_row($query);

}
else
{
echo "کاربری با این نام وجود ندارد";
}
if($storedpassw == $password)

{
$_SESSION['userInfo'] = $username;
$_SESSION['userPInfo'] = $storedPassWord;
mysql_close();
echo "salam";
}
else
{
echo "رمز عبور اشتباه است!";
mysql_close();
}
?>

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

musiox
سه شنبه 21 خرداد 1387, 20:04 عصر
شما رو تو رو به خدا عالی جنابان php یه تاپیک خطاهای متداول راه بندازین که این جماعت وحشت زده از warning و ... یه سوال رو 1000 بار نپرسن تا 1000 بار به RTFM ارجاع ندین یا بگین جستجو قبل از پرسش و...

persian_farvahar
سه شنبه 21 خرداد 1387, 22:26 عصر
حالا شما میگید من چکار کنم
بابا یکی کمک کنه

Bahram0110
سه شنبه 21 خرداد 1387, 22:37 عصر
دوست عزیز این سوال 1000 بار پرسیده شده و 999 بار جواب داده شده


شما رو تو رو به خدا عالی جنابان php یه تاپیک خطاهای متداول راه بندازین که این جماعت وحشت زده از warning و ... یه سوال رو 1000 بار نپرسن تا 1000 بار به RTFM ارجاع ندین یا بگین جستجو قبل از پرسش و...

هست ولی خب! اگه به قول شما یه اعلان واسه خطاهای اینجوری بذارن بهتره
:: فهرست تاپیک های مهم این بخش :: (http://barnamenevis.org/forum/showthread.php?t=19114)

yaqubian
سه شنبه 21 خرداد 1387, 22:40 عصر
دوست عزیز کدت رو با چی نوشتی؟ شاید همون مشکل همیشگی اضافه شدن 3 کاراکتر باشه؟

yaqubian
سه شنبه 21 خرداد 1387, 22:53 عصر
دوست عزیز این کار رو هم بکن
در فایل php.ini در مسیر c:\windows
مقدار session.auto_start رو برابر 1 قرار بده بعد دستگاه رو ReStart کن

hejjat
چهارشنبه 22 خرداد 1387, 05:01 صبح
توی کدت بعد از اینکه کوئری رو اجرا می کنی یه if گذاشتی که اگه کوئری یه رکورد برگردوند اونوقت متغیر storedpassw رو مقداردهی می کنی و چون storedpassw رو تو بلوک if تعریف کردی اگه شرط برقرار نباشه storedpassw تعریف نشده باقی می مونه. معلومه که کوئریت هیچ رکوردی بر نمی گردونه که storedpassw تعریف نشده، مشکل session رو هم که دوستان توضیح دادن، یه متغیر تعریف نشده دیگه به اسم storedPassWord هم داری

persian_farvahar
چهارشنبه 22 خرداد 1387, 11:10 صبح
مشکل اون warning حل شد .


توی کدت بعد از اینکه کوئری رو اجرا می کنی یه if گذاشتی که اگه کوئری یه رکورد برگردوند اونوقت متغیر storedpassw رو مقداردهی می کنی و چون storedpassw رو تو بلوک if تعریف کردی اگه شرط برقرار نباشه ........

ممنون. متغیر storedPassWord را هم درست کردم ولی ربطی به این چیزایی که شما گفتین نداره منظورم اینه که به بلوک ها ربط نداره
چون من با یک مقدار صحیح در بانکم امتحان کردم ولی باز هم پیغام رمز عبور اشتباه است را بهم میده.
یه چیزی را هم بگم من خودم یکی از خطا ها را گرفتم و اون این بود که من موقع درج در بانک فیلد پسورد را با تابع هش md5 پر می کنم ولی موقعی که پسورد را وارد می کردم به طور معمول وارد می کردم و یه جایی از کد بالا زا به شکل زیر تغییر دادم


}

if($storedpassw == md5($password))

{


$_SESSION['userInfo'] = $username;
$_SESSION['userPInfo'] = $storedPassw;

ولی باز هم پیغام خطا رمز عبور اشتباه است را میده من مقدار ورودی چک کردن این فیلد را تبدیل به md5 کردم و چاپ کردم یه حروفی میده که چند حرف اول آن با فیلد موجود در بانک برابری می کند ولی بقیه حروف اصلآ ربطی به این رمز عبور نداره.
این تفاوت از چی میتونه بشه
امیدوارم منظورمو خوب رسونده باشم

hejjat
چهارشنبه 22 خرداد 1387, 12:20 عصر
تو مطمئنی از md5 استفاده کردی؟ مگه می شه یه عبارت هر دفعه که با md5 هش بشه یه رشته دیگه بده؟
یه یوزر دیگه درست کن ببین پسوردی که وقت رجیستر انتخاب می کنی درست هش می شه یا نه

yaqubian
چهارشنبه 22 خرداد 1387, 12:41 عصر
دوست عزیز اولا یادت باشه که از لحاظ امنیتی هیچ وقت لاگین و پسورد رو با GET دریافت نمی کنن
ثانیا مطمئنی که موقعی که کلمه عبور رو تو DB درج کردی با فرمت MD5 این کار رو کردی؟
حتما چک کن موفق باشی

persian_farvahar
چهارشنبه 22 خرداد 1387, 14:40 عصر
مشکل حل شد .
اینو میزارم برای کسایی که مثل من تازه کارند.
برای فیلدی که می خواهیم از تابع md5 هش شود حداقل اندازه را در هنگام ساخت جدول 32 باید در نظر گرفت ولی معمولآ فیلد رمز عبور را (که معمولآ هش می کنند) 255 می گیرند(اینو دیگه نمیدونم برای چیه).
ولی من موقع ساخت جدول اندازه این فیلد را 20 گرفته بودم به خاطر همین فقط 20 حرف اول رمز شده این تابع در جدول ریخته می شد و وقتی که چک می کردم که آیا رمز عبور صحیح وارد شده خطا میداد.

vahid4134
چهارشنبه 22 خرداد 1387, 16:59 عصر
در استفاده از تابع md5 بهتره که اندازه فیلد جدول ۴۰ باشه. و چون این مقدار ثابت هم هست از نوع char استفاده کنید

musiox
چهارشنبه 22 خرداد 1387, 17:41 عصر
در استفاده از تابع md5 بهتره که اندازه فیلد جدول ۴۰ باشه.

لطف می کنی دلیلشو بگی ؟ ممنون.

vahid4134
پنج شنبه 23 خرداد 1387, 09:44 صبح
لطف می کنی دلیلشو بگی ؟ ممنون.

ببخشید من اشتباهی هواسم رفت پیش encrypt های خودم که ۴۰ کاراکتر بر می گردونن.
چون md5 ۳۲ کاراکتر بر می گردونه باید char 32 بزارید دلیل استفاده از char هم این هست که چون مقدارش ثابت هست در بهینه سازی mysql موثر هست

امید امرایی
پنج شنبه 23 خرداد 1387, 19:20 عصر
وقتی همیشه مقدار ثابته فرقی نمی کنه char باشه یا varchar
زمانی بهتره از char استفاده بشه که ممکنه طول ها متغیر باشه چون بقیه رو با space پر می کنه

vahid4134
پنج شنبه 23 خرداد 1387, 21:43 عصر
varchar ثابت نیست. اگر مقدار کم باشد طول رو کم می کنه و در حجم بسیار موثر هست. mysql همیشه سعی داره که طول varchar رو تغییر بده. اما char بر خلاف این هست و مقدارش همیشه ثابت هست. اگر مقدار شما هم همیشه ثابت هست استفاده از char سرعت رو بالا مبره. (وگرنه به نظر شما فرق بین char و varchar چی هست و چه مزیتی char به varchar داره؟()

امید امرایی
جمعه 24 خرداد 1387, 02:39 صبح
فرق بین char و varchar اینه که وقتی به عنوان مثال طول یک Column به اندازه 40 انتخاب شده و نوعش varchar باشه در اون صورت اگه شما مقدار وارد شدتون به طول 30 باشه 30تای اولی پر و بقیش برابر NULL هستش .
اما اگه نوع char باشه 30 تای ابتدای با خود مقدار پر میشه بقیش با space
لذا وقتی همیشه مقدار های ورودی ثابت هستند مثل زمانی که فیلد مربوط به پسوورد های عبورداده شده از الگوریتم md5 یا sha1 باشه فرقی نمی کنه که از char استفاده بکنید یا varchar چون به هر حال طول ثابته و عملکرد char بی تاثیر
اما وقتی ممکنه مقادیر ورودی طول متفاوت داشته باشن حالا اگه ملاک ما سرعت باشه باید char تعیین بشه دلیلش هم اینه که Engine بانک اطلاعاتی فیلد های همسان از نظر طول رو بهتر index و index ها رو راحت تر پیدا می کنه اما طبیعیه که حجم بیشتری از بانک اطلاعاتی هم اشغال می شه
پس اگه ملاک فضا باشه باید نوع varchar استفاده بشه

vahid4134
جمعه 24 خرداد 1387, 11:27 صبح
درست عرض کردید.
اما در mysql برای فیلد varchar باید همیشه هم طول رشته رو حساب کنه و هم طول خود فیلد. حساب کردن طول رشته زمانبر هست. اما در char این عملیات انجام نمیشه بنابراین سرعت درج بالا میره.

Bahram0110
جمعه 24 خرداد 1387, 11:44 صبح
به نظر من چنين سرعتي واسه سايت هاي كوچيك اصلا مهم يا محسوس نيست
چنين فضايي هم مهم نيست

vahid4134
جمعه 24 خرداد 1387, 16:41 عصر
درسته مهم نیست اما همیشه باید mysql رو بهینه طراحی کرد

nimatramon
جمعه 24 خرداد 1387, 21:13 عصر
دوست عزیز
در php همیشه session_start باید در اولین خط فایل قرار داشته باشه متا تگ را بعد از session تعریف کن و session را در اولین خط قرار بده