koslibpro Δημοσ. 16 Ιουνίου 2012 Δημοσ. 16 Ιουνίου 2012 Καλησπερα και παλι φιλοι μου, εχω φτιαξει μια πλατφορμα register-login με php. και θελω οταν συνδεεται ενας χρηστης,κανοντας επιτυχημενα Log in,να τον ανακατευθυνει σε ενα Index.php αρχειο στο οποιο θα γραφει κατι σαν "welcome user <to_username_tou>" Και να εχει και την επιλογη του Log out. Αυτο θα γινει με χρηση sessions.οποτε εγω το επιχειρω με τον εξης τροπο: >if(session_is_registered("username")){ echo 'Welcome user ' . $_SESSION["username"] . '<br/><a href="logout.php">Log off</a>'; } αλλα μου τα εμφανιζει ολα εκτος απο το username του συνενδεμενου χρηστη. μπορειτε να με βοηθισετε λιγο με αυτο? σας ευχαριστω
παπι Δημοσ. 16 Ιουνίου 2012 Δημοσ. 16 Ιουνίου 2012 Καλησπερα και απλι φιλοι μου, εχω φτιαξει μια πλατφορμα register-login με php. και θελω οταν συνδεεται ενας χρηστης,κανοντας επιτυχημενα Log in,να τον ανακατευθυνει σε ενα Index.php αρχειο στο οποιο θα γραφει κατι σαν "welcome user <to_username_tou>" Και να εχει και την επιλογη του Log out. Αυτο θα γινει με χρηση sessions.οποτε εγω το επιχειρω με τον εξης τροπο: >if(session_is_registered("username")){ echo 'Welcome user ' . $_SESSION["username"] . '<br/><a href="logout.php">Log off</a>'; } αλλα μου τα εμφανιζει ολα εκτος απο το username του συνενδεμενου χρηστη. μπορειτε να με βοηθισετε λιγο με αυτο? σας ευχαριστω Γιατι δεν ποσταρεις στο web development
koslibpro Δημοσ. 16 Ιουνίου 2012 Μέλος Δημοσ. 16 Ιουνίου 2012 το θεωρουσα πιο πολυ προγραμματισιτκο θεμα,ομως οκ θα κανω ενα report να το μεταφερει καποιος mod απο 'κει.
dewn735 Δημοσ. 16 Ιουνίου 2012 Δημοσ. 16 Ιουνίου 2012 Έχεις ορίσει πουθενά το $_SESSION["username"]; Επίσης, έχεις δώσει πουθενά το session_start();
koslibpro Δημοσ. 16 Ιουνίου 2012 Μέλος Δημοσ. 16 Ιουνίου 2012 Έχεις ορίσει πουθενά το $_SESSION["username"]; Επίσης, έχεις δώσει πουθενά το session_start(); βεβαιως. οριστε ολο το αρχειο μου: > <?php session_start(); ?> <html> <head> </head> <body> <?php if(!session_is_registered("username")){?> <form action="login.php" method="post"> <b style="font-size:150%;">Log in</b><br/> Username: <input type="text" name="username"/><br/> Password: <input type="password" name="password"/><br/> <input type="submit" value="Log in"/> </form> Don`t have an account? <form action="register.php" method="post"><br/> <b style="font-size:150%;">Register</b><br/> Username: <input type="text" name="username"/><br/> Password: <input type="password" name="password"/><br/> Retype password: <input type="password" name="retype-password"/><br /> E-mail: <input type="email" name="email"/><br /> <input type="submit" value="Register" /> </form> <?php } else{ echo 'Welcome user ' . $_SESSION["username"] . '<br/><a href="logout.php">Log off</a>'; include ("upload.php"); }?> <?php include ("system/footer.php"); ?> </body> </html> ειναι το index.php αρχειο.ελεγχει αν ο χρηστης ειναι συνενδεμενος και αν ειναι,του δειχνει (θεωρητικα ακομα) αυτο που προσπαθω εγω τωρα,αν δεν ειναι,του λεει να συνδεθει ή να εγγραφει. και το Login.php ειναι το: > <?php session_start(); mysql_connect('localhost', 'root', 'password') or die ("Error establishing database connection".mysql_error()); mysql_select_db('dbname') or die ("Error establishing a database connection ".mysql_error()); $pass = hash("sha256", $_POST['password']); $query = sprintf("SELECT * FROM users WHERE username='%s' and password='%s'", mysql_real_escape_string($user), mysql_real_escape_string($pass)); $result = mysql_query($query) ; if($result){ session_register("username"); header("location:index.php"); } else { echo 'Wrong username or password!'; } ?>
koslibpro Δημοσ. 16 Ιουνίου 2012 Μέλος Δημοσ. 16 Ιουνίου 2012 Μου φαινεται αφυσικο το να μην το δειχνει το username..μα εχω την εντυπωση οτι ειναι ολοσωστο,κανω λαθος?
dewn735 Δημοσ. 16 Ιουνίου 2012 Δημοσ. 16 Ιουνίου 2012 α) >if($result){ //Εδώ θα έπρεπε να έχεις ορίσει το περιεχόμενο της $username //$username=mysql_result($result,0,"username"); session_register("username"); header("location:index.php"); } β)Από το manual (http://php.net/manua...on-register.php): This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0. Οπότε, κάντο καλύτερα με απευθείας ανάθεση τιμής: >if($result){ //Εδώ θα έπρεπε να έχεις ορίσει το περιεχόμενο της $username //$_session['username']=mysql_result($result,0,"username"); header("location:index.php"); }
koslibpro Δημοσ. 16 Ιουνίου 2012 Μέλος Δημοσ. 16 Ιουνίου 2012 dewn735 μου λες οτι θα επρεπε να εχω ορισει το περιεχομενο της $username. εννοεις κατι σαν >$username=$_GET['username']; απο την καταχωρηση της φορμας? και επισης,εκει που μου γραφεις >$_session['username']=mysql_result($result,0,"username"); το 0 τι ακριβως συμβολιζει εκει περα? αυτα ειναι που με μπερδευουν..
dewn735 Δημοσ. 16 Ιουνίου 2012 Δημοσ. 16 Ιουνίου 2012 dewn735 μου λες οτι θα επρεπε να εχω ορισει το περιεχομενο της $username. εννοεις κατι σαν >$username=$_GET['username']; απο την καταχωρηση της φορμας? Ναι, κάπως έτσι και επισης,εκει που μου γραφεις >$_session['username']=mysql_result($result,0,"username"); το 0 τι ακριβως συμβολιζει εκει περα? http://php.net/manua...ysql-result.php Έχεις ήδη στείλει στη Mysql ένα query και (εφόσων υπάρχει ο συνδιασμός χρήστη-κωδικού) σου επιστρέφει έναν πίνακα με τα αποτελέσματα. Αν είσαι σωστός, ο πίνακας θα πρέπει να έχει μία μόνο γραμμή - αυτή είναι η γραμμή 0
koslibpro Δημοσ. 17 Ιουνίου 2012 Μέλος Δημοσ. 17 Ιουνίου 2012 Κοιταξτε,τωρα τα αρχεια μου εχουν ως εξης: register register.php > <?php ini_set('display_errors', 1); ini_set('error_reporting', E_ALL); session_start(); mysql_connect('localhost', 'root', '') or die ("Error establishing database connection".mysql_error()); mysql_select_db('dbname') or die ("Error establishing a database connection ".mysql_error()); if ( (isset( $_POST[ 'username' ] )) && (isset( $_POST[ 'password' ] )) && ($_POST[ 'username' ] != null) && ($_POST[ 'password' ] != null) ) { $username = mysql_real_escape_string($_POST["username"]); $password = mysql_real_escape_string($_POST[ 'password' ]); $email = $_POST[ 'email' ]; $password = hash("sha256",$password); // check if username exists $query = sprintf("SELECT username FROM users WHERE username='%s' AND password='%s'", mysql_real_escape_string ($username),mysql_real_escape_string($password)); // Perform Query $result = mysql_query($query); if ( mysql_num_rows( $result ) == 0 ) { mysql_query('INSERT INTO users VALUES ('$username','$password','$email')'); $_SESSION[ 'username' ] = $username; header( 'Location: index.php' ); } else { echo ( 'Error: User already in database' ); } } else { echo( 'Please provide both a username and a password.' ); } ?> login.php > <?php ini_set('display_errors', 1); ini_set('error_reporting', E_ALL); session_start(); mysql_connect('localhost', 'root', '') or die ("Error establishing database connection".mysql_error()); mysql_select_db('dbname') or die ("Error establishing a database connection ".mysql_error()); $username = mysql_real_escape_string($_POST["username"]); $password = hash("sha256", $_POST['password']); $query = sprintf("SELECT * FROM users WHERE username='%s' and password='%s'",mysql_real_escape_string($username), mysql_real_escape_string($password)); $query = mysql_query($query); if($query){ $_SESSION["username"] = $_POST["username"]; header("location:index.php"); } else { echo 'Wrong username or password!'; } ?> ΑΛΛΑ γινεται το Login με οποιαδηποτε στοιχεια,ειτε ειναι σωστα ειτε δεν ειναι,ειτε υπαρχουν στην βαση ειτε δεν υπαρχουν!!! και δεν πραγματοποιειται το registration ποτε,δεν περνα κανενα στοιχειο στην βαση δεδομενων.. τι φταιει δηλαδη αυτη τη φορα?,...
defacer Δημοσ. 17 Ιουνίου 2012 Δημοσ. 17 Ιουνίου 2012 Φταίει το if($query) γιατί θα είναι true πάντα εκτός και αν κάτι πάει στραβά κατά την εκτέλεση του query (π.χ. δε μπορείς να συνδεθείς στη MySql). Υπάρχει επίσης ένα bug στο registration όπου κάνεις mysql_real_escape_string 2 φορές (παρόλο που λόγω του ότι η έξοδος του sha είναι όπως είναι το bug δε φαίνεται γιατί είτε 0 φορές κάνεις escape είτε 1 εκατομμύριο δεν πρόκειται να αλλάξει κάτι). Καλύτερα θα ήταν όταν θέλεις να δεις αν υπάρχει ένα row να κάνεις πάντα SELECT COUNT(*) FROM ... WHERE ... (κάτι που πάντα θα επιστρέφει 1 row) και μετά να βλέπεις αν το count είναι 0 ή όχι.
koslibpro Δημοσ. 17 Ιουνίου 2012 Μέλος Δημοσ. 17 Ιουνίου 2012 Φταίει το if($query) γιατί θα είναι true πάντα εκτός και αν κάτι πάει στραβά κατά την εκτέλεση του query (π.χ. δε μπορείς να συνδεθείς στη MySql). Υπάρχει επίσης ένα bug στο registration όπου κάνεις mysql_real_escape_string 2 φορές (παρόλο που λόγω του ότι η έξοδος του sha είναι όπως είναι το bug δε φαίνεται γιατί είτε 0 φορές κάνεις escape είτε 1 εκατομμύριο δεν πρόκειται να αλλάξει κάτι). Καλύτερα θα ήταν όταν θέλεις να δεις αν υπάρχει ένα row να κάνεις πάντα SELECT COUNT(*) FROM ... WHERE ... (κάτι που πάντα θα επιστρέφει 1 row) και μετά να βλέπεις αν το count είναι 0 ή όχι. στην θεση του if($query) τι θα επρεπε να παει? τα υπολοιπα που μου ειπες τα επεξεργαζομαι τωρα στο μιαλο μου και στην πραξη να δω τι μπορω να κανω και θα τα ξαναποσταρω διορθωμενα(οσο μμπορω)..
defacer Δημοσ. 17 Ιουνίου 2012 Δημοσ. 17 Ιουνίου 2012 Λοιπόν θα ξεκινήσω από λίγο πιο πίσω. Πάμε στο documentation για τη mysql_query. Τι βλέπουμε; Πως δε θα έπρεπε να τη χρησιμοποιείς γιατί υπάρχουν "σωστότερες" επιλογές ("use of this extension is discouraged"). For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error. Επομένως "κανονικά" πάντα θα επιστρέφεται ένα resource, το οποίο εσύ μετά βάζεις μέσα στο test if($query) -- προκαλείς δηλαδή τη "μετατροπή" του resource σε boolean για να κάνεις το test. Όπως μπορείς να δεις εδώ, "Every other value is considered TRUE (including any resource)". Αυτή είναι η εξήγηση γι' αυτό που βλέπεις -- ο λόγος είναι προφανής βέβαια: αν σε ένα if εκτελείται πάντα το "true" branch, αυτό σημαίνει πολύ απλά ότι η συνθήκη είναι πάντα true οπότε στη συγκεκριμένη περίπτωση η συνθήκη είναι λάθος (δεν υπάρχει άλλη λογική εξήγηση). Τώρα όσον αφορά αυτό που ρώτησες: το query έτσι όπως το έχεις γραμμένο θα επιστρέφει είτε 0 είτε 1 row. Επομένως ο τρόπος να το ελέγξεις αυτό είναι >$query = sprintf("SELECT * FROM ...") // μη ξαναχρησιμοποιείς το ίδιο όνομα // το μόνο που θα καταφέρεις είναι να μπερδευτείς $res = mysql_query($query); if (mysql_fetch_row($res)) { // επεστράφη τουλάχιστον 1 row, δηλαδή στην περίπτωσή μας ακριβώς 1 } else { // 0 rows άρα λάθος username/password } Γιατί δουλεύει αυτό; Γιατί η mysql_fetch_row "Returns an numerical array of strings that corresponds to the fetched row, or FALSE if there are no more rows." Επομένως ελέγχουμε για "truthfulness" είτε την τιμή boolean false (που προφανώς είναι false) είτε έναν πίνακα που έχει τουλάχιστον ένα στοιχείο. Πίνακας που δεν είναι κενός αντιστοιχεί σε true (το λέει στο link που έδωσα παραπάνω μιλώντας για το resource). Κατά τα άλλα δε σ' ενδιαφέρει ακριβώς το τι έχει μέσα ο πίνακας και γι' αυτό εδώ δεν αποθηκεύω την επιστρεφόμενη τιμή της mysql_fetch_row. Πάντως ξαναπροτείνω να παρατήσεις τη mysql extension και να χρησιμοποιείς μόνο PDO.
koslibpro Δημοσ. 17 Ιουνίου 2012 Μέλος Δημοσ. 17 Ιουνίου 2012 Ομολογω οτι απο το bug για το mysql_real_escape που αναφερεις και κατω σε εχασα... να τα αρχεια μου οπως ειναι τωρα,με μικροαλλαγες: login.php > <?php ini_set('display_errors', 1); ini_set('error_reporting', E_ALL); session_start(); mysql_connect('localhost', 'root', '') or die ("Error establishing database connection".mysql_error()); mysql_select_db('dbname') or die ("Error establishing a database connection ".mysql_error()); $username = mysql_real_escape_string($_POST["username"]); $password = hash("sha256", $_POST['password']); $query = sprintf("SELECT * FROM users WHERE username='%s' and password='%s'",mysql_real_escape_string($username), mysql_real_escape_string($password)); $query = mysql_query($query); if($result){ $_SESSION["username"] = $_POST["username"]; header("location:index.php"); } else { echo 'Wrong username or password!'; } ?> πως μπορω εδω να ξεχωρισω το if($query) Ποτε θα ειναι true και ποτε false.?τι θα πρεπει να κανω? και το register.php > <?php session_start(); mysql_connect('localhost', 'root', '') or die ("Error establishing database connection".mysql_error()); mysql_select_db('dbname') or die ("Error establishing a database connection ".mysql_error()); if ( (isset( $_POST[ 'username' ] )) && (isset( $_POST[ 'password' ] )) && ($_POST[ 'username' ] != null) && ($_POST[ 'password' ] != null) ) { $username = mysql_real_escape_string($_POST[ 'username' ]); $password = $_POST[ 'password' ]; $email = $_POST[ 'email' ]; $password = hash("sha256",$password); // check if username exists $query = sprintf("SELECT COUNT * FROM users WHERE username='%s' AND password='%s'", mysql_real_escape_string ($username),mysql_real_escape_string($password)); // Perform Query $result = mysql_query($query); if ( mysql_num_rows( $result ) == 0 ) { mysql_query('INSERT INTO users SET username = "' . $username . '", password = "' . $password . '", email = "' . $email . '";'); $_SESSION[ 'username' ] = $username; header( 'Location: index.php' ); } else { echo ( 'Error: User already in database' ); } } else { echo( 'Please provide both a username and a password.' ); } ?> το register.php κανει κανονικα τωρα τις εγγραφες,το Login μονο ειναι που τωρα εχει προβλημα,γιατι ακομη και σωστα στοιχεια να βαλω,μου λεει wrong username or password! μπορειτε να μου πειτε ποια ειναι τωρα τα λαθη μου?
defacer Δημοσ. 17 Ιουνίου 2012 Δημοσ. 17 Ιουνίου 2012 Ρε συ λίγη προσοχή. >if($result){ Μόνο που το $result δεν ορίζεται πουθενά. Αφού έχεις και E_ALL στο error_reporting σου το λέει κιόλας. Γιατί το αγνοείς;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα