הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   בעיה ביצירת התחברות לאתר. (https://hosts.co.il/forums/showthread.php?t=81724)

dor77 20-03-10 00:25

בעיה ביצירת התחברות לאתר.
 
שלום..
יצרתי מערכת משתמשים, בדף הבא, דף ההתחברות אני עושה בדיקה אם השם משתמש והסיסמא הם אכן נכונים.
עשיתי את הבדיקה הזו:

PHP קוד:


mysql_connect
("localhost""root""");
mysql_select_db("phpmyadmin"); 
$user_name mysql_real_escape_string(htmlspecialchars($_POST['user_name']));
$password mysql_real_escape_string(htmlspecialchars(md5($_POST['password'])));
$query mysql_query("SELECT * FROM users WHERE user_name='$user_name'"); 
$row=mysql_fetch_array($query);
$row_password=$row['password'];
$row_user_name=$row['user_name'];


if (isset(
$_POST['submit']))
{
if (
$row_password==$password && $row_user_name==$user_name)
{
    
setcookie("username"$user_nametime()+60000);
    
setcookie("id"$id_cookietime()+60000);
    
header("location: index.php");
    exit; 
}
  else
{
echo 
"Login Fail";


אם מקישים נתונים לא נכונים אז מתקבלת הודעת שגיאה ואם הנתונים נכונים אז אכן מתחברים כמו שצריך..
הבעיה היא כשלא משיקים כלום וישר לוחצים על הכפתור, הגולש מועבר לאינדקס ללא הצבת עוגיות.
ניסתי לשים תנאי נוסף של empty אבל לא הלך, אולי לא עשיתי את זה נכון..הצעות?

תודה ושבת שלום :)

Shay Ben Moshe 20-03-10 00:59

את כל הקטע בהתחלה עד הif תעביר לתוך הif.

dor77 20-03-10 01:04

עשיתי..לא עובד..
זה הקוד:

PHP קוד:

if (isset($_POST['submit']))
{
mysql_connect("localhost""root""");
mysql_select_db("phpmyadmin"); 
$user_name mysql_real_escape_string(htmlspecialchars($_POST['user_name']));
$password mysql_real_escape_string(htmlspecialchars(md5($_POST['password'])));
$query mysql_query("SELECT * FROM users WHERE user_name='$user_name'"); 
$row=mysql_fetch_array($query);
$row_password=$row['password'];
$row_user_name=$row['user_name'];
$password_cookie=$row['password'];
$user_name_cookie=$row['user_name'];
if (
$row_password==$password && $row_user_name==$user_name)
{
    
setcookie("username"$user_nametime()+60000);
    
setcookie("id"$id_cookietime()+60000);
    
header("location: index.php");
    exit; 
}
  else
{
echo 
"Login Fail";



Daniel 20-03-10 08:42

הבעייה פשוטה מאוד.
תסתכל על הקוד שלך - הוספתי רווחים כדי שיהיה יותר מסודר:
PHP קוד:

if (isset($_POST['submit'])) {
    
mysql_connect("localhost""root""");
    
mysql_select_db("phpmyadmin");
    
$user_name mysql_real_escape_string(htmlspecialchars($_POST['user_name']));
    
$password mysql_real_escape_string(htmlspecialchars(md5($_POST['password'])));
    
$query mysql_query("SELECT * FROM users WHERE user_name='$user_name'");
    
$row mysql_fetch_array($query);
    
$row_password $row['password'];
    
$row_user_name $row['user_name'];
    
$password_cookie $row['password'];
    
$user_name_cookie $row['user_name'];
    if (
$row_password == $password && $row_user_name == $user_name) {
        
setcookie("username"$user_nametime() + 60000);
        
setcookie("id"$id_cookietime() + 60000);
        
header("location: index.php");
        exit;
    } else {
        echo 
"Login Fail";
    }


נסה "להריץ את זה בראש" כשלא שולחים כלום, ותראה מה יקרה (ז"א isset($_POST['submit'] = FALSE)


אגב, יש לך עוד כמה בעיות והרגלים לא נכונים בקוד...
בשורה 6,
PHP קוד:

]));
$password mysql_real_escape_string(htmlspecialchars(md5($_POST['password']))); 

למה htmlspecialchars או mysql_real_escape_string? md5 תמיד מחזירה string בעל 32 תווים מהבסיס ההקסדימאלי (0-9, a-f), ולכן לא צריך לעשות שום "סינון" לזה.

בשורה 7,
PHP קוד:

])));
$query mysql_query("SELECT * FROM users WHERE user_name='$user_name'"); 

למה לשלוף את הכל? שלוף תמיד רק את מה שאתה צריך. ובנוסף - זאת התחברות. אתה אמור לעשות משהו בסגנון של
PHP קוד:

])));
$query mysql_query("SELECT * FROM users WHERE user_name='$user_name' AND password='$password'"); 


ואז כמובן שורה 8 מיותרת.


בשורה 9, אתה קורא למשתנה שכבר ידוע לך - השתמשת בו בשאילתה.
בקיצור כל החלק הזה:
PHP קוד:

$row_password=$row['password'];
$row_user_name=$row['user_name'];
$password_cookie=$row['password'];
$user_name_cookie=$row['user_name']; 

דיי מיותר.

את ה-if כמובן צריך להוריד כי אתה כבר בודק את זה בשאילתה.

ו-$user_name ו-$id_cookie לא מוגדרים.



זה על רגל אחת.

dor77 20-03-10 14:52

קודם כל, תודה רבה לך על הכל.
האמת שאני לא כל כך מסכים איתך לגבי כמה הערות אבל אני יודע וברור לי שאתה מנוסה יותר..
קצת יהיה קשה לנהל פה שיחה, יש לך Icq אולי?
בכל אופן, בוא נעזוב את שאר הבעיות שעם חלקן אני לא מסכים.
מה הבעיה בקטע של isset($_POST['submit'] = FALSE?
הרי אם לא לחצו, אז לא קורה כלום..
הבעיה היא שכן לוחצים אבל לא מזינים כלום..למה זה קורה?
למה זה עדיין מעביר לindex?
אולי פספסתי את התשובה שלך.
אם הסיסמא שנשלפה מהמסד היא 123456 והסיסמא שכאילו הוקשה היא כלום ז"א "" אז הם עדיין לא שווים, כלום לא שוה ל 123456.
אני טועה? מה הבעיה?

תודה רבה לך, אתה מאוד עוזר לי :)

Daniel 20-03-10 20:27

ציטוט:

נכתב במקור על ידי dor77 (פרסם 758813)
קודם כל, תודה רבה לך על הכל.
האמת שאני לא כל כך מסכים איתך לגבי כמה הערות אבל אני יודע וברור לי שאתה מנוסה יותר..
קצת יהיה קשה לנהל פה שיחה, יש לך Icq אולי?
בכל אופן, בוא נעזוב את שאר הבעיות שעם חלקן אני לא מסכים.
מה הבעיה בקטע של isset($_POST['submit'] = FALSE?
הרי אם לא לחצו, אז לא קורה כלום..
הבעיה היא שכן לוחצים אבל לא מזינים כלום..למה זה קורה?
למה זה עדיין מעביר לindex?
אולי פספסתי את התשובה שלך.
אם הסיסמא שנשלפה מהמסד היא 123456 והסיסמא שכאילו הוקשה היא כלום ז"א "" אז הם עדיין לא שווים, כלום לא שוה ל 123456.
אני טועה? מה הבעיה?

תודה רבה לך, אתה מאוד עוזר לי :)

אם אתה לא מסכים - אל תעשה עד שתסכים. כי לכל דבר יש את הסיבה שלו, ועדיף לא לעשות מאשר לעשות בלי להבין.

עכשיו פתאום אני לא בטוח ב-100% אם הבנתי את השאלה שלך.
תסתכל, אם אין $_POST['submit'], אז פשוט לא קורה כלום. נסה להריץ את זה בראש שורה אחר שורה. אם אין $_POST['submit'] וזה כל הקוד אמור להופיע רק דף ריק.
למה? כי על ההתחלה יש
PHP קוד:

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

וזה מכליל את כל הדברים.

אתה בטוח שמה שנתת כאן זה כל הקוד?

בנוגע למה ששלחת בה"פ
ציטוט:

נכתב במקור על ידי dor77
באשכול שלי אמרת שיש בעיה בשורה הזו:

PHP קוד:

$query mysql_query("SELECT * FROM users WHERE user_name='$user_name'"); 

אתה הצעת להוסיף את זה:

PHP קוד:

AND password=='$password' 

לא מצאתי סיבה לעשות את זה..
שמע, מה שאני עושה זה בודק את הסיסמא של השם משתמש שהוקש, אם הסיסמא שנשלפה היא כמו הסיסמא שהקושה אז מתבצעת התחברות.

אני טועה?

תודה.

דבר ראשון - זה לא ==, זה רק = אחד (ב-MySQL משתמשים ב= אחד).
אתה יכול ישר לבדוק במסד עצמו. "שלוף מתוך המסד הנתונים איפה שה-username = (מה שהקישו כשם משתמש) ואיפה שהסיסמא = (מה שהקישו כסיסמא מוצפן ב-md5)"
זה יותר יעיל לעשות את כל הביצוע עצמו במסד. המסד בעצמו בודק האם יש שם משתמש וסיסמא שתואמים למה שהקישו.

dor77 20-03-10 21:38

אוקיי אתה צודק לעשות דבר כזה אבל רק במקרה שאני מוןסיף mysql_num_rows..
רק אז זה נכון..
אני צודק?

תודה רבה.

Daniel 20-03-10 22:11

אכן. אם אתה רוצה לתכנת באופן "נכון", זאת הדרך.


כל הזמנים הם GMT +2. הזמן כעת הוא 21:51.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ