PHP/MySQL και Project Μια απλή διαδικτυακή εφαρμογή Γεώργιος Ευαγγελίδης Τμήμα Εφαρμοσμένης Πληροφορικής Σχολή Επιστημών Πληροφορίας Πανεπιστήμιο Μακεδονίας
Περιεχόμενα PHP (Middle tier) Διαδικτυακές εφαρμογές αρχιτεκτονικής 3 επιπέδων Front end [Web browser πελάτη] Middle tier [Web server (Apache) με διερμηνευτή PHP] Back end [DBMS, π.χ., MySQL/MariaDB] Μια απλή εφαρμογή
... για διάβασμα http://web-class.gr/ Ανάπτυξη Web Εφαρμογών (σεμινάριο από τους προπτυχιακούς φοιτητές Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών του ΕΜΠ Διονύση Ζήνδρο και Πέτρο Αγγελάτο με άδεια Creative Commons 3.0 Attribution) http://www.w3schools.com/php/default.asp PHP 5 Tutorial http://www.codecademy.com/en/tracks/php PHP http://coursesweb.net/php-mysql/ PHP programming and MySQL database
PHP Γενικά PHP Hypertext Preprocessor Application Server Τρέχει στο middle tier (μαζί με τον Web Server) Παράγει τον html κώδικα που ο Web Server αποστέλλει στο front end (client web browser) Μιλά με το back end (DBMS) για να αποθηκεύσει/ ανακτήσει τα δεδομένα της εφαρμογής Διαχειρίζεται συνεδρίες (sessions) Υλοποιεί συναλλαγές βάσεων δεδομένων
Επικοινωνία front end με middle tier Δώσε μου τη σελίδα Χ Φτιάξε μου τη σελίδα Χ Ορίστε η σελίδα Χ Εκτέλεση κώδικα PHP Παραγωγή HTML Ορίστε η σελίδα Χ Εμφάνιση σελίδας από http://web-class.gr/
Επικοινωνία middle tier με back end HTTP MySQL ερώτημα Χώρος αποθήκευσης MySQL απάντηση HTTP από http://web-class.gr/
PHP αρχεία και εκτέλεση <html> <body> <?php echo Σεμινάριο στο ΠαΜακ! ;?> </body> </html> παράγει <html> <body> Σεμινάριο στο ΠαΜακ! </body> </html>
PHP περισσότερα http://www.w3schools.com/php/default.asp http://web-class.gr/ Παραδόσεις 8 και 9
Περί συνεδριών (sessions) Απαραίτητα για να θυμάται η εφαρμογή τον κάθε πελάτη καθώς το πρωτόκολλο http είναι stateless http://www.w3schools.com/php/php_sessions.asp
PHP & MySQL Πως συνδεόμαστε http://www.w3schools.com/php/php_mysql_connect.asp
Περί συναλλαγών <?php $dbconnection = mysqli_connect('server', 'user', 'passwd', 'database'); mysqli_autocommit($dbconnection, false); $flag = true; $query1 =... $result = mysqli_query($dbconnection, $query1); if (!$result) { $flag = false; } if ($flag) { mysqli_commit($dbconnection); } else { mysqli_rollback($dbconnection); } mysqli_close($dbconnection);?>
Απλή εφαρμογή: καταχώριση cds (1) Παραλλαγή εφαρμογής από το http://web-class.gr/ Παράδειγμα Παράδοσης 13 (Πες το) Υπάρχει ο πίνακας users που αποθηκεύει τους χρήστες της εφαρμογής και ο πίνακας cds στον οποίο οι χρήστες καταχωρίζουν στοιχεία από cd. Κάθε χρήστης πρέπει να εγγραφεί πρώτα (register) για να μπορέσει να συνδεθεί (login), αλλιώς είναι public χρήστης (δηλαδή βλέπει μόνο).
Απλή εφαρμογή: καταχώριση cds (2) Εγγεγραμμένος χρήστης: Μπορεί να εισάγει εγγραφές της μορφής (cdartist, cdtitle, username), όπου τα cdartist και cdtitle τα εισάγει μέσω φόρμας και το username είναι το όνομα του συγκεκριμένου χρήστη (από το $_SESSION). Δεν είναι δυνατή η εισαγωγή ζεύγους (cdartist, cdtitle) που ήδη υπάρχει (και ανήκει στον ίδιο ή άλλο χρήστη). Μπορεί να διαγράψει μόνο τις εγγραφές που του ανήκουν απλά ξαναεισάγοντας τα στοιχεία τους. Για παράδειγμα, αν εισαχθούν στη φόρμα εισαγωγής τα cdartist= Villagers of Ioannina City και cdtitle= riza και η εγγραφή υπάρχει ήδη και ανήκει στο συγκεκριμένο χρήστη, τότε αυτή διαγράφεται.
Απλή εφαρμογή: καταχώριση cds (3) Εγγεγραμμένος χρήστης (συνέχεια): Η τροποποίηση εγγραφής γίνεται μόνο μέσω διαγραφής της και εκ νέου εισαγωγής της. Προφανώς, η τροποποιημένη εγγραφή δεν θα πρέπει να υπάρχει ήδη (είτε ανήκει στον ίδιο ή άλλο χρήστη). Βλέπει (στην αρχική σελίδα της εφαρμογής) τα περιεχόμενα του πίνακα cds (και τα τρία πεδία) ταξινομημένα ανά (cdartist, cdtitle). Ένας public χρήστης (κάποιος δηλαδή που επισκέπτεται την εφαρμογή): Βλέπει την πληροφορία του πίνακα cds χωρίς όμως το 3ο πεδίο, ταξινομημένη ανά (cdartist, cdtitle).
Απλή εφαρμογή: εγκατάσταση Αποσυμπιέζουμε το αρχείο cdbase.zip στον κατάλληλο κατάλογο του web server. Δημιουργούμε στη MySQL τη βάση δεδομένων cdbase με τους δυο πίνακες (αρχείο schema.sql) (μέσω mysql από κονσόλα ή μέσω http://localhost/phpmyadmin) Επισκεπτόμαστε τη σελίδα http://localhost/cdbase
Εργαστηριακή άσκηση (Project) (1) Θα πρέπει να κάνετε τις εξής αλλαγές στην εφαρμογή cdbase: [1] Προσθέστε το πεδίο year στον πίνακα cds και τροποποιήστε κατάλληλα τον php κώδικα ώστε να καταχωρίζεται και να εμφανίζεται και αυτό το πεδίο. [2] Για κάθε εισαγωγή ή διαγραφή CD, θα πρέπει ο κώδικάς σας να καταχωρίζει σε έναν νέο πίνακα της μορφής log(timestamp timestamp, userid varchar(20), action varchar(10), artist varchar(100), title varchar(100)) μια εγγραφή ιστορικού. Οι πιθανές τιμές του πεδίου action είναι DELETE, INSERT και NO ACTION (όταν η προς εισαγωγή ή διαγραφή εγγραφή ανήκει σε άλλο χρήστη). Δείτε στην εικόνα πως καταγράφεται η πληροφορία ότι κατά σειρά έγιναν 2 εισαγωγές, 1 διαγραφή, και 1 εισαγωγή.
Εργαστηριακή άσκηση (Project) (2)
Εργαστηριακή άσκηση (Project) (3) [3] Το log file θα πρέπει να φαίνεται μόνο όταν κάποιος χρήστης είναι συνδεδεμένος και να δείχνει μόνο τις ενέργειες του συγκεκριμένου χρήστη (δείτε εικόνα). Καθώς δεν κρατάμε στον πίνακα log πληροφορία για το session, θα φαίνονται όλες οι ενέργειες του χρήστη (για όλα τα session). [4] Μετατρέψτε τον κώδικα της εισαγωγής cd σε συναλλαγή. Μετά την εισαγωγή να γίνεται έλεγχος του πλήθους των εισαγωγών που έκανε ο χρήστης τη συγκεκριμένη ημέρα. Αν αυτές υπερβαίνουν τις 3, η συναλλαγή να αναιρείται (rollback) αλλιώς να ολοκληρώνεται (commit). Βοήθεια: Στη MySQL, ο τύπος δεδομένων timestamp είναι πολύ βολικός καθώς η default συμπεριφορά του είναι αντίστοιχη με αυτή του auto_increment, δηλαδή το πεδίο παίρνει αυτόματα την τιμή του timestamp του συστήματος. Έτσι, δεν χρειάζεται να ασχοληθείτε με την εισαγωγή της τιμής του πεδίου αυτού μέσω PHP (π.χ., χρησιμοποιώντας τη συνάρτηση time()).