Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

έχω φτιάξει μια φόρμα με 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>';
}
?>

 

Επίσης αν κάνει δε σας αρέσει στον κώδικα μου το λέτε. :rolleyes:

Δημοσ.

Η εντολή session_start(); πρέπει να είναι πάντα η πρώτη εντολή σε ένα αρχείο php. Άλλαξε της τη θέση, δοκίμσε και πες.

Τα αρχεία admin.php και connection.php είναι σίγουρα μέσα στον φάκελο skills;

Δημοσ.

Για άλλαξε το header("location : admin.php");

σε javascript redirect, δηλαδή

>
<script type="text/javascript" language="javascript">
window.location = "admin.php";
</script>

 

και πες μας εάν σου δούλεψε έτσι

Δημοσ.

Έτσι μου δούλεψε ναι...αλλά θα προτιμούσα χωρίς javascript.Εχω τοπικά παραδείγματα που δουλεύει με τον τρόπο χρησιμοποίησα κι εγώ,αλλά δε ξέρω τι λάθος έχω κάνει και δε παίζει στον κώδικα που παρέθεσα.Γενικά ο κώδικας μου είναι εντάξει?

Δημοσ.

Παιδιά το βρήκα,αντί για header ("location : index.php"); ήθελε header ("location:index.php"); , χωρίς κενά δηλαδή.Ευχαριστώ για τον χρόνο σας.Μια ερώτηση ακόμη,στο admin.php εκεί που γίνεται ο έλεγχος αν υπάρχει session (αν δηλαδή έχει γίνει login) θα μπορούσα να χρησιμοποιήσω και την εντολή isset δηλαδή αντι για if (!$_SESSION['id']) να έβαζα if(!isset($_SESSION['id'])) ?

Δημοσ.

>
if ( !isset( $_SESSION['id'] ) ) {
header ("Location: index.php");
}

 

Βάλε και την εντολή exit; μετά από κάθε header (για ασφάλεια ότι δεν θα εκτεελεστεί κώδικας πριν "φύγει" από το συγκεκριμένο σκριπτ).

Δημοσ.

Ωραία σ ευχαριστώ.Κάτι ακόμα αν έχετε λίγο χρόνο.Δεν έχω καταλάβει πότε βάζουμε την isset και πότε την empty.Πχ στο παράδειγμά μου θα μπορούσα να χρησιμοποιήσω και την empty?

Δημοσ.

Η έμτπυ ελέγχει αν μια μεταβλητή υπάρχει και είναι άδεια. Η ισέτ αν έχει δηλωθεί. Πχ

 

>
<?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';  
}

Δημοσ.

Εννοούσα να κάνω έλεγχο αν είναι άδεια η μεταβλητή με βάζοντας !empty . Πρακτικά θα'χε διαφορά με το να χρησιμοποιούσα !isset?

Δημοσ.

Εννοούσα να κάνω έλεγχο αν είναι άδεια η μεταβλητή με βάζοντας !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 {
   // κάνε τη δουλειά σου
}

Δημοσ.

Σ ευχαριστώ ήσουν αρκετά κατατοπιστικός μπορώ να πω.Θα μπορούσες να μου πεις αν έχει κάποια κενά ο τρόπος που το κάνω εγώ? Πρόκειται για μια φόρμα προσθήκης άρθρου.Ουσιαστικά χρησιμοποιώ με άλλον τρόπο την 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';
 }}

 

Βλέπεις κάποιο κενό μήπως?

Δημοσ.

Γενικά καλό φαίνεται. Ένα πράγμα που σίγουρα πρέπει να προσθέσεις είναι η κλήση της htmlspecialchars για οποιοδήποτε string προέρχεται από χρήστη και το βάζεις μέσα στην HTML σου. Στην προκειμένη οι αλλαγές που χρειάζονται είναι εδώ:

 

>echo '<option value="'.htmlspecialchars($row['cat_id']).'">'.htmlspecialchars($row['title']).'</option>';

 

Θα πρέπει να περάσεις και την τρίτη παράμετρο η οποία κάνει specify το character set στο οποίο είναι κωδικοποιημένο το πρώτο όρισμα (δηλαδή στην ουσία το character set με το οποίο παρουσιάζεις τη σελίδα στο browser), αλλά δεν το έβαλα εδώ γιατί δεν ξέρω ποιό είναι αυτό.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...