Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεΧρύσηίς Σάτυριον Αλαφούζος Τροποποιήθηκε πριν 8 χρόνια
1
Προγραμματισμός Εφαρμογών Διαδικτύου Ενότητα 5: PHP Μέρος 2 ο Φώτης Κόκκορας, Καθηγητής Εφαρμογών, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας
2
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
3
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
4
Σκοποί ενότητας Να σχεδιάζει με δομημένο τρόπο μια ιστοσελίδα. Να περνά δεδομένα φόρμας στο server με POST & GET. Να εφαρμόζει τη συνάρτηση filter input. Να ορίζει το stateless web. Να ορίζει τα PHP cookies. Να ορίζει τα PHP sessions. Να περνά μεταβλητές μέσω URL και POST. Να διαχειρίζεται εξωτερικά αρχεία κώδικα. Να εφαρμόζει το συντακτικό των συναρτήσεων σε κώδικα PHP. Να εφαρμόζει το συντακτικό των πινάκων σε κώδικα PHP. Να εφαρμόζει την ανακατεύθυνση σε κώδικα PHP. Να εφαρμόζει την αποστολή email σε κώδικα PHP. Προγραμματισμός Εφαρμογών Διαδικτύου 4
5
Περιεχόμενα ενότητας Δομημένη κατασκευή Ιστοσελίδων. Δομημένη κατασκευή Ιστοσελίδων. Διάβασμα δεδομένων φόρμας. Διάβασμα δεδομένων φόρμας. Συνάρτηση filter input. Συνάρτηση filter input. Stateless Web. Stateless Web. PHP cookies. PHP cookies. PHP sessions. PHP sessions. Πέρασμα Μεταβλητής μέσω URL. Πέρασμα Μεταβλητής μέσω URL. Πέρασμα Μεταβλητής μέσω POST. Πέρασμα Μεταβλητής μέσω POST. Εξωτερικά αρχεία κώδικα. Εξωτερικά αρχεία κώδικα. Συναρτήσεις. Συναρτήσεις. Πίνακες. Πίνακες Ανακατεύθυνση. Ανακατεύθυνση. Αποστολή email. Αποστολή email. Προγραμματισμός Εφαρμογών Διαδικτύου 5
6
Δομημένη Κατασκευή Σελίδων (1/2) Ζητούμενο: Να μπορούμε να φτιάχνουμε γρήγορα ομοιόμορφες σελίδες που επιπλέον συντηρούνται και εύκολα. Θεωρώντας ότι η χωροθέτηση της σελίδας μας έχει γίνει σωστά (χρήση div,css, κτλ) και ότι έχουμε ολοκληρώσει κατά το δυνατό μια τυπική σελίδα του site μας: A.Τεμαχίζουμε τη σελίδα μεταφέροντας τμήματα κώδικα σε άλλα php αρχεία. Κρατούμε μόνο το κυρίως τμήμα της σελίδας. Για παράδειγμα: Προσοχή στα header.php και footer.php τα οποία πέραν του πραγματικού header και footer, περιέχουν επιπλέον τον html κώδικα αρχής και τέλους της σελίδας.... header.php sidebar.php κυρίως τμήμα footer.php Προγραμματισμός Εφαρμογών Διαδικτύου 6
7
Δομημένη Κατασκευή Σελίδων (2/2) Β. Επανασυνθέτουμε τη σελίδα κάνοντας include σε κατάλληλα σημεία, τα τμήματα που απομακρύνθηκαν πριν, σε ξεχωριστά αρχεία. κώδικας σελίδας index.php Εδώ είναι το div για το κυρίως περιεχόμενο της σελίδας. κώδικας άλλης σελίδας χωρίς sidebar: some-other-page.php Εδώ είναι το div για το κυρίως περιεχόμενο της σελίδας. Η αλλαγή στο style είναι ενδεικτική (υπάρχει και στο παράδειγμα, παρακάτω). Περισσότερα δομικά στοιχεία σελίδων δίνουν περισσότερη ευελιξία σύνθεσης! ==== ΔΕΙΤΕ KAI ΣΧΕΤΙΚΟ ΕΡΓΑΣΤΗΡΙΟ ==== Προγραμματισμός Εφαρμογών Διαδικτύου 7
8
Server-Side Διάβασμα Δεδομένων Φόρμας Η PHP παρέχει δομές δεδομένων (πίνακες) στις οποίες τοποθετούνται τα δεδομένα που έχουν γίνει submit: πίνακας $_GET: όταν η φόρμα έστειλε με method="GET" πίνακας $_POST: όταν η φόρμα έστειλε με method="POST" πίνακας $_REQUEST: περιέχει την ένωση (σύνολο) των ακόλουθων πινάκων: $_GET, $_POST, $_COOKIE Ο πίνακας $_COOKIE θα μας απασχολήσει αργότερα. Προτιμήστε τους εξειδικευμένους πίνακες, όχι τον $_REQUEST. Για κάθε στοιχείο φόρμας που στέλνει δεδομένα (προσοχή, δεν στέλνουν πάντα όλα) Αν στέλνει με GET χρησιμοποιούμε: $_GET['τιμή_παραμέτρου_name'] Αν στέλνει με POST χρησιμοποιούμε: $_POST['τιμή_παραμέτρου_name'] ΆΡΑ, το είδος του στοιχείου (text, λίστα, κτλ) δεν επηρεάζει το πώς το διαβάζουμε στον server! Αρκεί να ξέρουμε αν η φόρμα έστειλε με μέθοδο POST ή με GET. Μάλιστα, αν χρησιμοποιήσουμε τον πίνακα $_REQUEST που περιέχει την ένωση των 2 άλλων χρειάζεται να ξέρουμε μόνο το name των στοιχείων διεπαφής της φόρμας. ΠΡΟΣΟΧΗ: Το περιεχόμενο του $_REQUEST το επηρεάζει ο client – ΔΕΝ είναι έμπιστο. Προγραμματισμός Εφαρμογών Διαδικτύου 8
9
Τι θα τα κάνουμε αυτά τα δεδομένα; Το τι θα τα κάνουμε το καθορίζει η εκάστοτε εφαρμογή, σε κάθε περίπτωση όμως πρέπει να προηγηθεί έλεγχος ορθότητας δεδομένων (validation)! Μα πάλι validation; Δεν αρκεί το client-side που κάνουμε με JavaScript; ΟΧΙ! Δεν αρκεί! Αν κάποιος κακόβουλος χρήστης δει τον κώδικά της html φόρμας, μπορεί να φτιάξει μια ίδια, χωρίς τους ελέγχους validation της αρχικής, που να στέλνει "κακόβουλα" δεδομένα στο ίδιο αρχείο-αποδέκτη! ΆΡΑ: Δεδομένα που στέλνονται με φόρμες πρέπει να ελέγχονται: στον client (με JavaScript): κύρια για να λόγους ευχρηστίας στον server (με php): κύρια για λόγους ασφάλειας (προστασία εφαρμογής από κακόβουλα data) Στην πράξη: ελέγχουμε τα δεδομένα που στάλθηκαν (στο $_POST ή στο $_GET) αν είναι αποδεκτά (υπάρχει ειδική php συνάρτηση για αυτό – θα τη δούμε παρακάτω) αναθέτουμε τα ελεγμένα δεδομένα σε php μεταβλητές (καλό είναι να έχουν το ίδιο όνομα με το αντίστοιχο στοιχείο της φόρμας) – το κάνουμε κύρια για απλούστερο κώδικα (είναι πιο απλό να γράφεις π.χ. $username αντί $_GET['username'] ) υλοποιούμε τη λογική της εφαρμογής με αυτές τις μεταβλητές Προγραμματισμός Εφαρμογών Διαδικτύου 9
10
Έστω η φόρμα του εργαστηρίου 05: (για λόγους χώρου, έχει κρατηθεί ο απολύτως απαραίτητος κώδικας) username: password: e-mail: ΑΦΜ: Εισόδημα: -επέλεξε- <500 € 500 ως 1000 € 1001 ως 1500 € Φύλο: Άνδρας Γυναίκα Ηλικία: Ενδιαφέρ.: Σπορ Επιστήμη Μουσική Σχόλια: Προγραμματισμός Εφαρμογών Διαδικτύου 10
11
Server-Side Form Validation (για τα επόμενα, θεωρήστε ότι δεν υπάρχει client-side form validation) Τα στοιχεία διεπαφής input τύπου text και textarea, στέλνουν πάντα τιμή Παράδειγμα: $username = $_POST['username'] $username είναι php μεταβλητή που ορίζουμε εμείς για να αποθηκεύσουμε προσωρινά τα δεδομένα που έστειλε το στοιχείο διεπαφής με name="username" οπότε το 'username' είναι η παράμετρος name του 1 ου στοιχείου διεπαφής της φόρμας, Αν δεν έχουν συμπληρωθεί, η τιμή που στέλνουν είναι "" (empty string). Άρα οι συνήθεις έλεγχοι για πληκτρολογημένα data είναι (ενδεικτικά): αν πληκτρολογήθηκε κάτι και πιθανώς αν έχει δεδομένο μήκος αν συμφωνεί ή όχι με κάποιο pattern π.χ. αν μοιάζει με email, ή αν ταιριάζει με κάποιο regular expression, κτλ αν είναι αριθμός και πιθανώς αν είναι μέσα σε κάποιο εύρος τιμών Στοιχεία διεπαφής τύπου λίστας στέλνουν το value του option που επέλεξε ο χρήστης Άρα ο έλεγχος σε αυτή την περίπτωση εξαρτάται καθαρά από την εφαρμογή. Παράδειγμα: $income = $_POST['income'] Radiobuttons και checkboxes στέλνουν επίσης την τιμή του attribute value ΑΛΛΑ μόνο εφόσον έχουν επιλεγεί (π.χ. το μη-τσεκαρισμένο checkbox δεν στέλνει data!) ΑΡΑ πρέπει πρώτα να δούμε ΑΝ έστειλαν και μετά ΤΙ έστειλαν!!! Προγραμματισμός Εφαρμογών Διαδικτύου 11
12
Η συνάρτηση filter_input (1/2) Η PHP παρέχει την συνάρτηση filter_input για έλεγχο δεδομένων φορμών: Συνήθης Χρήση: filter_input (τύπος_μεταβλητής, μεταβλητή, φίλτρο) τύπος μεταβλητής: INPUT_GET, INPUT_POST, INPUT_COOKIE, κτλ μεταβλητή: βάζουμε το όνομα της μεταβλητής, πχ για την $_POST['email'] βάζουμε 'email' φίλτρα: προκαθορισμένα, πχ. για ακέραιο, δεκαδικό, email, διεύθυνση ip, regular expression, κτλ θα τα δούμε στη συνέχεια Η συνάρτηση επιστρέφει: την τιμή της μεταβλητής, εφόσον αυτή περάσει τον έλεγχο FALSE αν αποτύχει ο έλεγχος NULL αν η μεταβλητή δεν έχει πάρει τιμή Παράδειγμα: Δείτε τη συμπεριφορά της filter_input σε έλεγχο αποδεκτού email: <?php echo ' Sent by POST: '.$_POST['email'].' '; echo ' var_dump output for variable: '; //var_dump prints information (type/value) for a variable var_dump($_POST['email']); echo ' var_dump output for validator: '; $filter_result = filter_input( INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); var_dump($filter_result); ?> φίλτρο για email validation Προγραμματισμός Εφαρμογών Διαδικτύου 12
13
Η συνάρτηση filter_input (2/2) Σημείωση: η συνάρτηση var_dump( ) που χρησιμοποιείται παρακάτω, τυπώνει πληροφορίες για την μεταβλητή που της δίνουμε ως παράμετρο. Έστω ότι στάλθηκε το "fkokkoras@teilar.gr". Ο προηγούμενος κώδικας θα τυπώσει: Sent by POST: fkokkoras@teilar.gr var_dump output for variable: string(19) "fkokkoras@teilar.gr" var_dump output for validator: string(19) "fkokkoras@teilar.gr" Έστω ότι στάλθηκε το "kokkoras@csd". Ο προηγούμενος κώδικας θα τυπώσει: Sent by POST: kokkoras@csd var_dump output for variable: string(12) "kokkoras@csd" var_dump output for validator: bool (false) Στην πράξη, στο προηγούμενο παράδειγμα, μας ενδιαφέρει αν θα αποτύχει ή όχι ο έλεγχος, δηλαδή η τελική τιμή του $filter_result: αν $filter_result=NULL το $_POST['email'] δεν υφίσταται (δεν στάλθηκε καθόλου!) αν $filter_result=FALSE το $_POST['email'] δεν είναι συντακτικά αποδεκτό email Προγραμματισμός Εφαρμογών Διαδικτύου 13
14
Διαθέσιμα Φίλτρα της filter_input και τι Επιστρέφει (έστω ελέγχουμε την παράμετρο myinput που στάλθηκε με POST) filter_input( INPUT_POST, 'myinput', FILTER_VALIDATE_BOOLEAN) επιστρέφει true αν η τιμή της μεταβλητής είναι "1", "true", "on" ή "yes", αλλιώς false filter_input( INPUT_POST, 'myinput', FILTER_VALIDATE_EMAIL) επιστρέφει false αν αυτό που στάλθηκε δεν μοιάζει με email filter_input( INPUT_POST, 'myinput', FILTER_VALIDATE_INT) επιστρέφει false αν αυτό που στάλθηκε δεν είναι ακέραιος για έλεγχο ακεραίου σε κάποια όρια, π.χ. 1 ως 10, βάζουμε και 4η παράμετρο: $options = array(); $options['options']['min_range'] = 1; $options['options']['max_range'] = 10; $result = filter_input( INPUT_POST, 'myinput', FILTER_VALIDATE_INT, $options) filter_input( INPUT_POST, 'myinput', FILTER_VALIDATE_REGEXP, $options) επιστρέφει true αν αυτό που στάλθηκε ταιριάζει με το regular expression της 4ης παραμέτρου Άλλα φίλτρα: FILTER_VALIDATE_FLOAT για έλεγχο δεκαδικών αριθμών FILTER_VALIDATE_IP για έλεγχο διευθύνσεων ip FILTER_VALIDATE_URL για έλεγχο URL Περισσότερα εδώ: http://www.php.net/manual/en/filter.filters.validate.phphttp://www.php.net/manual/en/filter.filters.validate.php Προγραμματισμός Εφαρμογών Διαδικτύου 14
15
The Stateless Web (Cookies & Sessions) Οι web servers, βάσει http, δεν γνωρίζουν ποιος είναι ο client που εξυπηρετούν! Δεν έχουν "μνήμη" για να θυμούνται την κατάσταση επικοινωνίας με δεδομένο χρήστη. Μόλις του στείλουν τη σελίδα, ξεχνούν τα πάντα γι αυτόν! Υπάρχουν πολλές περιπτώσεις που θέλουμε να γνωρίσουμε ποιος είναι ο client (ή όπως λέμε γενικότερα "να διατηρούμε κατάσταση" - state maintenance): στην ίδια συνεδρία: π.χ. για να επιτρέψουμε στον client να "βάλει" διάφορα προϊόντα στο ηλεκτρονικό καλάθι αγορών και κάποια στιγμή να τον οδηγήσουμε στο "ταμείο" σε διαφορετική συνεδρία: π.χ. για αντιληφθούμε ότι ο client είναι κάποιος που έχει ξανά επισκεφθεί το site μας και να τον "χειριστούμε" με ιδιαίτερο τρόπο (π.χ. να του προβάλουμε εξατομικευμένη / στοχευμένη διαφήμιση) Υπάρχουν δύο τρόποι για να υλοποιήσουμε "state" σε web sites: με cookies: ο server τοποθετεί στον Η/Υ του πελάτη ένα μικρό αρχείο με πληροφορίες και στο εξής όταν ο browser ζητά κάτι από τον server, του στέλνει και το cookie με session: ορίζεται μοναδικός κωδικός για κάθε client (με cookie ή παράμετρο στο URL) και με βάση αυτόν ορίζεται στην php πίνακας παραμέτρων για αυτόν τον client. Το state maintenance με μεταφορά πληροφορίας μεταξύ σελίδων με φόρμες, δεν είναι πρακτικό Τα cookies απαιτούν ρυθμίσεις αποδοχής στην πλευρά του browser (by default γίνονται δεκτά). Αν δεν γίνονται αποδεκτά οι δυνατότητες είναι μηδαμινές! Για πολύπλοκο "state maintenance" χρησιμοποιούνται sessions και databases. Προγραμματισμός Εφαρμογών Διαδικτύου 15
16
PHP Cookies Τι είναι; Πώς τα φτιάχνω; Το cookie είναι ένα μικρού μεγέθους αρχείο κειμένου που ο server μπορεί να τοποθετήσει στον υπολογιστή του client, εφόσον ο δεύτερος το επιτρέπει (υπάρχει κατάλληλη ρύθμιση στους browsers). Μετά την τοποθέτηση του cookie, κάθε φορά που ο browser ζητά σελίδα από τον ίδιο server, του στέλνει μαζί και το cookie. Το cookie περιέχει μικρό αριθμό παραμέτρων και έχει ημερομηνία λήξης. Μέσω του cookie ο server "γνωρίζει" ή καλύτερα "ξεχωρίζει" με ποιον "συνομιλεί". "Βάζουμε" cookie με την εντολή: setcookie(name,value,expire,path,domain,secure,httponly) ΠΡΟΣΟΧΗ: η γραμμή πρέπει να βρίσκεται ΠΡΙΝ την ετικέτα. Συνήθως την βάζουμε στην αρχή του αρχείου. Όλες οι παράμετροι εκτός της name είναι προαιρετικές. Οι δύο τελευταίες είναι boolean, η expire ακέραιος και οι υπόλοιπες αλφαριθμητικά. Αν χρειάζεται να παραλείψουμε μια παράμετρο και θέλουμε τις επόμενες, βάζουμε "" (empty string) στη θέση της παραμέτρου, εκτός της περίπτωσης expire που είναι ακέραιος και εκεί βάζουμε 0 (μηδέν). Αποφεύγουμε να αποθηκεύουμε σε cookies ευαίσθητες πληροφορίες (πχ passwords) Προγραμματισμός Εφαρμογών Διαδικτύου 16
17
Παράμετροι Ορισμού σε Cookies setcookie(name,value,expire,path,domain,secure,httponly) Οι σημαντικότερες παράμετροι είναι: name: το όνομα του cookie value: η τιμή του cookie την οποία και συνήθως θέλουμε να μάθουμε αν η name έχει τιμή 'cookiename' τότε κάνω ανάκτηση τιμής με $_COOKIE['cookiename'] expire: η ημερομηνία λήξης του cookie που ορίζεται ως δευτερόλεπτα μετά από δεδομένη ημερομηνία (συνήθως την τρέχουσα) με τον ακόλουθο τρόπο: π.χ. η δήλωση time()+60*60*24*30 θα ορίσει ημερομηνία λήξης 30 μέρες μετά την τρέχουσα ημερομηνία (η time() επιστρέφει την τρέχουσα ημερομηνία ενώ το γινόμενο που ακολουθεί μετατρέπει τις 30 μέρες σε δευτερόλεπτα) secure: εάν true το cookie μεταδίδεται μόνο σε ασφαλείς συνθέσεις (https) httponly: εάν true αποτρέπει την ανάγνωση του cookie από JavaScripts (για ασφάλεια) Παράδειγμα ορισμού cookie: <?php $expire=time()+60*60*24*30; setcookie("user", "Fotis Kokkoras", $expire); ?> Προγραμματισμός Εφαρμογών Διαδικτύου 17
18
...περισσότερα για Cookies Διαγραφή cookie: γίνεται έμμεσα, ορίζοντας ημερομηνία λήξης στο παρελθόν και εξαναγκάζοντας έτσι τον browser να διαγράψει το cookie. <?php // set the expiration date to one hour ago setcookie ("TestCookie", "", time()-3600); ?> Μέσω της παραμέτρου path ορίζουμε τον φάκελο (στο server) μέσα και κάτω από τον οποίο ισχύει το cookie. Αν πχ βάλουμε "/myfolder" μόνο με σελίδες αυτού του φακέλου και υποφακέλων του μπορεί ο browser να στείλει το cookie. Αν βάλουμε "/" τότε ισχύει σε όλο το domain. Παράδειγμα χρήσης cookie: Έστω ότι δίνουμε στον χρήστη δύο επιλογές με μορφή συνδέσμων και θέλουμε σε άλλες σελίδες να θυμόμαστε τι είχε επιλέξει (π.χ. ένα σενάριο επιλογής μεγέθους γραμμάτων) select_style.php?style=1 και select_style.php?style=2 Στο αρχείο select_style.php κάνουμε: <?php //αρχικά διαγράφουμε τυχόν παλιά επιλογή βάζοντας cookie με λήξη στο παρελθόν if ( isset($_COOKIE['mystyle']) ) setcookie("mystyle", "", time()-3600); //μετά ορίζουμε σε cookie δεδομένης διάρκειας (πχ 120 μέρες), την νέα επιλογή if ( $_GET['style']==2 ) setcookie("mystyle", 2, time()+86400*120); else setcookie("mystyle", 1, time()+86400*120); header("Location: somepage.php"); // τον ανακατευθύνουμε όπου πρέπει ?> Με βάση το $_COOKIE['mystyle'] αποφασίζουμε τι CSS αρχείο θα δώσουμε στο χρήστη. Προγραμματισμός Εφαρμογών Διαδικτύου 18
19
Πλεονεκτήματα & Μειονεκτήματα Cookies Μειονεκτήματα Περιορισμός στον αριθμό και το μέγεθος cookies ανά domain για αρχές του 2010, περίπου 50 cookies ανά domain, maximum νεότεροι browsers ανεβάζουν αρκετά αυτό τον αριθμό (π.χ. 180 σε Chrome 9) άρα δεν πρέπει να γίνεται κατάχρηση των cookies γιατί σε παλαιότερους browsers μπορεί να μη γίνουν δεκτά για τεχνικούς λόγους Ορισμένοι χρήστες μπορεί να μην τα έχουν ενεργά Χρησιμοποιούνται από εταιρίες διαφημίσεων για να παρακολουθούν τις συνήθειες των χρηστών. H Google, με το "σερβίρει" διαφήμιση (και cookies) στην πλειοψηφία των sites, μπορεί να βλέπει σε τι sites συχνάζουμε. Έτσι είναι σε θέση να μας στέλνει εξατομικευμένη διαφήμιση! Δεν είναι κατάλληλα για την αποθήκευση ευαίσθητων πληροφοριών γιατί αποθηκεύονται ως κείμενο στο δίσκο Πλεονεκτήματα Στο cookie που έχει δημιουργήσει κάποιο site δεν μπορούν να έχουν πρόσβαση άλλα sites Η διάρκεια ζωής της πληροφορίας καθορίζεται από τον προγραμματιστή και μπορεί να είναι μεγάλη HTML5 Web Storage: εξέλιξη των cookies, >5ΜΒ χώρος, η πληροφορία αποστέλλεται μόνο όταν ζητηθεί, περισσότερη ασφάλεια και ταχύτητα. Προγραμματισμός Εφαρμογών Διαδικτύου 19
20
PHP Sessions 1/2 Τι είναι το session (συνεδρία ή σύνοδος) Σύνολο προσωρινών μεταβλητών, οι οποίες αποθηκεύονται στον server και χάνονται όταν κλείσει το session. το πότε και πώς κλείνει ένα session θα το δούμε στη συνέχεια Σε κάθε session ανατίθεται (αυτόματα) ένας μοναδικός κωδικός (session id), ο οποίος ομαδοποιεί όλες τις πληροφορίες που σχετίζονται με ένα χρήστη. Το session id περνάει από σελίδα σε σελίδα είτε μέσω του URL είτε μέσω cookies. Αυτό καθορίζεται στις ρυθμίσεις της php (αρχείο php.ini – βλ. παρακάτω). Οι browser έχουν ειδική ρύθμιση για τα session cookies καθώς είναι απαραίτητα στο σύγχρονο web. Ρυθμίσεις στο αρχείο php.ini για τα sessions [Session] session.save_handler = files session.save_path = C:\WINDOWS\TEMP session.use_cookies = 1 session.use_trans_sid = 0 Η τελευταία παράμετρος ελέγχει αν το session id θα οριστεί μέσω αρχείου cookie στον client (τιμή 0) ή θα μεταφέρεται ως παράμετρος στο URL (τιμή 1). Η δεύτερη περίπτωση δουλεύει και σε browsers με κλειστά cookies – δεν είναι όμως ασφαλής και καλύτερα να αποφεύγεται! Προγραμματισμός Εφαρμογών Διαδικτύου 20
21
PHP Sessions 2/2 Για κάθε client, αποθηκεύουμε τιμές μεταβλητών στον server (π.χ. username, επιλεγμένα αντικείμενα προς αγορά, κτλ). Οι μεταβλητές αυτές είναι προσωρινές και διαγράφονται αυτόματα από το server όταν ο client "φύγει". Πότε "φεύγει" ο client; Όταν το δηλώνει ο ίδιος, π.χ. μέσω κάποιας log-out διαδικασίας του site. Μετά από πάροδο κάποιου χρονικού διαστήματος στο οποίο δεν έγινε επικοινωνία μεταξύ client και server (~20 λεπτά by default σε ASP/IIS και PHP – δείτε και ρυθμίσεις στο php.ini). Τι κάνουμε αν θέλουμε οι τιμές να παραμείνουν μόνιμα; Πρέπει να τις αποθηκεύσουμε σε κάποια database (π.χ. ατομικά στοιχεία log-in) Εκκίνηση ενός PHP session: ΠΡΟΣΟΧΗ: η γραμμή πρέπει να βρίσκεται ΠΡΙΝ την ετικέτα. Συνήθως την βάζουμε στην αρχή του αρχείου. Τι ακριβώς κάνει η session_start(); Δημιουργεί εσωτερικά στο server ένα μοναδικό κωδικό (unique ID - UID) για κάθε browser που "ζητά" σελίδες (άρα και για τον user που βρίσκεται πίσω από τον εκάστοτε browser). Επιτρέπει τον ορισμό άλλων μεταβλητών σε σχέση με δεδομένο UID. Πώς ορίζω επιπλέον session μεταβλητές: μέσω της μεταβλητής $_SESSION Προγραμματισμός Εφαρμογών Διαδικτύου 21
22
Διαχείριση Session & Μεταβλητών 1/2 Παράδειγμα Καταμέτρησης Κλήσεων Σελίδας από τον ίδιο Χρήστη στη session variable views <?php session_start(); if ( isset ( $_SESSION['views'] ) )//αν έχει οριστεί $_SESSION['views'] = $_SESSION['views'] + 1;//αύξησε την κατά ένα else //αλλιώς $_SESSION['views'] = 1;//αρχικοποίησέ την ?> <?php //πάρε την τιμή της session variable και τύπωσέ την echo "Pageviews=". $_SESSION['views']; ?> Προγραμματισμός Εφαρμογών Διαδικτύου 22
23
Διαχείριση Session & Μεταβλητών 2/2 Ξεκινώ ένα session με: session_start() πριν το tag Ορίζω session μεταβλητές με: $_SESSION['όνομα μεταβλητής'] το $_SESSION είναι σαν ένας πίνακας στη μνήμη του server στον οποίο αποθηκεύω τιμές μεταβλητών που ορίζω τα sessions υλοποιούνται με αρχεία στο file system του server (ένα αρχείο ανά client) δεν είναι ιδιαίτερα καλή ιδέα να "φορτώνουμε" το session κάθε χρήστη με πληθώρα μεταβλητών και γενικά με πάρα πολλά δεδομένα (φανταστείτε να υπάρχουν μερικές χιλιάδες χρήστες συνδεδεμένοι στο server σας...!!) Ελέγχω αν έχει οριστεί κάποια session μεταβλητή με: isset( $_SESSION['όνομα μεταβλητής'] ) Καταργώ μια session μεταβλητή που έχω ορίσει με: unset( $_SESSION['όνομα μεταβλητής'] ) Ο server διαγράφει περιοδικά από μόνος του τα sessions που δεν είναι ενεργά (επειδή ο συσχετιζόμενος με το session χρήστης έφυγε από το site) Καταργώ ολοκληρωτικά ένα session (και ότι περιέχει μέσα του) με: session_destroy() Προγραμματισμός Εφαρμογών Διαδικτύου 23
24
Παραδείγματα Χρήσης Session 1/2 log-in χρήστη σε διαβαθμισμένες υπηρεσίες ενός site σε κάποια σελίδα (π.χ. στην index.php) έχουμε τη φόρμα log-in με πεδία username και password ο χρήστης δίνει τα στοιχεία του και πατά το submit για να αποστείλει τα δεδομένα καλείται η σελίδα που είναι δηλωμένη στη φόρμα (έστω η log-in.php) – ταυτόχρονα αποστέλλονται τα δεδομένα της φόρμας στη σελίδα log-in.php, τα username και password ελέγχονται με αντίστοιχα σε κάποια database με τους γνωστούς χρήστες και εφόσον βρεθεί χρήστης με αυτά τα στοιχεία: καθαρίζεται το session του χρήστη (προληπτικά και εφόσον επιτρέπει η εφαρμογή) ξεκινά νέο session στο οποίο συνήθως αποθηκεύεται το userID του χρήστη (τιμή δηλαδή του πεδίου που τον προσδιορίζει μοναδικά στην database των χρηστών της εφαρμογής). καλάθι αγορών σε e-shop το session αρχικοποιείται με την επίσκεψη του χρήστη στο e-shop η προσθήκη προϊόντων στο καλάθι αγορών ισοδυναμεί με την αποθήκευση του μοναδικού κωδικού που προσδιορίζει κάθε προϊόν (productID) σε session variables μπορείτε να υλοποιήσετε το καλάθι με μία μόνο session variable τύπου array στο check-out (πληρωμή) τα προϊόντα εντοπίζονται μέσω των κωδικών τους που είναι αποθηκευμένα στις session μεταβλητές το άδειασμα καλαθιού ισοδυναμεί με διαγραφή των σχετικών session μεταβλητών Προγραμματισμός Εφαρμογών Διαδικτύου 24
25
Παραδείγματα Χρήσης Session 2/2 μεταβολή αναζήτησης ζητούμενο: να παρουσιάζουμε στο χρήστη μια φόρμα αναζήτησης συμπληρωμένη με τις τιμές που όρισε ο χρήστης στην τελευταία χρήση αναζήτησης που έκανε (πιθανώς πριν από αρκετή ώρα) – έτσι βλέπει τι αναζήτηση είχε κάνει και μπορεί να τη μεταβάλει εύκολα καλάθι σύγκρισης ζητούμενο: να μπορεί ο χρήσης να διαλέγει σταδιακά, ομοειδή προϊόντα με σκοπό να τα συγκρίνει αργότερα, δίπλα-δίπλα (side-by-side comparison) σκεφτείτε τις λεπτομέρειες για τα παραπάνω μόνοι σας μπορεί να ζητηθούν στις εξετάσεις! Προγραμματισμός Εφαρμογών Διαδικτύου 25
26
Παράδειγμα Χρήσης: User Tracking (1/2) Κάποιες σελίδες ή τμήματα σελίδων ενός site θέλουμε να είναι διαβαθμισμένα, δηλαδή να είναι προσβάσιμα μόνο από χρήστες που έχουν κάνει login στο σύστημα. Θεωρώντας περιβάλλον με database και καταχωρημένους χρήστες, αυτό απαιτεί: να παρέχεται σε κάποιο σημείο μια φόρμα διαπίστευσης (login) username: password: να μπορούμε όποτε χρειάζεται να ελέγχουμε εύκολα αν δεδομένος χρήστης έκανε login αυτό γίνεται βάζοντας στο session του χρήστη μετά από επιτυχημένο login, μια τιμή που τον χαρακτηρίζει (πχ το username): $_SESSION['user']=$username και ελέγχοντας πάντα αυτή την τιμή πριν προβούμε σε διαβαθμισμένες ενέργειες Παράδειγμα ελέγχου στην αρχή μιας διαβαθμισμένης σελίδας: <?php session_start();// δίνει πρόσβαση στο session if (!isset($_SESSION['user'])) // αν δεν έχει διαπιστευτεί header('HTTP/1.0 401 Unauthorized');// ανακατεύθυνέ τον στη σελίδα unauthorized ?> Ο παραπάνω κώδικας πρέπει να βρίσκεται στην κορυφή της σελίδας διαφορετικά η εντολή header δημιουργεί πρόβλημα (πρέπει να τρέξει πριν σταλεί οτιδήποτε άλλο στον client)! Προγραμματισμός Εφαρμογών Διαδικτύου 26
27
User Tracking (2/2) Στο προηγούμενο παράδειγμα, η εντολή session_start() δεν ξεκινά session! Δίνει πρόσβαση στο ήδη ανοιγμένο session. Το session έχει εκκινήσει με την ίδια εντολή σε άλλη σελίδα! Η session_start(), βάζει cookie στον χρήστη αν δεν έχει ήδη, και εκκινεί το session. Αν όμως το session έχει ήδη εκκινήσει, τότε η εντολή απλά δίνει πρόσβαση σε αυτό. ΑΡΑ: κάθε σελίδα που έχει λειτουργικότητα βασισμένη σε παραμέτρους του session, ξεκινά με την εντολή session_start() Η session_destroy() διαγράφει τις παραμέτρους του session, δεν το κλείνει! Για να κλείσει το session πρέπει να διαγραφεί και το cookie που το εκίνησε! Αυτό δεν είναι απολύτως απαραίτητο: αν καθαρίσει το session από τις παραμέτρους στις οποίες βασίζεται η διαπίστευση του χρήστη, αυτός δεν θα μπορεί να δει διαβαθμισμένες σελίδες εφόσον γίνεται έλεγχος όπως στο παράδειγμα του προηγούμενου slide! Είναι καλό η φόρμα login να οδηγεί σε αρχείο με μόνο php κώδικα (όχι HTML) που να υλοποιεί τη login διαδικασία, δηλαδή συνδέεται στην database και ελέγχει την ύπαρξη του χρήστη σε αυτή, με βάσει τα στοιχεία που έγιναν POST αν ο χρήστης βρεθεί στην database καταχωρείται σε μια session μεταβλητή ένας μοναδικός προσδιοριστής για αυτόν το χρήστη ανακατευθύνεται στη διαβαθμισμένη σελίδα που προβλέπει η σχεδίαση του site αν ο χρήστης δεν βρεθεί στην database ανακατευθύνεται σε κάποια άλλη σελίδα που προβλέπεται για unauthorized καταστάσεις Προγραμματισμός Εφαρμογών Διαδικτύου 27
28
Πέρασμα Μεταβλητής σε Σελίδα Μέθοδοι -Με τη μέθοδο GET (μέσω του URL απευθείας ή με φόρμα) -Με τη μέθοδο POST (με φόρμα) -Με session -Με cookies Περισσότερα για session και cookies, σε επόμενο μάθημα. θα τα δούμε αναλυτικά σε εργαστήριο Προγραμματισμός Εφαρμογών Διαδικτύου 28
29
Πέρασμα Μεταβλητής μέσω URL Με Παραδείγματα - http://www.tovima.gr/listbytopic.php?fyllo=15201&tmhma=07 - http://pileas.csd.auth.gr/course/view.php?id=20 Με χρήση φόρμας – Πλεονεκτήματα και Μειονεκτήματα + Η σελίδα μπορεί να γίνει bookmark -Οι χρήστες βλέπουν τα ονόματα των μεταβλητών και τιμών Ακατάλληλη μέθοδος για πέρασμα ευαίσθητων δεδομένων Οι χρήστες μπορεί να βάλουν δικές τους τιμές και να ανακτήσουν παλιά ή κρυφά δεδομένα. Εξειδίκευμένη ανάκτηση μεταβλητής – $_GET[‘όνομα_μεταβλητής’] Προγραμματισμός Εφαρμογών Διαδικτύου 29
30
Πέρασμα Μεταβλητής με POST Απαίτηση η χρήση φόρμας – Πλεονεκτήματα και Μειονεκτήματα + κατάλληλη μέθοδος για πέρασμα ευαίσθητων δεδομένων - Η σελίδα δεν μπορεί να γίνει bookmark -Οι χρήστες βλέπουν τα ονόματα των μεταβλητών και τιμών Εξειδικευμένη ανάκτηση μεταβλητής – $_GET[‘όνομα_μεταβλητής’] Προγραμματισμός Εφαρμογών Διαδικτύου 30
31
Παράδειγμα LOOP με POST Loops Generate Square and Cube Values Select Start Number <?php for ($i=0; $i $i "; } ?> Select End Number <?php for ($i=10; $i $i "; } ?> Προγραμματισμός Εφαρμογών Διαδικτύου 31
32
Αποτέλεσμα Προγραμματισμός Εφαρμογών Διαδικτύου 32
33
Εξωτερικά Αρχεία Κώδικα Χρήση εξωτερικών αρχείων Για ενσωμάτωση συχνά χρησιμοποιούμενων τμημάτων κώδικα PHP σε ένα αρχείο. Για ενσωμάτωση τμημάτων κώδικα HTML (και PHP) που θέλουμε να υπάρχουν σε κάθε σελίδα. Δημιουργία ιστοσελίδας πρότυπο για ένα Web Site Για την ενσωμάτωση ενός εξωτερικού αρχείου στο τρέχον αρχείο - include (“filename.php”); Αν δεν ενσωματωθεί το αρχείο, προκαλείται ένα warning. - require (“filename.php”); Αν δεν ενσωματωθεί το αρχείο, προκαλείται ένα fatal error. Βασικός μηχανισμός κατασκευής δομημένων σελίδων. Προγραμματισμός Εφαρμογών Διαδικτύου 33
34
Συναρτήσεις 1 Πού δηλώνονται οι συναρτήσεις ; Σε οποιοδήποτε σημείο του κώδικα. Ακόμα και σε ξεχωριστό αρχείο. Δήλωση απλής συνάρτησης - function name () { // εντολές} function printAddress() { echo “ Dept. of Informatics, AUTH ”; } Κλήση συνάρτησης με το όνομα της - printAddress(); Προγραμματισμός Εφαρμογών Διαδικτύου 34
35
Συναρτήσεις 2 Δήλωση συνάρτησης με ορίσματα - function name ($var1, $var2, …) { // εντολές} function printAddress($address) { echo “ $address ”; } Κλήση συνάρτησης $address = “Dept. of Informatics, AUTH”; printAddress ($address); Προγραμματισμός Εφαρμογών Διαδικτύου 35
36
Συναρτήσεις 3 Επιστροφή τιμής - return (value) function largest($num1, $num2) { if ($num1 > $num2) return ($num1); else return ($num2); } Επιστροφή της τιμής $x = largest(3, 5); Προγραμματισμός Εφαρμογών Διαδικτύου 36
37
Συναρτήσεις 4 Η εμβέλεια των μεταβλητών είναι τοπική - Μεταβλητές που ορίζονται μέσα σε μια συνάρτηση ή μεταβλητές παράμετροι της δεν είναι ορατές έξω από τη συνάρτηση. - Μεταβλητές που ορίζονται στο κυρίως πρόγραμμα δεν είναι ορατές μέσα σε μια συνάρτηση. Εκτός και αν δηλωθούν ως global global $varname Εξαιρούνται μεταβλητές που είναι εξ’ ορισμού καθολικές $_GET[var1], $_POST[var2] Προγραμματισμός Εφαρμογών Διαδικτύου 37
38
Πίνακες Sequential - Η αρίθμηση των στοιχείων ξεκινάει από 0. Associate - Χρησιμοποιούνται strings για την αναφορά στα στοιχεία. Προγραμματισμός Εφαρμογών Διαδικτύου 38
39
Πίνακες Sequential 1 Δημιουργία πίνακα $myarray = array (18, 12, 23) ; Ο τύπος δεδομένων των στοιχείων Μπορεί να διαφέρει από στοιχείο σε στοιχείο $myarray = array (‘one’, 12, ‘3’) ; Ανάκτηση των στοιχείων ενός πίνακας – echo $myarray[0]; // 'one' – echo $myarray[1]; // 2 – echo $myarray[2]; // '3' – $myarray[1] = 5; Προγραμματισμός Εφαρμογών Διαδικτύου 39
40
Πίνακες Sequential 2 Προσθήκη στοιχείων σε πίνακα – $myarray [3] = 5; – $myarray [6] = 15; // μη συνεχόμενα στοιχεία – $myarray [] = 23; // προσθήκη στο τέλος – echo $myarray[7]; Προγραμματισμός Εφαρμογών Διαδικτύου 40
41
Πίνακες Associative Δημιουργία πίνακα' – $person = array('name'=>'Albert', 'age'=>'124'); Ανάκτηση των στοιχείων ενός πίνακα – echo $person['name']; // Albert – $person['age'] = 105; Προσθήκη στοιχείων σε πίνακα – $person['email'] = 'albert@physics.com'; Διαγραφή στοιχείου – unset($person['firstname']); Εξακριβώνοντας την ύπαρξη ενός στοιχείου – if isset($person['age']) {echo 'has age!';} Προγραμματισμός Εφαρμογών Διαδικτύου 41
42
foreach Η εντολή foreach ($array as $value) διατρέχει όλες τις τιμές του πίνακα. Παράδειγμα <?php $flavor[] = "blue raspberry"; $flavor[] = "root beer"; $flavor[] = "pineapple"; echo "My favorite flavors are: "; foreach ($flavor as $currentvalue) { echo $currentvalue. " \n"; } ?> Προγραμματισμός Εφαρμογών Διαδικτύου 42
43
Συναρτήσεις Πινάκων count ή sizeof για πλήθος στοιχείων $my_array = array(3, 7, 5); echo count($my_array) // 3 sort ή rsort για ταξινόμηση αύξουσα ή φθίνουσα rsort($my_array); echo $my_array[0]; // 7 Προγραμματισμός Εφαρμογών Διαδικτύου 43
44
Ανακατεύθυνση Σελίδας Χρησιμοποιείται η εντολή header, η οποία στέλνει HTTP headers Θα πρέπει να εκτελεστεί πριν ξεκινήσει η σελίδα, δηλαδή πριν την ετικέτα Ανακατεύθυνση σε άλλη σελίδα header('location: http://www.auth.gr'); exit(); Ανακατεύθυνση σε ίδια σελίδα header('location: '. $_SERVER['PHP_SELF']); exit(); - Χρειάζεται αν νωρίτερα έχουμε θέσει τιμές σε κάποιες μεταβλητές και θέλουμε να ξαναφορτώσουμε τη σελίδα. Προγραμματισμός Εφαρμογών Διαδικτύου 44
45
Αποστολή Email 1 Ρύθμιση στο php.ini αρχείο. – [mail function] ; Setup for Windows systems SMTP = smtp.my.isp.net (π.χ. mail.auth.gr) sendmail_from = myemail@teithessaly.gr (το email σας) – [mail function] ; Setup for Linux systems sendmail_path = /usr/sbin/sendmail -t sendmail_from = myemail@teithessaly.gr (το email σας) Οι παραπάνω ρυθμίσεις για Win setup, έχουν δοκιμαστεί και λειτουργούν ΟΚ αλλά μόνο εντός του domain teithessaly.gr (πρέπει ο mail server να σας βλέπει εντός του TEI). Δεν λειτουργούν αν π.χ. συνδεθείτε σε Internet μέσω άλλου παροχέα (π.χ. otenet, forthnet, κτλ) Προγραμματισμός Εφαρμογών Διαδικτύου 45
46
Αποστολή Email 2 Κώδικας για την αποστολή <?php $to = ‘myemail@teithessaly.gr'; $subject = 'test'; $message = 'hello there!'; if (mail($to, $subject, $message)) { echo ' Mail sent successfully '; } else { echo ' Mail could not be sent '; } ?> Προγραμματισμός Εφαρμογών Διαδικτύου 46
47
Τέλος Ενότητας
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.