Εφαρµογές διαδικτύου µε PHP Σταύρος Πολυβίου Αρχιτεκτονική τριών επιπέδων (three-tier architecture) SQL HTTP request Αποτελέσµατα (πίνακες) PHP HTML Σύστηµα διαχείρισης δεδοµένων (Database Management System) Εξυπηρετητής διαδικτύου + PHP (Web Server + PHP) Φυλλοµετρητής (Web Browser) 1
MySQL και PHP Το MySQL είναι ένα open source σχεσιακό σύστηµα διαχείρισης δεδοµένων Είναι µία πολύ δηµοφιλής επιλογή για τη δηµιουργία δυναµικών σελίδων λόγω Χαµηλού κόστους ιαρκώς αυξανόµενων δυνατοτήτων Συχνά γίνεται λόγος για την open source πλατφόρµα ανάπτυξηςδυναµικών ιστοσελίδων LAMP: Linux + Apache + MySQL + PHP Σύνδεση µε MySQL και επιλογή βάσης Γενική µορφή mysql_connect ( string server, string user, string password) server: user: password: URI MySQL βάσης Όνοµα χρήστη Κωδικός χρήστη Επιστρέφει ένα resource που αντιπροσωπεύει τη σύνδεσή µας µε τη βάση MySQL. Παράδειγµα $conn = mysql_connect( myserver.com:3307', username', password'); Στη συνέχεια χρειάζεται να επιλέξουµε τη βάση πάνω στον MySQL server µε την οποία θα ενωθούµε bool mysql_select_db ( string database_name, resource connection) db_name: connection: Το όνοµα τηςβάσηςµε την οποία θα ενωθούµε Το connection ππυ πήραµε απότοmysql_connect 2
Εκτέλεση κώδικα SQL Γενική µορφή mysql_query (string query_string, resource connection_id) query_string: οκώδικαςsql που θέλουµε να εκτελέσουµε connection_id:το resource που αντιπροσωπέυει τη σύνδεσή µας µε τηmysql βάση αν παραληφθεί, χρηισιµοποιείται η τελευταία σύνδεση που µας έδωσε το mysql_connect() Επιστρέφει ένα resource που αντιπροσωπεύει το αποτέλεσµα της SQL Σε περίπτωση error επιστρέφει false Εκτέλεση κώδικα SQL Παράδειγµα 1 $conn = mysql_connect( myserver.com:3037, username, password ); $db_selected = mysql_select_db( mydb', $conn); $sql = "SELECT * FROM customers"; $result = mysql_query($sql, $conn); Παράδειγµα 2 µε error message $conn = mysql_connect(my_database', username', password'); $db_selected = mysql_select_db( mydb', $conn); $sql = "SELECT CompanyName, ContactName FROM customers"; $result = mysql_query($sql, $conn) or die( An error occurred :.mysql_error()); 3
Εξαγωγή αποτελεσµάτων SQL Όπως γνωρίζετε το αποτέλεσµα µίας επερώτησης σε SQL είναι ένας πίνακας Αυτότοαποτέλεσµα τολαµβάνουµε σειράµε σειρά Κάθε σειρά αποτελείται από στήλες τις τιµές των οποίων αναθέτουµε σεµεταβλητές Επαναλαµβάνουµε τη διαδικασία µέχρις ώτου εξαντληθούν οι σειρές του πίνακα Πλήρες παράδειγµα MySQL $conn = mysql_connect( myserver.com:3037, username', password'); // Σύνδεση µε τηβάση if (!$conn) exit("connection Failed: ". $conn); // Εντοπισµός και αντίδραση σε πρόβληµα σύνδεσης // Επιλογή βάσης $db_selected = mysql_select_db( mydb', $conn) or die ('Can\'t use mydb : '. mysql_error()); $sql = "SELECT CompanyName, ContactName FROM customers"; // Κώδικας SQL προς εκτέλεση $results = mysql_query($sql, $conn); // Προπαρασκευή και εκτέλεση κώδικα SQL if (!$result) exit("error in SQL"); // Εντοπισµός και αντίδραση σε πρόβληµα εκτέλεσης 4
echo "<table><tr>"; // Πρόλογος πίνακα αποτελεσµάτων echo "<th>companyname</th>"; // Επικεφαλίδες πίνακα αποτελεσµάτων: τα ονόµατα των στηλών echo "<th>contactname</th></tr>"; while (mysql_fetch_row($result)) // Ανάκτηση της επόµενης σειράς. ίνει true όσο υπάρχουν σειρές. { } $compname = $result[0] ; // Ανάκτηση τιµής πρώτης στήλης $conname = $result[1] ; // Ανάκτηση τιµής δεύτερης στήλης echo "<tr><td>$compname</td>"; // υναµικές σειρές πίνακα HTML ο αριθµός και το περιεχόµενο echo "<td>$conname</td></tr>"; // τους δυνατό να διαφέρει από εκτέλεση σε εκτέλεση mysql_free_result($result); // Αποδέσµευση resource αποτελέσµατος mysql_close($conn); // Αποδέσµευση resource σύνδεσης echo "</table>"; // Επίλογος πίνακα αποτελεσµάτων Το ODBC Το ODBC (Open DataBase Connectivity) είναι ένα σύνολο APIs της Microsoft Ανοικτό για υλοποίηση από τρίτους Ένα σύστηµα διαχείρισης δεδοµένων εγκαθιστάτοδικότουodbc driver το οποίο υλοποιεί το ODBC API και λειτουργεί ως µεσάζων µεταξύ του συστήµατος και των εφαρµογών Όλα τα µεγάλα συστήµατα έχουν κάποιο ODBC driver, π.χ. Oracle, IBM DB2, Microsoft SQL Server κ.α. 5
Το ODBC και το PHP Το PHP παρέχει µία σειρά από ρουτίνες που υλοποιούν το API του ODBC Με αυτό τον τρόπο µπορούµε να ενωθούµε µε οποιοδήποτε σύστηµα διαχείρισης δεδοµένων το οποίο έχει εγγράψει το ODBC driver του Οι ρουτίνες αυτές για πολλά συστήµατα παρακάµπτουν το ODBC driver και λειτουργούν ως wrappers γύρω από το API του ίδιου του συστήµατος Συνεπώς εξασφαλίζεται τόσο η απόδοση (performance) όσοκαιηευκολίαµετεγκατάστασης (portability) Σύνδεση µε βάσηδεδοµένων Γενική µορφή odbc_connect ( string dsn, string user, string password) dsn: user: password: Όνοµα ODBC driver βάσης Όνοµα χρήστη Κωδικός χρήστη Επιστρέφει ένα resource που αντιπροσωπεύει τη σύνδεσή µας µε τηβάση. Παράδειγµα $conn = odbc_connect( my_database', username', password'); 6
Εκτέλεση κώδικα SQL Γενική µορφή odbc_exec ( resource connection_id, string query_string) connection_id:το resource που αντιπροσωπέυει τη σύνδεσή µας µε τη βάση query_string: ο κώδικας SQL που θέλουµε να εκτελέσουµε Επιστρέφει ένα resource που αντιπροσωπεύει το αποτέλεσµα τηςsql Σε περίπτωση error επιστρέφει false Εκτέλεση κώδικα SQL Παράδειγµα 1 $conn = odbc_connect(my_database', username', password'); $sql = "SELECT * FROM customers"; $result = odbc_exec($conn,$sql); Παράδειγµα 2 µε error message $conn = odbc_connect(my_database', username', password'); $sql = "SELECT CompanyName, ContactName FROM customers"; $result = odbc_exec($conn,$sql) or die( An error occurred :.odbc_errormsg()); 7
$conn = odbc_connect( my_database', username', password'); // Σύνδεση µε τηβάση if (!$conn) exit("connection Failed: ". $conn); // Εντοπισµός και αντίδραση σε πρόβληµα σύνδεσης $sql = "SELECT CompanyName, ContactName FROM customers"; // Κώδικας SQL προς εκτέλεση $results = odbc_exec($conn,$sql); // Προπαρασκευή και εκτέλεση κώδικα SQL if (!$result) exit("error in SQL"); // Εντοπισµός και αντίδραση σε πρόβληµα εκτέλεσης echo "<table><tr>"; // Πρόλογος πίνακα αποτελεσµάτων echo "<th>companyname</th>"; // Επικεφαλίδες πίνακα αποτελεσµάτων: τα ονόµατα των στηλών echo "<th>contactname</th></tr>"; while (odbc_fetch_row($result)) // Ανάκτηση της επόµενης σειράς. ίνει true όσο υπάρχουν σειρές. { } $compname = odbc_result($result,"companyname"); // Ονοµαστική αναφορά σε τιµή στήλης $conname = odbc_result($result, 2); // Αναφορα σε τιµή στήλης βάσει σειράς echo "<tr><td>$compname</td>"; // υναµικές σειρές πίνακα HTML οαριθµός και το περιεχόµενο echo "<td>$conname</td></tr>"; // τους δυνατό να διαφέρει από εκτέλεση σε εκτέλεση odbc_free_result($result); // Αποδέσµευση resource αποτελέσµατος odbc_close($conn); // Αποδέσµευση resource σύνδεσης echo "</table>"; // Επίλογος πίνακα αποτελεσµάτων ηµιουργία σελίδων µε «µνήµη» Το πρωτόκολλο HTTP είναι stateless δηλαδή δεν έχει «µνήµη» Με αυτό τον τρόπο δεν επιβαρύνεται ο εξυπηρετητής Σε αντίθετη περίπτωση, για κάθε επισκέπτη µίας ιστοσελίδας ο εξυπηρετητής θα έπρεπε να διατηρεί ξεχωριστή λίστα µεταβλητών 8
Τρόποι δηµιουργίας «µνήµης» σε µία εφαρµογή διαδικτύου Με µεταβλητές τύπου POST και GET Με cookies που αποθηκεύονται στον πελάτη Με sessions που διατηρούνται στον εξυπηρετητή Με Javascript που εκτελείται στο φυλλοµετρητή του πελάτη Μεταβλητές τύπου POST και GET Μεταβλητές οι οποίες προωθούνται στον εξυπηρετητή µέσω του HTTP Συλλέγονται µέσω φορµών (HTML forms) και URLs (GET µόνο) Οι µεταβλητές τύπου GET εµφανίζονται στο URL µίας σελίδας µπορούν να γίνουν bookmarked Ιδιαίτερα ακατάλληλες για ευαίσθητες πληροφορίες όπως κωδικούς πρόσβασης Μπορούν να αποθηκεύσουν µέχρι 100 χαρακτήρες µόνο Με το refresh επαναποστέλλονται στον εξυπηρετητή Οι µεταβλητές τύπου POST δεν εµφανίζονται στο URL µίας σελίδας δε µπορούν να γίνουν bookmarked Μπορούν να αποθηκεύσουν «απεριόριστο» όγκο πληροφοριών Με το refresh ο φυλλοµετρητής ζητά επιβεβαίωση πρωτού επαναποστείλει τις µεταβλητές στον εξυπηρετητή 9
Αποστολή µεταβλητών GET µέσω φορµών HTML <form action="welcome.php method="get"> Name: <input type="text" name="name" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> Πατώντας το κουµπί Submit query ο χρήστης θα µεταφερθεί στο URL /welcome.php?name=stavros+polyviou&age=none+of+your+business Αποστολή µεταβλητών POST µέσω φορµών HTML <form action="welcome.php method= post"> Name: <input type="text" name="name" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> Πατώντας το κουµπί Submit query ο χρήστης θα µεταφερθεί στο URL /welcome.php 10
Ανάκτηση τιµών µεταβλητών GET και POST στο PHP Μπορούµε να πάρουµε τις τιµές των GET και POST µεταβλητών χρησιµοποιώντας τους πίνακες $_GET και $_POST αντίστοιχα Το κλειδί αυτών των πινάκων είναι το όνοµα των µεταβλητών $name = $_GET[ name ]; $age = $_GET[ age ]; ή $name = $_POST[ name ]; $age = $_POST[ age ]; Cookies Το cookie είναι ένα µικρό αρχείο το οποίο ο εξυπηρετητής αποστέλλει στον πελάτη Το αρχείο αυτό αποθηκεύεται για κάποιο συγκεκριµένο χρονικό διάστηµα Μόνο ο εξυπηρετητής που το απέστειλε µπορεί να το διαβάσει Κάθε φορά που ο φυλλοµετρητής επιχειρεί να διαβάσει µία σελίδα του domain του cookie τότε αποστέλλει στον εξυπηρετητή και το cookie µαζί µε το request Συνήθως χρησιµοποιείται για να ταυτοποιήσει το χρήστη 11
ηµιουργία cookies στο PHP Το PHP δηµιουργεί cookies µε τηνεντολήsetcookie ηοποίαπρέπει να προηγηθεί των tags <head> και <html> setcookie (string name [, string value, int expire, string path, string domain, bool secure, bool httponly] ) name: το όνοµα του cookie χρησιµοποιείται για την ανάκτηση της τιµής του value: ητιµή τουcookie expire: ο χρόνος ληξης του cookie σε δευτερόλεπτα εάν δεν δοθεί ή αν είναι 0 τότε λήγει µε το πέρας του session (δηλ. µε το που θα κλείσει ο φυλλοµετρητής) path: το µονοπάτι πάνω στον εξυπηρετητή ώπου ισχύει το cookie domain: το domain µέσα στο οποίο ισχύει το cookie. Για να περιληφθούν όλα τα subdomains ξεκινείστε µε µία τελεία (.mypage.com και όχι mypage.com ) secure: το κατά πόσο το cookie θα αποστέλλεται µόνο µέσω secure connection httponly: το κατά πόσο scripting languages όπως το Javascript θα µπορούν να έχουνπρόσβασηστηντιµή τουcookie Ανάκτηση cookies στο PHP Γίνεται µέσω του πίνακα $_COOKIE Το κλειδί του πίνακα αυτού είναι το όνοµα τουcookie Παράδειγµα: δηµιουργία και ανάκτηση cookie που λήγει σε 30 ηµέρες <?php setcookie( user, stavros, time()+60*60*24*30)?> <head> $user = $_COOKIE[ user ]; 12
ιαχείριση sessions στο PHP Στον εκάστοτε χρήστη που επισκέπτεται µία σελίδα ανατατίθεται µία αµφιµονοσήµαντη ταυτότητα session Το PHP αναλαµβάνει να διατηρεί διαφορετικές µεταβλητές (µε τοίδιοόνοµα αλλά διαφορετικές τιµές), αναλόγως της ταυτότητας session του χρήστη Ένα session έχει κάποιο χρόνο λήξης Η ταυτότητα του session µπορεί να διαβιβασθεί στον εξυπηρετητή µε ένα cookie ή µία µεταβλητή τύπου GET µε τοόνοµα PHPSESSID Παράδειγµα δηµιουργίας session και καταχώρησης µεταβλητών session_start(); // ηµιουργία ή ανάκτηση session if (!session_is_registered( name )) // Καταχωρηµένη µεταβλητή; { session_register( name ); // Καταχώρηση µεταβλητής $name = Stavros Polyviou } $sessionurl = www.myurl.com?phpsessid=. session_id(); // Μεταβλητή GET <a href= <?=$sessionurl?> >Go to URL</a> if (isset($phpsessid)) // Έλεγχος ύπαρξης session { session_start(); session_destroy(); // ιαγραφή session } 13
Μηχανισµός διαχείρισης sessions στο PHP Το PHP δηµιουργεί στο ευρετήριο /tmp του εξυπηρετητή ένα αρχείο µε όνοµα την ταυτότητα του εκαστοτε session Μέσα στο αρχείο αποθηκέυονται όλες οι καταχωρηµένες µεταβλητές και οι τιµές τους Μετά το πέρας του session τα αρχεία αυτά διαγράφονται (garbage collection) Υπάρχουν µηχανισµοί µέσω handlers για τη δηµιουργία διαφορετικών µηχανισµών διαχείρισης sessions π.χ. µέσα σε µία βάση 14