Πώς πάμε απο μια τεράστια if σε for?

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
piero
Δημοσιεύσεις: 6
Εγγραφή: 29 Απρ 2013 17:59
Τοποθεσία: peiraia

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από piero » 30 Απρ 2013 13:43

Έχω φτιάξει ένα login php script με τον παρακάτω κώδικα.Θέλω να βάλω 5 διαφορετικά usernames kai passwords. Το θέμα είναι οτι δεν θέλω να έχω ένα τεράστιο if αλλα απ'ότι μου είπαν μπορώ να βάλω μια for. Μπορεί να βοηθήσει κάποιος;

login.php:

<?php
session_start();

$_loginkodiko = ARRAY("name"=>"admin", "password"=>"12345" , "name1"=>"admin1", "password1"=>"123456");

if (isset($_POST["loginname"]) && isset($_POST["loginpassword"]))
{
if ($_loginkodiko["name"] == $_POST["loginname"] &&
$_loginkodiko["password"] == $_POST["loginpassword"] || $_loginkodiko["name1"] == $_POST["loginname"] &&
$_loginkodiko["password1"] == $_POST["loginpassword"] )
{
$_SESSION['admin']= 1 ;
header("location:index.php");
}

else {
echo"<center><h1>Login failed</h1></center>";
echo "<a href=login.php>Please Login</a>";
}
}
?>

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6235
Εγγραφή: 30 Νοέμ 2004 03:09

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από fafos » 30 Απρ 2013 15:39

H logikh ths array einai lathos.. prepei na dineis key=>value to username=>password (enoeitai oti ta usernames einai monadika kai den yparxei user me to idio onoma)...

opote tha mporouse na einai kapos etsi:

Κώδικας: Επιλογή όλων

$_loginkodiko = array&#40;
"admin"=>"12345",
"admin1"=>"123456", 
"fafos"=>"1234"&#41;;
meta psaxneis na vreis to key(username) symfona me to password:

Κώδικας: Επιλογή όλων

$key = array_search&#40;'1234', $_loginkodiko&#41;;//psaxnei na vrei to username pou tairiazei sto password "1234"
if &#40;$key == 'fafos' &#41;//an einai to username="fafos" tairiazei
&#123;
echo 'yparxei';
&#125;
else //allios, papala
&#123;
echo"den yparxei";
&#125;

Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από dva_dev » 30 Απρ 2013 16:06

Για να παίξεις με for ένας απλός τρόπος θα ήταν να βάλεις τα usernames, passwords σε κάποιον ή κάποιους πίνακες. Π.χ.

Κώδικας: Επιλογή όλων

<?php
session_start&#40;&#41;;

$_loginkodiko = array&#40;
    array&#40;'username' => 'admin',  'password' => '12345'&#41;,
    array&#40;'username' => 'admin1', 'password' => '123456'&#41;,
//  ...
&#41;;

if &#40;isset&#40;$_POST&#91;"loginname"&#93;&#41; && isset&#40;$_POST&#91;"loginpassword"&#93;&#41;&#41;
&#123;
    $cnt = count&#40;$_loginkodiko&#41;;
    $testUser = $_POST&#91;"loginname"&#93;;
    $testPass = $_POST&#91;"loginpassword"&#93;;

    $found = false;
    foreach &#40;$_loginkodiko as $checkedItem&#41;
    &#123;
        if &#40;&#40;$testUser == $checkedItem&#91;'username'&#93;&#41; &&
            &#40;$testPass == $checkedItem&#91;'password'&#93;&#41;&#41;
        &#123;
            $found = true;
            break;
        &#125;
    &#125;

    if &#40;$found == true&#41; &#123;
        $_SESSION&#91;'admin'&#93; = 1 ;
        header&#40;"location&#58;index.php"&#41;;
    &#125;
    else &#123;
        echo"<center><h1>Login failed</h1></center>";
        echo "<a href=login.php>Please Login</a>";
    &#125;
&#125;
else
&#123;
    echo "<a href=login.php>Please Login</a>";
&#125;
?>

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από gvre » 30 Απρ 2013 21:42

Μπορείς να το κάνεις με for, αλλά δεν είναι η σωστή αντιμετώπιση. Είναι προτιμότερο να χρησιμοποιήσεις κάτι σαν αυτό που έγραψε ο fafos ή κάτι σαν αυτό που γράφω στο τέλος. Σε περίπτωση που χρησιμοποιήσεις την array_search πρέπει υποχρεωτικά να ελέγξεις τι τύπου τιμή σου επιστρέφει η συνάρτηση (σε ενδιαφέρει να μην επιστρέφει false) ή να χρησιμοποιήσεις === αντί για ==. Αν δεν κάνεις αυτόν τον έλεγχο και δεν έχεις ελέγξει ότι το username και password δεν είναι κενά, υπάρχει περίπτωση κάποιος να μπορέσει να κάνει login χωρίς να δώσει username και password. πχ.

Αυτό θα σου γράψει 'ok' αν δε δώσεις καθόλου στοιχεία, λόγω του == αντί για ===

Κώδικας: Επιλογή όλων

$key = array_search&#40;$_POST&#91;'loginpassword'&#93;, $_loginkodiko&#41;;
if &#40;$key == $_POST&#91;'loginname'&#93;&#41;
        echo "ok";
else
        echo "nok";
Ο σωστός τρόπος είναι

Κώδικας: Επιλογή όλων

$key = array_search&#40;$_POST&#91;'loginpassword'&#93;, $_loginkodiko&#41;;
if &#40;$key === $_POST&#91;'loginname'&#93;&#41;
        echo "ok";
else
        echo "nok";
Άλλος τρόπος

Κώδικας: Επιλογή όλων

if &#40;isset&#40;$_POST&#91;'loginname'&#93;, $_POST&#91;'loginpassword'&#93;, $_loginkodiko&#91;$_POST&#91;'loginname'&#93;&#93;&#41;
        && $_loginkodiko&#91;$_POST&#91;'loginname'&#93;&#93; === $_POST&#91;'loginpassword'&#93;&#41;
&#123;
        echo "auth ok";
&#125;
else
&#123;
        echo "auth failed";
&#125;
Περισσότερα για τις συγκρίσεις μεταξύ διαφορετικών τύπων μπορείς να δεις στη διεύθυνση http://www.php.net/manual/en/types.comparisons.php

Άβαταρ μέλους
piero
Δημοσιεύσεις: 6
Εγγραφή: 29 Απρ 2013 17:59
Τοποθεσία: peiraia

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από piero » 01 Μάιος 2013 12:03

Ευχαριστώ πολύ για την βοήθεια σας. Ο λόγος που μπορει να ρωτάω χαζα πράγματα είναι οτι ασχολούμε εδω και μια εβδομάδα καθημερινά και 8-ωρα γενικά με web design & development οπότε ότι και να μου πείτε μπορεί να μην το έχω ξαναδεί. Το μονο που ξέρω είναι ελάχιστα C++ που έκανα στη σχολή. Λοιπόν αν μπορεί κάποιος να μου πεί μια γνώμη στο πως μπορω να το λύσω με "FOR" σε πίνακα.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από gvre » 01 Μάιος 2013 12:12

Λύση με for έχει γράψει ήδη ο dva_dev. Υπάρχει συγκεκριμένος λόγος που θέλεις να αυξήσεις την πολυπλοκότητα του κώδικά σου;

Άβαταρ μέλους
piero
Δημοσιεύσεις: 6
Εγγραφή: 29 Απρ 2013 17:59
Τοποθεσία: peiraia

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από piero » 01 Μάιος 2013 16:40

Ναι μου έχουν ζητήσει τον συγκεκριμένο τρόπο επίλυσης. Όμως απ'ότι διάβασα όταν έχουμε array χρησιμοποιούμε foreach...δν μπορει να γίνει με for δηλαδή?

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από gvre » 01 Μάιος 2013 17:27

Κώδικας: Επιλογή όλων

$_loginkodiko = array 
&#40;
        array&#40;'username' => 'admin',  'password' => '12345'&#41;,
        array&#40;'username' => 'admin1', 'password' => '123456'&#41;
&#41;;

for &#40;$i = 0, $sz = count&#40;$_loginkodiko&#41;; $i < $sz; $i++&#41;
&#123;
        // $_loginkodiko&#91;$i&#93;&#91;'username'&#93;
        // $_loginkodiko&#91;$i&#93;&#91;'password'&#93;
&#125;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από geomagas » 01 Μάιος 2013 18:15

Καλώς σας βρήκα!
piero έγραψε:Ναι μου έχουν ζητήσει τον συγκεκριμένο τρόπο επίλυσης
...Κάποιος σου κάνει καψόνι! 8)

@gvre: Σωστός, αλλά μπορεί να θέλει να χρησιμοποιήσει και την ίδια δομή του array (στα πλαίσια της "εκφώνησης"...) οπότε:

Κώδικας: Επιλογή όλων

$keys=array_keys&#40;$_loginkodiko&#41;;
for &#40;$i = 0, $sz = count&#40;$keys&#41;%2; $i < $sz; $i++&#41;
  &#123;
  $un=$_loginkodiko&#91;$keys&#91;2*i&#93;&#93;;
  $pass=$_loginkodiko&#91;$keys&#91;2*i+1&#93;&#93;;
  // ...etc
  &#125;
Πάντως είμαι σίγουρος ότι έχει περιθώρια να γίνει ακόμα πιο πολύπλοκο... :D :D :D

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από gvre » 01 Μάιος 2013 18:29

Υπάρχουν πολλοί τρόποι να λυθεί το πρόβλημα. Το θέμα είναι ότι ο κώδικας για authentication/authorization (και όχι μόνο) θα πρέπει πάντα να είναι όσο πιο απλός γίνεται (για πολλούς λόγους).

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πώς πάμε απο μια τεράστια if σε for?

Δημοσίευση από geomagas » 01 Μάιος 2013 18:38

Καμία αντίρρηση απολύτως. Ελπίζω να κατάλαβες ότι ήμουν (ελάχιστα) ειρωνικός...

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες