antonisid Δημοσ. 28 Δεκεμβρίου 2011 Δημοσ. 28 Δεκεμβρίου 2011 Καλησπέρα, έχω φτιάξει μια φόρμα με username και password,δουλεύει κανονικά αλλά κατά την επιτυχή είσοδο των στοιχείων δεν πηγαίνει στο admin.php όπως θα'πρεπε.Το ίδιο γίνεται και στο admin.php όταν δεν υπάρχει session (δηλαδή δεν έχει γίνει login ο χρήστης) και μάλιστα εμφανίζει και τον εξής μήνυμα Notice: Undefined index: id in C:\xampp\htdocs\official\skills\admin.php on line 5 Παραθέτω τον κώδικα και όποιος μπορεί να βοηθήσει , ευχαριστώ. index.php > <?php include 'connection.php'; session_start(); if (!empty($_POST['username']) && !empty($_POST['password'])) { $user = mysql_real_escape_string($_POST['username']); $pass = md5(mysql_real_escape_string($_POST['password'])); $login = mysql_query("SELECT * FROM users WHERE username='$user' AND password='$pass' "); if (mysql_num_rows($login)==1) { $row = mysql_fetch_array($login); //$_SESSION['status'] = 'authorized'; $_SESSION['id'] = $row['id']; $_SESSION['name'] = $row['name']; header("location : admin.php"); } else { echo 'wrong username or password'; } } ?> admin.php > <?php include 'connection.php'; session_start(); if (!$_SESSION['id']) { header ("location : index.php"); } else { echo 'Hello' .$_SESSION['name']; echo '<a href="logout.php">Log out</a>'; } ?> Επίσης αν κάνει δε σας αρέσει στον κώδικα μου το λέτε.
kalogeros Δημοσ. 28 Δεκεμβρίου 2011 Δημοσ. 28 Δεκεμβρίου 2011 Η εντολή session_start(); πρέπει να είναι πάντα η πρώτη εντολή σε ένα αρχείο php. Άλλαξε της τη θέση, δοκίμσε και πες. Τα αρχεία admin.php και connection.php είναι σίγουρα μέσα στον φάκελο skills;
antonisid Δημοσ. 28 Δεκεμβρίου 2011 Μέλος Δημοσ. 28 Δεκεμβρίου 2011 Το δοκίμασα αλλά τίποτα.Φυσικά είναι μέσα στον ίδιο φάκελλο όλα τ'αρχεία.
Uberalles_gr Δημοσ. 28 Δεκεμβρίου 2011 Δημοσ. 28 Δεκεμβρίου 2011 Για άλλαξε το header("location : admin.php"); σε javascript redirect, δηλαδή > <script type="text/javascript" language="javascript"> window.location = "admin.php"; </script> και πες μας εάν σου δούλεψε έτσι
antonisid Δημοσ. 28 Δεκεμβρίου 2011 Μέλος Δημοσ. 28 Δεκεμβρίου 2011 Έτσι μου δούλεψε ναι...αλλά θα προτιμούσα χωρίς javascript.Εχω τοπικά παραδείγματα που δουλεύει με τον τρόπο χρησιμοποίησα κι εγώ,αλλά δε ξέρω τι λάθος έχω κάνει και δε παίζει στον κώδικα που παρέθεσα.Γενικά ο κώδικας μου είναι εντάξει?
thanocaster Δημοσ. 28 Δεκεμβρίου 2011 Δημοσ. 28 Δεκεμβρίου 2011 Για άλλαξε την αρχή του σκριπτ σου σε: > <?php ob_start(); session_start(); ... και πες μας αν δούλεψε.
antonisid Δημοσ. 28 Δεκεμβρίου 2011 Μέλος Δημοσ. 28 Δεκεμβρίου 2011 Παιδιά το βρήκα,αντί για header ("location : index.php"); ήθελε header ("location:index.php"); , χωρίς κενά δηλαδή.Ευχαριστώ για τον χρόνο σας.Μια ερώτηση ακόμη,στο admin.php εκεί που γίνεται ο έλεγχος αν υπάρχει session (αν δηλαδή έχει γίνει login) θα μπορούσα να χρησιμοποιήσω και την εντολή isset δηλαδή αντι για if (!$_SESSION['id']) να έβαζα if(!isset($_SESSION['id'])) ?
thanocaster Δημοσ. 28 Δεκεμβρίου 2011 Δημοσ. 28 Δεκεμβρίου 2011 > if ( !isset( $_SESSION['id'] ) ) { header ("Location: index.php"); } Βάλε και την εντολή exit; μετά από κάθε header (για ασφάλεια ότι δεν θα εκτεελεστεί κώδικας πριν "φύγει" από το συγκεκριμένο σκριπτ).
antonisid Δημοσ. 28 Δεκεμβρίου 2011 Μέλος Δημοσ. 28 Δεκεμβρίου 2011 Ωραία σ ευχαριστώ.Κάτι ακόμα αν έχετε λίγο χρόνο.Δεν έχω καταλάβει πότε βάζουμε την isset και πότε την empty.Πχ στο παράδειγμά μου θα μπορούσα να χρησιμοποιήσω και την empty?
thanocaster Δημοσ. 28 Δεκεμβρίου 2011 Δημοσ. 28 Δεκεμβρίου 2011 Η έμτπυ ελέγχει αν μια μεταβλητή υπάρχει και είναι άδεια. Η ισέτ αν έχει δηλωθεί. Πχ > <?php $string1 = 'string'; $string2; // This prints "$string1 is set" if ( isset( $string1 ) ) { print '$string1 is set'; } else { print '$string1 is NOT set'; } // This prints "$string2 is set" if ( isset( $string2 ) ) { print '$string2 is set'; } else { print '$string2 is NOT set'; } // This prints "$string1 is NOT empty" if ( empty( $string1 ) ) { print '$string1 is empty'; } else { print '$string1 is NOT empty'; } // This prints "$string2 is empty" if ( empty( $string2 ) ) { print '$string2 is empty'; } else { print '$string2 is NOT empty'; }
antonisid Δημοσ. 28 Δεκεμβρίου 2011 Μέλος Δημοσ. 28 Δεκεμβρίου 2011 Εννοούσα να κάνω έλεγχο αν είναι άδεια η μεταβλητή με βάζοντας !empty . Πρακτικά θα'χε διαφορά με το να χρησιμοποιούσα !isset?
defacer Δημοσ. 29 Δεκεμβρίου 2011 Δημοσ. 29 Δεκεμβρίου 2011 Εννοούσα να κάνω έλεγχο αν είναι άδεια η μεταβλητή με βάζοντας !empty . Πρακτικά θα'χε διαφορά με το να χρησιμοποιούσα !isset? Δεν χρειάζεται να ρωτήσεις εμάς και να ρισκάρεις το να σου πει ο καθένας το (λάθος) μακρύ του και το κοντό του. Διάβασε κατευθείαν το τι κάνει η empty. Τώρα πέρα από την παραπάνω απάντηση που θεωρώ "σωστή" θα δώσω και την πιο βοηθητική για σένα, αλλά υπόψιν πως τώρα στην ουσία με εμπιστεύεσαι πως δεν κάνω λάθος χωρίς να με ξέρεις. Εφόσον οι τιμές στις $_GET και $_POST είναι πάντα strings (ανεξαρτήτως από τη μορφή τους), αυτό που μας ενδιαφέρει είναι το τι κάνει η empty όταν της περνάς string (κατά τα άλλα θα έχει την ίδια συμπεριφορά με την isset). H empty λοιπόν επιστρέφει false για το κενό string και το string "0" (μηδέν). Αυτό σημαίνει ότι με την isset, o κώδικας μέσα στο if θα εκτελείται πάντα γιατί τα πεδία της φόρμας πάντα θα περνάνε στην PHP τιμες "κενο string" ακόμα κι αν δεν τα συμπληρώσεις -- σε αντίθεση με την empty, όπου αν έστω και ένα από τα δύο είναι ασυμπλήρωτο δε θα μπούμε στο if. Eπίσης με την empty δε θα μπούμε στο if αν ένα από τα δύο πεδία είναι το "0", που σημαίνει ότι ο κώδικάς σου δε θα λειτουργεί σωστά για username "0" ή password "0". Επειδή γενικά είναι "λογικό" η εφαρμογή σου να θεωρεί πως αυτό το username ή password δεν είναι αποδεκτό, στην πράξη δε νομίζω πως αυτό σε πειράζει (αν όμως ήθελες να αφήσεις ανοιχτή τη δυνατότητα τότε θα μιλούσαμε για bug). Συμπέρασμα: - Αν θέλεις να γράψεις κώδικα που να μη δίνει warnings όταν του ταϊσουν ένα "κατασκευασμένο" post, θα πρέπει κατ' αρχήν να χρησιμοποιήσεις την isset -- για τα "κανονικά" post τα πεδία θα έχουν πάντα κάποια τιμή - Αν σε ενδιαφέρει να ξεχωρίσεις την περίπτωση όπου τα πεδία είναι ασυμπλήρωτα, η isset σου είναι άχρηστη για το σκοπό αυτό - Αν σε ενδιαφέρει να δέχεσαι τις τιμές "0" η empty δε σου κάνει Επομένως αν θέλεις να τα κάνεις όλα τέλεια: >if(!isset(xxx) || !isset(yyy)) { die('Κακό παιδί!'); } else if($_POST[xxx] == '' || $_POST[yyy] == '') { die('Παρακαλώ συμπληρώστε τα πεδία.'); } else { // κάνε τη δουλειά σου }
antonisid Δημοσ. 29 Δεκεμβρίου 2011 Μέλος Δημοσ. 29 Δεκεμβρίου 2011 Σ ευχαριστώ ήσουν αρκετά κατατοπιστικός μπορώ να πω.Θα μπορούσες να μου πεις αν έχει κάποια κενά ο τρόπος που το κάνω εγώ? Πρόκειται για μια φόρμα προσθήκης άρθρου.Ουσιαστικά χρησιμοποιώ με άλλον τρόπο την isset. > $list = mysql_query("SELECT cat_id,title FROM categories"); if ($list) { echo '<form action="admin.php" method="post">'; echo '<input type="text" name="topic_name">'; echo '<select name="cat">'; while($row=mysql_fetch_array($list)) { echo '<option value="'.$row['cat_id'].'">'.$row['title'].'</option>'; } echo '</select>'; echo '<textarea name="content"></textarea> <input type="submit" name="submit" value="Add Topic"> </form>'; } else { echo 'Database error , try later.'; } if (isset($_POST['submit'])) { if (!empty($_POST['topic_name']) && !empty($_POST['content']) && !empty($_POST['cat'])) { $topic_name = mysql_real_escape_string($_POST['topic_name']); $content = mysql_real_escape_string($_POST['content']); $cat = mysql_real_escape_string($_POST['cat']); $insert = mysql_query("INSERT INTO articles (cat,title,content) VALUES ( '$cat' , '$topic_name' , '$content' )"); } else { echo 'Please complete all the fields'; }} Βλέπεις κάποιο κενό μήπως?
defacer Δημοσ. 30 Δεκεμβρίου 2011 Δημοσ. 30 Δεκεμβρίου 2011 Γενικά καλό φαίνεται. Ένα πράγμα που σίγουρα πρέπει να προσθέσεις είναι η κλήση της htmlspecialchars για οποιοδήποτε string προέρχεται από χρήστη και το βάζεις μέσα στην HTML σου. Στην προκειμένη οι αλλαγές που χρειάζονται είναι εδώ: >echo '<option value="'.htmlspecialchars($row['cat_id']).'">'.htmlspecialchars($row['title']).'</option>'; Θα πρέπει να περάσεις και την τρίτη παράμετρο η οποία κάνει specify το character set στο οποίο είναι κωδικοποιημένο το πρώτο όρισμα (δηλαδή στην ουσία το character set με το οποίο παρουσιάζεις τη σελίδα στο browser), αλλά δεν το έβαλα εδώ γιατί δεν ξέρω ποιό είναι αυτό.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα