Το προφίλ μας στο Google Plus
7

PHP & MySQL Tutorial – Η Συντροφιά του Δαχτυλιδιού

Σας είπαν πως αν μάθετε τα βασικά της HTML θα καταφέρετε να δημιουργήσετε το δικό σας website αλλά το μόνο που καταφέρατε να φτιάξετε είναι ένα σύνολο βαρετών στατικών ιστοσελίδων; Αν θέλετε να δημιουργήσετε ένα πραγματικά λειτουργικό ιστοτόπο, ο οποίος να “σερβίρει” δυναμικά πληροφορίες και να αλληλεπιδρά με τον επισκέπτη, δεν έχετε παρά να ακολουθήσετε τις συμβουλές αυτού του tutorial.

Τι εννοούμε όμως λέγοντας λειτουργικός ή δυναμικός ιστοτόπος; Πάρτε για παράδειγμα ένα site που επισκέπτεστε καθημερινά για την πληροφόρησή σας όπως το in.gr ή το Google News ή το αγαπημένο σας forum/blog (το οποίο -ελπίζουμε- είναι αυτό που διαβάζετε αυτή τη στιγμή). Θα έχετε παρατηρήσει φυσικά ότι -σε αντίθεση με τις στατικές HTML ιστοσελίδες- αν μπείτε με διαφορά μιας ώρας στην κεντρική σελίδα του ίδιου ιστοτόπου, το περιεχόμενο πιθανότατα θα έχει αλλάξει. Επίσης στις περισσότερες από αυτές τις σελίδες μπορείτε να γραφτείτε ως χρήστες με διαφορετικά επίπεδα πρόσβασης και έτσι να βλέπετε μόνο δημοσιεύσεις για τις οποίες έχετε τα κατάλληλα δικαιώματα ή –αν μιλάμε για forum- να επιτρέπεται και σε σας τους ίδιους να προσθέτετε δημοσιεύσεις και σχόλια. Τέλος, θα έχετε παρατηρήσει ένα σωρό χαρακτηριστικά σε σελίδες, όπως αναζήτηση, δημοσκοπήσεις (polls), guestbooks κ.α. και καθώς αυτές οι λειτουργίες δεν μπορούν να δημιουργηθούν με απλή HTML, πιθανόν να απορείτε για τον τρόπο υλοποίησής τους.
Για να κατασκευάσουν τέτοιου είδους εφαρμογές οι σχεδιαστές ενός site χρησιμοποιούν συνήθως τον συνδυασμό ενός δικτυακού συστήματος βάσεων δεδομένων και μιας σκριπτογλώσσας προγραμματισμού, ο κώδικας της οποίας όμως εκτελείται στον web server σε αντίθεση με την HTML της οποίας ο κώδικας εκτελείται στον browser του επισκέπτη (μην τρομάζετε :-), τα πράγματα θα γίνουν πολύ πιο κατανοητά όταν διαβάσετε όλο το tutorial).
Εμείς εδώ θα χρησιμοποιήσουμε ως σύστημα βάσης δεδομένων την MySQL και ως σκριπτογλώσσα την PHP. Επιλέξαμε αυτόν τον συνδυασμό γιατί είναι μια από τις καλύτερες λύσεις από άποψη πληθώρας χαρακτηριστικών, δουλεύει άνετα σε όλα τα λειτουργικά συστήματα και η χρήση του παρέχεται δωρεάν (τι άλλο να ζητήσουμε!). Σε MySQL ή/και PHP βασίζονται εκατομμύρια sites μεταξύ των οποίων τα Yahoo!, YouTube, Flickr, FaceBook, Technorati, Wikipedia, digg και del.icio.us. Για να είμαστε δίκαιοι πάντως, να αναφέρουμε ότι δεν είναι λίγοι αυτοί που προτιμούν κάποια εμπορική λύση όπως τον συνδυασμό MSSQL & ASP της Microsoft.
Όπως θα διαβάσατε ήδη στον τίτλο, αυτό είναι το πρώτο από τα τρία μέρη του tutorial στο οποίο θα ασχοληθούμε με τις απαιτούμενες εγκαταστάσεις που χρειάζονται για να προχωρήσετε στην ανάπτυξη δυναμικών σελίδων και θα κάνουμε μια εισαγωγή στην διαχείριση βάσεων MySQL. Στο επόμενο μέρος θα δούμε τα βασικά για την γλώσσα PHP και τον τρόπο με τον οποίο ο κώδικάς της συνδυάζεται με αυτόν της HTML ενώ στο τρίτο και τελευταίο μέρος θα επιχειρήσουμε να δέσουμε MySQL και PHP δημιουργώντας την πρώτη μας real world εφαρμογή.

Τι θα χρειαστούμε.

To XAMPP Control Panel μετά από επιτυχή εγκατάσταση του XAMPP σε Windows. Αν τσεκάρετε τα κουτάκια με την ένδειξη Svc, οι αντίστοιχοι servers θα εκτελεστούν ως Windows Services, κάτι που δεν χρειάζεται εφόσον χρησιμοποιείτε το XAMPP μόνο για ανάπτυξη εφαρμογών. Κάνοντας κλικ στο Status θα δείτε, μεταξύ άλλων, τις TCP πόρτες στις οποίες αφουγκράζονται οι servers, πληροφορία χρήσιμη για ανάλογη ρύθμιση του firewall σας.Αρχικά θα πρέπει να μετατρέψετε τον υπολογιστή σας σε (PHP enabled) web και MySQL server. Για τον σκοπό αυτό πρέπει να κατεβάσετε, να εγκαταστήσετε και να ρυθμίσετε τις τελευταίες (και ανάλογες για το λειτουργικό σύστημα που χρησιμοποιείτε) εκδόσεις του Apache Web Server, της PHP και του MySQL server. Επειδή η περιγραφή της εγκατάστασης και ρύθμισης όλων αυτών δεν είναι κάτι τόσο απλό -όσο ίσως ακούγεται-, ειδικά αν σκεφτείτε τις διαφοροποιήσεις στα τρία κύρια λειτουργικά συστήματα, σας συστήνουμε να χρησιμοποιήσετε το XAMPP που μπορείτε να κατεβάσετε από την επίσημη ιστοσελίδα του. Το XAMPP, που κυκλοφορεί σε 4 εκδόσεις για Linux, Windows, MacOS X και Solaris είναι ουσιαστικά ένας installer που αναλαμβάνει να εγκαταστήσει Apache, PHP και MySQL και να κάνει τις απαραίτητες ρυθμίσεις για ομαλή λειτουργία των τριών στο σύστημά σας χρησιμοποιώντας έναν απλό “click-next” wizard. Ανάλογα με το λειτουργικό σας σύστημα, το XAMPP θα σας προτείνει την εγκατάσταση και άλλων χαρακτηριστικών όπως SMTP server, FTP server κ.α. τα οποία δεν θα σας φανούν χρήσιμα σε αυτό το tutorial αλλά ίσως σας χρειαστούν στην συνέχεια. Για παράδειγμα ο SMTP server είναι αναγκαίος αν θέλετε τα script που θα αναπτύξετε για το site σας να στέλνουν αυτοματοποιημένα email στους επισκέπτες όπως τα email επαλήθευσης που λαμβάνετε όταν εγγράφεστε σε ένα forum.
Στο tutorial αυτό για να διατηρήσουμε μια κοινή γραμμή συμβουλών θα υποθέσουμε ότι ακολουθήσατε την μέθοδο XAMPP. Επίσης, δεδομένου των μικρών διαφοροποιήσεων του XAMPP από λειτουργικό σε λειτουργικό και για να μην καταντήσουμε κουραστικοί, όλες μας οι αναφορές θα αφορούν την Windows έκδοσή του. Ωστόσο είτε προτιμήσετε να στήσετε κάθε server χειροκίνητα, είτε στήσετε XAMPP σε μη-windows πλατφόρμα, δεν θα πρέπει να δυσκολευτείτε να προσαρμόσετε τις συμβουλές μας στην περίπτωσή σας.
Όπως και να έχει πάντως, τονίζουμε ότι το XAMPP μετά την εγκατάστασή του ρυθμίζει τον Apache και τον MySQL server με γνώμονα την απροβλημάτιστη τοπική χρήση και όχι την ασφαλή χρήση, γεγονός που το καθιστά κατάλληλο μόνο ως περιβάλλον ανάπτυξης για την δοκιμή των σελίδων και των script που δημιουργείτε. Το XAMPP με τις προκαθορισμένες ρυθμίσεις είναι ακατάλληλο για online χρήση. Ρυθμίστε το firewall σας ώστε να μην επιτρέπει εξερχόμενες συνδέσεις στους servers διότι διαφορετικά θα αντιμετωπίσετε προβλήματα ασφάλειας στον υπολογιστή σας. Όταν έχετε το τελικό αποτέλεσμα χρησιμοποιήστε ένα web hosting service για να ανεβάσετε τις σελίδες σας ή κάντε χειροκίνητα τις ανάλογες ρυθμίσεις ασφαλείας στους επιμέρους servers του XAMPP και ελευθερώστε την εξωτερική πρόσβαση στους servers από τις ρυθμίσεις του firewall σας. Πληροφορίες για το πώς να μετατρέψετε το XAMPP από περιβάλλον ανάπτυξης σε ασφαλή online server θα βρείτε στην επίσημη σελίδα του.
To PSPad στα Windows έχει όλα τα χαρακτηριστικά ενός καλού editor. Παρατηρήστε την ένδειξη αριθμού γραμμής, την αναγνώριση και χρωματική σήμανση του κώδικα και την δυνατότητα επεξεργασίας πολλών αρχείων ταυτόχρονα.Πέρα από το XAMPP, όταν στο δεύτερο μέρος αυτού του tutorial αρχίσετε να γράφετε scripts και σελίδες, θα χρειαστείτε και ένα καλό editor, κατάλληλο για σύνταξη κώδικα. Καλό είναι, ο editor που θα επιλέξετε να παρέχει σήμανση κώδικα PHP και αναφορά αριθμού γραμμής (Δείτε τα χαρακτηριστικά αυτά στη σχετική εικόνα). Στο Linux δεν θα έχετε πρόβλημα καθώς συνήθως όλες οι distributions περιλαμβάνουν έναν editor που σέβεται τον εαυτό του όπως το TextEdit του Gnome. Στα Windows ο παρεχόμενος editor, το notepad, δεν κρίνεται κατάλληλος για σύνταξη κώδικα και σας προτείνουμε να χρησιμοποιήσετε κάποιον άλλο όπως τον εμπορικό UltraEdit  ή τον δωρεάν PSPad. Τα ίδια ισχύουν για το παρεχόμενο TextEdit του MacOSX. Προτιμήστε το IDE που παρέχει η ίδια η Apple, το Xcode ή κάποιον εναλλακτικό editor όπως ο BBEdit.

Gentlemen, start your engines!

Η σελίδα καλωσορίσματος του XAMPP. Αν είστε σε θέση να την δείτε τότε ο Apache λειτουργεί σωστά. Πειραματιστείτε για λίγο με τα demos που παρέχονται σε αυτήν για να επιβεβαιώσετε, όχι μόνο την σωστή λειτουργία του Apache, αλλά και της σωστής συνεργασίας του με PHP και MySQL. Αριστερά κάτω μπορείτε να διακρίνετε το link για το phpMyAdmin.Αφού εγκαταστήσατε το XAMPP, ανοίξτε το XAMPP Control Panel και ξεκινήστε τον Apache και τον MySQL server (Για λόγους ασφαλείας μην ξεχνάτε να σταματάτε τους servers κάθε φορά που τελειώνετε την ενασχόλησή σας με την ανάπτυξη ιστοσελίδων). Αν θέλετε, πριν προχωρήσετε παρακάτω, επαληθεύστε ότι το XAMPP εγκαταστάθηκε σωστά πληκτρολογώντας την διεύθυνση localhost στον browser σας. Αν όλα πήγαν καλά θα πρέπει να εμφανιστεί μια σελίδα που σας καλωσορίζει στο XAMPP. Είστε πλέον έτοιμοι να αρχίσετε την ουσιαστική δουλειά.

Εισαγωγή στη δομή της MySQL.

Ένας MySQL server αποτελείται από ένα σύνολο βάσεων δεδομένων (databases). Κάθε βάση δεδομένων είναι ένα σύνολο πινάκων (tables) παρόμοιων με αυτών που μπορείτε να φτιάξετε σε ένα πρόγραμμα spreadsheet όπως το Excel. Οι γραμμές του πίνακα ονομάζονται εγγραφές (records) και οι στήλες του πίνακα ονομάζονται πεδία (fields). Δεν υπάρχει ουσιαστικό όριο στην ποσότητα βάσεων που περιέχονται στον server, στην ποσότητα πινάκων που περιέχονται στις βάσεις μα ούτε και στην ποσότητα πεδίων και εγγραφών που περιέχονται στους πίνακες. Τα πεδία των πινάκων μπορούν να περιέχουν μόνο ένα συγκεκριμένο τύπο πληροφορίας ο οποίος ορίζεται κατά την δημιουργία του πίνακα. Για παράδειγμα ένα πεδίο που είναι ορισμένο ως ακέραιος αριθμός δεν είναι κατάλληλο για αποθήκευση δεκαδικού αριθμού ή κειμένου. Η δομή αυτή χρησιμοποιείται από όλα τα σύγχρονα συστήματα βάσεων δεδομένων και έχει αποδειχτεί πολύ πρακτική για την αποθήκευση τεράστιων όγκων δομημένης πληροφορίας.Η δομή ενός MySQL server με ένα απλό παράδειγμα. Εδώ ο server περιέχει 3 βάσεις δεδομένων αλλά έχουμε αναπτύξει μόνο τους 3 πίνακες της βάσης MoviesCollection. Προσέξτε ότι ενώ οι ταινίες του πίνακα Movies είναι 7, υπάρχουν μόνο 5 εγγραφές στον πίνακα Directors. Αναλογιστείτε γιατί συμβαίνει αυτό και μιας και σας βάλαμε σε σκέψη, σκεφτείτε και τον λόγο για τον οποίο χρησιμοποιήσαμε 3 πίνακες και όχι έναν. Ποια η χρησιμότητα του πίνακα MovDirLink; Πόσο σημαντικό είναι το πεδίο id του πίνακα Movies; Στα πεδία MovieName και ReleaseYear του πίνακα Movies επαναλαμβάνονται δύο φορές τα δεδομένα “The Italian Job” και 1994 αντίστοιχα. Μπορεί όμοια να υπάρχει δύο φορές ο ίδιος αριθμός στο πεδίο id ή θα υπάρξει πρόβλημα; Δείτε την ανάλογη εικόνα με το παράδειγμα  (στην οποία θα αναφερόμαστε σε όλη την διάρκεια αυτού του πρώτου μέρους του tutorial)  για να την κατανοήσετε καλύτερα. Επίσης δείτε στον πίνακα που ακολουθεί κάποιους από τους πιο βασικούς τύπους πεδίων.

Βασικοί τύποι πεδίων στην MySQL

Τύπος

Χρήση

Μέγεθος – Χαρακτηριστικά

ΤΙΝΥΙΝΤ, SMALLINT, MEDIUMINT, INT και BIGINT

Αποθήκευση ακέραιων αριθμών.

8,16,24,32 και 64 bits αντίστοιχα. Αν χρησιμοποιηθούν με την ιδιότητα UNSIGNED περιορίζονται σε αποθήκευση μη αρνητικών ακέραιων (φυσικών).
Π.χ. ένας TINYINT αριθμός παίρνει τιμές από -128 έως 127 δηλαδή έχει εύρος 2^8=256. Ένας TINYINT UNSIGNED δεν μπορεί να πάρει αρνητικό πρόσημο οπότε παίρνει τιμές από 0 έως 255 ώστε να διατηρηθεί το εύρος.

FLOAT και DOUBLE

Αποθήκευση αριθμών κινητής υποδιαστολής.

32 και 64 bits αντίστοιχα. Δεν μπορούν να είναι unsigned.

DATE

Αποθήκευση ημερομηνίας.

24bits. Μορφή: ΕΕΕΕ-ΜΜ-ΗΗ.

TIME

Αποθήκευση ώρας.

24bits. Μορφή: ΩΩΩ:ΛΛ:ΔΔ όπου η ώρα ΩΩΩ μπορεί να πάρει τιμές από -838 έως 838.

TIMESTAMP

Αυτόματη ή μη αυτόματη αποθήκευση ημερομηνίας και ώρας.

32bits. Μορφή: ΕΕΕΕ-ΜΜ-ΗΗ ΩΩ:ΛΛ:ΔΔ. Σε ένα πεδίο τύπου TIMESTAMP μπορεί να ανατεθεί χειροκίνητα μια τιμή. Διαφορετικά, αν την στιγμή που δημιουργούμε ή ενημερώνουμε μια εγγραφή που περιέχει ένα TIMESTAMP πεδίο παραλείψουμε να δώσουμε τιμή σε αυτό το πεδίο, θα του ανατεθεί αυτόματα η τιμή της τρέχουσας ημερομηνίας και ώρας.

CHAR(Μ) και VARCHAR(Μ)

Αποθήκευση μικρού αλφαριθμητικού (string).

Η παράμετρος M μπορεί να πάρει τιμή έως και 255 και υποδηλώνει τον μέγιστο αριθμό χαρακτήρων που θα έχει το string το οποίο έχουμε σκοπό να αποθηκεύσουμε στο πεδίο. Πεδία τύπου VARCHAR καταλαμβάνουν μνήμη ίση σε bytes όσοι και οι χαρακτήρες του string που περιέχουν, σε αντίθεση με τα μνημοβόρα πεδία τύπου CHAR που καταλαμβάνουν πάντα M bytes.

TEXT

Αποθήκευση κειμένου (μεγάλου αλφαριθμητικού).

Μέχρι 64kbytes.

Πίνακες και πρωτεύον κλειδί.

Σε κάθε πίνακα βάσης δεδομένων είναι σημαντικό να υπάρχει μια στήλη (πεδίο) σε κάθε σειρά της οποίας να υπάρχει διαφορετική τιμή έτσι ώστε κάθε εγγραφή να αποκτήσει ένα μοναδικό χαρακτηριστικό, έναν «αριθμό ταυτότητας» με τον οποίο να μπορούμε να αναφερόμαστε σε αυτήν. Το ιδιαίτερο αυτό πεδίο το ορίζουμε κατά την κατασκευή του πίνακα δίνοντάς του την ιδιότητα του πρωτεύοντος κλειδιού (primary key).
Για να κατανοήσετε καλύτερα την χρησιμότητα του πρωτεύοντος κλειδιού θα κάνουμε ένα παραλληλισμό του με τον αριθμό που χρησιμοποιείται στην αστυνομική σας ταυτότητα. Ο αριθμός αυτός είναι μοναδικός για κάθε πολίτη όπως ακριβώς το πεδίο του πρωτεύοντος κλειδιού έχει μοναδική τιμή για κάθε εγγραφή. Σκεφτείτε, λοιπόν, πόσο δύσκολο θα ήταν για έναν αστυνομικό να βρει την καρτέλα με τα στοιχεία ενός ατόμου αν δεν υπήρχε ο αριθμός ταυτότητας και ήταν αναγκασμένος να ψάξει το αρχείο της αστυνομίας με βάση το ονοματεπώνυμο. Πόσες συνωνυμίες θα έπρεπε να απορρίψει πριν φτάσει στο σωστό άνθρωπο;

Let’s cut to the chase.

Ανοίξτε μια κονσόλα για να ξεκινήσουμε. Μετακινηθείτε στον φάκελο bin της εγκατάστασης MySQL και εκτελέστε το MySQL monitor ως εξής:

c:
cd \xampp\mysql\bin
mysql –u root

Από εδώ μπορείτε να διαχειριστείτε με απλές εντολές ότι αφορά την mysql και τις βάσεις σας. Πληκτρολογήστε τις εντολές:

STATUS;
SHOW DATABASES;

Η πρώτη εντολή σας επιστρέφει πληροφορίες για την κατάσταση που βρίσκεται αυτήν την στιγμή ο server. Μεταξύ των πληροφοριών μπορείτε να δείτε την βάση την οποία έχετε επιλέξει για επεξεργασία. Ακόμα δεν έχετε επιλέξει κάποια βάση οπότε το ανάλογο πεδίο είναι κενό. Η δεύτερη εντολή σας επιστρέφει μια λίστα με βάσεις που υπάρχουν ήδη στο σύστημα. Αν και δεν έχετε δημιουργήσει ακόμα μια δική σας βάση, θα δείτε αρκετά αποτελέσματα καθώς το XAMPP εγκαθιστά μερικές μικρές demo βάσεις.
Προσέξτε πως οι εντολές στην MySQL τελειώνουν πάντα με τον χαρακτήρα τερματισμού «;». Ο χαρακτήρας αυτός είναι χρήσιμος όταν θέλετε να πληκτρολογήσετε μεγάλες σε μήκος εντολές. Μπορείτε οποιαδήποτε στιγμή κατά την πληκτρολόγηση μιας εντολής να πατήσετε το πλήκτρο Enter. H MySQL, εφόσον δεν έχετε εισάγει χαρακτήρα τερματισμού, δεν θα εκτελέσει την εντολή αλλά θα αλλάξει απλώς σειρά ώστε να συνεχίσετε να εισάγετε την μακροσκελή εντολή. Για να εκτελέσετε την εντολή, αφού έχετε τελειώσει την πληκτρολόγησή της, εισάγετε τον χαρακτήρα «;» και πατήστε Enter. Παρότι ορισμένες εντολές της MySQL, οι οποίες δεν αναμένεται να έχουν μεγάλο μήκος (όπως η STATUS) δεν απαιτούν χαρακτήρα τερματισμού για να εκτελεστούν, είναι καλό να συνηθίσετε να τερματίζετε όλες τις εντολές σας. Επίσης, έχετε στο νου σας ότι ενώ εμείς γράφουμε τις εντολές με κεφαλαία γράμματα ώστε να ξεχωρίζουν από τις παραμέτρους και τα ορίσματα, αυτό δεν είναι υποχρεωτικό στην MySQL.
Ήρθε η ώρα να δημιουργήσετε την πρώτη σας βάση. Πληκτρολογήστε:

CREATE DATABASE testDB;
SHOW DATABASES;

Η πρώτη εντολή έχει ως αποτέλεσμα την δημιουργία μιας νέας κενής βάσης με όνομα testDB. Χρησιμοποιήστε την δεύτερη για να επαληθεύσετε το αποτέλεσμα της πρώτης.
Ξέρουμε ότι είναι η πρώτη σας βάση και ότι είστε περήφανοι για αυτήν αλλά πρέπει να μάθετε και τον τρόπο διαγραφής μια βάσης οπότε πληκτρολογήστε:

DROP DATABASE testDB;
SHOW DATABASES;

Η πρώτη εντολή θα διαγράψει εντελώς την βάση testDB. Όσον αφορά την δεύτερη, μάλλον είστε πλέον σε θέση να μαντέψετε τα αποτελέσματά της.
Επειδή, για εκπαιδευτικούς σκοπούς, διαγράψατε την testDB πριν προλάβετε να την χρησιμοποιήσετε, δημιουργήστε μια νέα κενή βάση με όνομα MoviesCollection την οποία αργότερα θα «γεμίσετε» ώστε να αντικατοπτρίζει την βάση MoviesCollection της σχετικής εικόνας. Αφού δημιουργήσετε την νέα βάση, πληκτρολογήστε:

USE MoviesCollection;
STATUS;

Με την εντολή USE δηλώνετε την επιθυμία σας να χρησιμοποιήσετε την βάση MoviesCollection για επεξεργασία. Η STATUS απλά επιβεβαιώνει τα αποτελέσματα της USE αφού σας επιστρέφει μεταξύ άλλων και όπως ήδη αναφέραμε το όνομα της τρέχουσας βάσης (Current database).
Τώρα, η εντολή:

SHOW TABLES;

επιστρέφει μια λίστα με τους πίνακες της τρέχουσας βάσης. Όπως είναι αναμενόμενο, αφού δεν έχετε εισάγει ακόμα δεδομένα στην βάση σας, η λίστα αυτή είναι προς το παρόν κενή. Ας δημιουργήσουμε τον πίνακα Movies της εικόνας:

CREATE TABLE Movies
(id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
MovieName VARCHAR(200),
ReleaseYear SMALLINT UNSIGNED,
Rating TINYINT);

Παρατηρήστε ότι όλες αυτές οι γραμμές κώδικα συγκροτούν μια μόλις εντολή, την CREATE TABLE, η οποία τερματίζεται στην τελευταία γραμμή με τον χαρακτήρα τερματισμού (Το κάναμε αυτό για πρακτικούς λόγους αλλά εσείς αν θέλετε μπορείτε να δώσετε την εντολή σε μια γραμμή). Στην πρώτη γραμμή δίνουμε εντολή να δημιουργηθεί ο πίνακας Movies και στις επόμενες γραμμές, μέσα σε μια παρένθεση, περιγράφουμε τα πεδία του πίνακα.
Το πεδίο id δηλώθηκε ως ακέραιος 24bit χωρίς πρόσημο. Επίσης του δόθηκαν οι ιδιότητες PRIMARY KEY και AUTO_INCREMENT. Η πρώτη ιδιότητα χαρακτηρίζει το πεδίο ως πρωτεύον κλειδί και έτσι η MySQL δεν θα επιτρέψει ποτέ σε αυτό το πεδίο να πάρει ίδια τιμή σε δύο διαφορετικές εγγραφές. Και επειδή αυτό σας υποχρεώνει να ψάχνετε έναν ακέραιο που δεν έχει επαναληφθεί κάθε φορά που θέλετε να εισάγετε μια νέα εγγραφή στον πίνακα, έρχεται η ιδιότητα AUTO_INCREMENT να σας βοηθήσει. Η χρήση της ιδιότητας αυτής κατά την δήλωση ενός πεδίου σας επιτρέπει όταν θέλετε να εισάγετε εγγραφές στον πίνακα, να παραλείπετε -κατά βούληση- την εισαγωγή τιμής σε αυτό το πεδίο. Αν όντως επιλέξετε να κάνετε αυτήν την παράληψη, η MySQL θα αναθέσει αυτόματα τιμή στο πεδίο έναν αριθμό κατά μια μονάδα μεγαλύτερο από τον αριθμό που ανατέθηκε στο ίδιο πεδίο κατά την εισαγωγή της προηγούμενης εγγραφής. Για παράδειγμα αν στην πρώτη εγγραφή αναθέσετε την τιμή 13 στο πεδίο id ενώ κατά την δεύτερη εγγραφή παραλείψετε την χειροκίνητη ανάθεση τιμής στο ίδιο πεδίο, τότε η MySQL θα του δώσει αυτόματα την τιμή 14. Επίσης, έχετε υπόψη ότι δηλώνοντας το πεδίο id ως 24bit ακέραιο άνευ πρόσημου και ταυτόχρονα ως πρωτεύον κλειδί περιορίζετε ουσιαστικά το πλήθος των εγγραφών αυτού του πίνακα σε 2^24 (γεγονός όχι ιδιαίτερα περιοριστικό αν συγκρίνετε τον αριθμό αυτό με το πλήθος των κινηματογραφικών ταινιών παγκοσμίως ;-) ).
Όσον αφορά τα υπόλοιπα πεδία, το πεδίο MovieName δηλώθηκε ως αλφαριθμητικό με μέγιστο μήκος τους 200 χαρακτήρες και το πεδίο ReleaseYear δηλώθηκε ως ακέραιος των 16bits χωρίς πρόσημο, οπότε μπορεί να πάρει τιμές  από 0 έως 2^16-1=65535. Στο πεδίο Rating περιορίστηκε το εύρος του ακεραίου σε 8bit αλλά επιτράπηκε το αρνητικό πρόσημο ώστε να υπάρχει δυνατότητα αρνητικής βαθμολογίας των ταινιών. Έτσι το πεδίο Rating μπορεί να πάρει τιμές από -128 μέχρι 127.
Ο πίνακας Movies είναι έτοιμος για εισαγωγή δεδομένων. Χρησιμοποιήστε τις επόμενες εντολές για να ορίσετε και τους άλλους δύο πίνακες του παραδείγματός μας:

CREATE TABLE Directors
(id MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(120),
BirthYear SMALLINT UNSIGNED);
CREATE TABLE MovDirLink
(MovieID MEDIUMINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
DirectorID MEDIUMINT UNSIGNED);

Δοκιμάστε τώρα τις εντολές:

DESCRIBE Movies;
DESCRIBE Directors;
DESCRIBE MovDirLink;

Η εντολή DESCRIBE επιστρέφει τον τρόπο με τον οποίο είναι ορισμένος ένας πίνακας σε περίπτωση που το ξεχάσατε ή για επαλήθευση σωστού ορισμού. Αν λοιπόν ορίσατε κάποιον πίνακα λανθασμένα ή για οποιονδήποτε άλλο λόγο θέλετε να διαγράψετε ένα πίνακα (μαζί με όλα τα δεδομένα που περιέχει) μπορείτε να χρησιμοποιήσετε την εντολή:

DROP TABLE όνομα πίνακα;

Είναι ώρα να προσθέσετε εγγραφές στους πίνακες. Για να εισάγετε τις πρώτες δύο εγγραφές στον πίνακα Movies αντιγράφοντας τον πίνακα-δείγμα της εικόνας πληκτρολογήστε τα εξής:

INSERT INTO Movies VALUES
(621, “Forrest Gump”, 1994, 105);
INSERT INTO Movies VALUES
(NULL, ‘King Long’, 2005, 29);

Η χρήση της INSERT INTO είναι αρκετά προφανής και είστε πλέον σε θέση να αντιγράψετε πλήρως και τους τρεις πίνακες του παραδείγματος της εικόνας. Κάντε το. Παρατηρήστε ότι η MySQL δεν ενοχλείται είτε χρησιμοποιήσετε quotes (‘) είτε double-quotes (”) για την εισαγωγή αλφαριθμητικών. Αυτό θα φανεί ιδιαίτερα χρήσιμο στο τρίτο μέρος αυτού του tutorial όταν κώδικας MySQL θα μπλέξει με κώδικα PHP και ΗΤML tags. Προσέξτε επίσης ότι κατά την εισαγωγή της δεύτερης εγγραφής δεν χρειάστηκε να ανατεθεί χειροκίνητα τιμή στο πεδίο id καθώς η MySQL θα δώσει αυτόματα την τιμή 622 (621+1). Τέλος, παρότι σιχαινόμαστε να διορθώνουμε τα λάθη σας ;-) , παρατηρούμε ότι στην ίδια εγγραφή κάνατε ;-Ρ ένα λάθος πληκτρολόγησης στο όνομα της ταινίας. Διορθώστε το λάθος χρησιμοποιώντας την εντολή UPDATE:

UPDATE Movies SET MovieName=”King Kong” WHERE id=622;

Η εντολή UPDATE έχει την δυνατότητα να ενημερώσει ταυτόχρονα πολλές εγγραφές οπότε χρειάζεται ιδιαίτερη προσοχή στην υπόθεση που ακολουθεί μετά τον όρο WHERE. Με την συγκεκριμένη εντολή ζητάτε από την MySQL να ενημερώσει το πεδίο MovieName όλων των εγγραφών για τις οποίες ισχύει η υπόθεση id=622. Στην περίπτωση που παραλείψετε να γράψετε το WHERE id=622 όλες σας οι ταινίες θα μετονομαστούν σε King Kong. Μην ξεχνάτε λοιπόν να εισάγετε τον όρο WHERE και να προτιμάτε η υπόθεση που τον ακολουθεί να βασίζεται στο πρωτεύον κλειδί του πίνακα τον οποίο ενημερώνετε (όπως εδώ έγινε χρήση του πεδίου id) καθώς με αυτόν τον τρόπο είστε σίγουροι ότι ενημερώνετε ακριβώς τις εγγραφές που θέλετε.
Ας υποθέσουμε τώρα ότι θέλετε να διαγράψετε κάποιες εγγραφές από τον πίνακα Movies και ας υποθέσουμε περαιτέρω ότι οι εγγραφές αυτές είναι οι ταινίες που είτε είναι παλιές (εκδόθηκαν πριν το 1980) είτε δεν σας αρέσουν (έχουν αρνητικό rating). Χρησιμοποιήστε την εντολή:

DELETE FROM Movies WHERE ReleaseYear<1980 OR Rating>0;

Όπως βλέπετε η DELETE FROM έχει παρόμοια σύνταξη με την UPDATE και συνεπώς η χρήση της χρειάζεται την ίδια προσοχή. Επίσης, παρατηρήστε ότι μπορείτε να χρησιμοποιήσετε και άλλους τελεστές στην υπόθεση της WHERE πέρα από την ισότητα της υπόθεσης id=622. H MySQL υποστηρίζει όλους τους κοινούς τελεστές όπως τους =, <, >, OR, AND κ.α.
Με την DELETE ολοκληρώνεται το σετ εντολών που χρειάζεστε για να επεξεργαστείτε τις βάσεις σας και τους πίνακές σας. Ωστόσο, η εντολή που θα χρησιμοποιήσετε πιο συχνά από όλες τις άλλες είναι χωρίς αμφιβολία η SELECT, η οποία επιστρέφει -σύμφωνα με κάποια κριτήρια- πληροφορίες από τις βάσεις σας. Άλλωστε από την αρχή του tutorial πληκτρολογείτε εντολές χωρίς να είστε σε θέση να δείτε τα αποτελέσματα των εντολών σας και κατά πόσο αυτές ήταν αποτελεσματικές. Δώστε τέλος σε αυτή την κατάσταση πληκτρολογώντας:

SELECT * FROM Movies;
SELECT * FROM Directors;
SELECT * FROM MovDirLink;

Αυτές οι τρεις εντολές θα σας επιστρέψουν το πλήρες περιεχόμενο των πινάκων Movies, Directors και MovDirLink. Οι δύο τελευταίοι πίνακες θα πρέπει να είναι όπως ακριβώς στην εικόνα από όπου πήρατε τα δεδομένα ενώ από τον πίνακα Movies θα λείπουν οι εγγραφές με id 623 και 626 αφού τις διαγράψατε με την τελευταία DELETE FROM. Βέβαια η SELECT κάνει πολλά παραπάνω από το να επιστρέφει ολόκληρους πίνακες. Μια πιο παραμετροποιήσιμη σύνταξη της SELECT είναι:

SELECT όνομα_πεδίου1, όνομα_πεδίου2, όνομα_πεδίου3, ...
FROM όνομα_πίνακα
[WHERE υπόθεση]
[ORDER BY όνομα_πεδίου [DESC]];

Όπως γίνεται φανερό η SELECT έχει την δυνατότητα να επιστρέφει ένα υποσύνολο πεδίων, από ένα υποσύνολο εγγραφών ενός πίνακα. Για παράδειγμα, αν θέλετε να δείτε τα ονόματα μόνο των σκηνοθετών που γεννήθηκαν μετά το 1955 θα γράψετε:

SELECT Name FROM Directors WHERE BirthYear>1955;

Αν θέλετε επιπλέον τα αποτελέσματα να είναι ταξινομημένα κατά χρονολογία γέννησης σε αύξουσα ή φθίνουσα σειρά θα αλλάξετε την εντολή σε μια από τις δύο παρακάτω:

SELECT Name FROM Directors WHERE BirthYear>1955 ORDER BY BirthYear;
SELECT Name FROM Directors WHERE BirthYear>1955 ORDER BY BirthYear DESC;

Μπορείτε να χρησιμοποιήσετε ένα αστερίσκο (*) αντί μιας πλήρους λίστας πεδίων ώστε η SELECT να επιστρέψει ολόκληρες εγγραφές. Για παράδειγμα, οι δύο παρακάτω εντολές θα έχουν το ίδιο αποτέλεσμα:

SELECT id, Name, BirthYear FROM Directors WHERE BirthYear<1965;
SELECT * FROM Directors WHERE BirthYear<1965;

Τέλος, μια από τις πολλές ευελιξίες της MySQL είναι το γεγονός ότι τα αποτελέσματά μιας SELECT μπορούν να χρησιμοποιηθούν από μια υπόθεση WHERE σε μια εντολή UPDATE, DELETE ή και μια άλλη SELECT. Έτσι, στη δική μας βάση, μπορούμε να πληροφορηθούμε για την χρονολογία γέννησης του σκηνοθέτη της ταινίας Beowulf, πληροφορία που χρειάζεται δεδομένα από τρεις διαφορετικούς πίνακες, σε μια εντολή και χωρίς να πάρουμε περιττές πληροφορίες όπως το id της ταινίας και το id του σκηνοθέτη:

SELECT BirthYear FROM Directors WHERE id=
(SELECT DirectorID FROM MovDirLink WHERE MovieID=
(SELECT id FROM Movies WHERE MovieName=”Beowulf”));

Το MySQL Monitor που εκτελείται μέσα από κονσόλα σε γραμμή εντολών είναι ο κύριος τρόπος διαχείρισης ενός MySQL server. Στο στιγμιότυπο βλέπετε τα περιεχόμενα των πινάκων της βάσης-δείγμα MoviesCollection αμέσως μετά την συμπλήρωσή τους.Με αυτήν την παρατήρηση τελειώνει η εκμάθηση των κυριότερων εντολών MySQL. Με τις γνώσεις αυτές μπορείτε να δημιουργήσετε και να χειριστείτε αρκετά αποδοτικά απλές βάσεις όπως αυτή του παραδείγματός μας. Εφόσον αυτό που διαβάζετε είναι ένα tutorial και όχι εγχειρίδιο, έχετε υπόψη ότι δεν καλύφθηκαν όλες οι εντολές και οι τύποι πεδίων της MySQL. Αλλά ακόμη και οι εντολές που καλύφθηκαν μπορούν να πάρουν ακόμα πιο περίπλοκη μορφή ώστε να έχουν πιο αποδοτικά αποτελέσματα. Αν θέλετε να περισσότερες πληροφορίες , δεν έχετε παρά να επισκεφθείτε την επίσημη ιστοσελίδα της MySQL όπου θα βρείτε πλούσιο documentation.

Εναλλακτική διαχείριση βάσεων MySQL με το phpMyAdmin.

Επιστρέψτε στον browser σας, στον οποίο έχετε ανοιχτή την σελίδα που σας καλωσορίζει στο XAMPP. Το GUI του phpMyAdmin. Στο συγκεκριμένο screenshot μπορείτε να διακρίνετε την περιγραφή του πίνακα Movies της βάσης MoviesCollection. Στο MySQL Monitor για να δείτε τις ίδιες πληροφορίες πρέπει να χρησιμοποιήσετε την εντολή DESCRIBE.Στην αριστερή στήλη, κάτω από τον τίτλο Tools θα βρείτε ένα σύνδεσμο με όνομα phpMyAdmin. Ακολουθώντας τον σύνδεσμο θα ανοίξει μέσα στον browser το εργαλείο phpMyAdmin, το οποίο, όπως υπονοεί το όνομά του είναι μια εφαρμογή γραμμένη σε PHP για την διαχείριση του MySQL server μέσω περιβάλλοντος γραφικών. Δεδομένου ότι σπαταλήσατε χρόνο για να εξασκηθείτε και να κατανοήσετε πλήρως τις παραπάνω παραγράφους, είμαστε σίγουροι ότι θα βρείτε κατευθείαν τον δρόμο σας μέσα στις επιλογές του phpMyAdmin.
Παρά το γεγονός ότι ως xakers ;-) προτιμούμε πάντα την γραμμή εντολών, αναφέρουμε το phpMyAdmin αφού τα περισσότερα πακέτα Web Hosting δεν παρέχουν την δυνατότητα διαχείρισης των βάσεών μας μέσω κονσόλας τερματικού αλλά μόνο μέσω του phpMyAdmin. Έτσι, όταν δημιουργήσετε ένα project και αποφασίσετε να το δημοσιεύσετε online χρησιμοποιώντας τις υπηρεσίες κάποιου Web Host, οι γνώσεις που θα έχετε αποκομίσει από την τοπική χρήση του phpMyAdmin θα είναι ανεκτίμητες.
Σημειώστε ότι τo phpMyAdmin δεν είναι μέρος του πακέτου MySQL και πρέπει να το κατεβάσετε και να το εγκαταστήσετε ξεχωριστά, στην περίπτωση που δεν επιλέξατε το XAMPP σαν λύση.

Επίλογος.

Η δική μας δουλειά τελείωσε και η δική σας μόλις ξεκινάει. Επεκτείνετε την βάση MovieCollection με νέους πίνακες και πεδία ώστε να γίνει πρακτική. Φέρτε την στα μέτρα σας, εισάγετε τις ταινίες σας και κάντε την να δουλέψει για εσάς. Με μια εντολή μάθετε ποιές ταινίες από την συλλογή σας έχετε να δείτε εδώ και πολύ καιρό, ποιες είναι κωμωδίες, σε ποιες πρωταγωνιστεί ο αγαπημένος σας ηθοποιός και ποιες πληρούν όλα τα παραπάνω κριτήρια ταυτόχρονα. Μέχρι την δημοσίευση του δεύτερου μέρους αυτού του tutorial, όπου θα μάθετε να γράφετε κώδικα PHP, έχετε ένα μήνα καιρό να γίνετε Lord Of The Databases ;-).

7 Responses to “PHP & MySQL Tutorial – Η Συντροφιά του Δαχτυλιδιού”

  1. sotiris stilianos | 01/08/2011 at 07:58

    ωραίο το tutorial αλλά υπάρχει και πιο εύκολος τρόπος στα windowze με το πρόγραμμα easyphp!

    • subZraw | 01/08/2011 at 08:18

      Ναι, σίγουρα υπάρχει. Να σημειώσω μόνο ότι, σύμφωνα και με το πνεύμα του hacking, ο ευκολότερος τρόπος δεν είναι πάντα κι ο καλύτερος :)

    • praeto | 01/08/2011 at 22:51

      Υπάρχουν δεκάδες AMP stacks. Η επιλογή του XAMPP έγινε καθαρά για λόγους ομοιομορφίας καθώς διαθέτει έκδοση για κάθε major OS.

      Για τα δικά μου γούστα, λόγου χάρη, δεν θα χρησιμοποιούσα καν Apache. Και εδώ που τα λέμε θα προτιμούσα και PostgreSQL αντί για MySQL. Αλλά δεν είναι τα γούστα του καθενός το θέμα μας, είναι;

  2. MortisGR | 01/08/2011 at 17:05

    Kαλησπέρα και καλό μήνα. 2 πραγματάκια θέλω να ρωτήσω.
    1.) Υπάρχει τρόπος να μετονομάσω κάποιο πεδίο ενός πίνακα, που εκ παραδρομής διαπίστωσα ότι ήταν λάθος (ορθογραφικό λαθος :S).
    2.) Η εντολή που δίνουμε για επιλεκτική διαγραφή είναι αλήθεια πως με μπέρδεψε, δεν ξέρω αν είναι γραμμένη λάθος, περιέχει κάτι παραπάνω (DELETE FROM Movies WHERE ReleaseYear<1980 OR Rating>0;) Τι είναι το “<“? (επίσης έτσι διαγράφονται αυτές με rating *πάνω* από 0 ;-)

    Ευχαριστώ.

    • subZraw | 01/08/2011 at 17:34

      Ναι, μπορείς ν’ αλλάξεις όποιο πεδίο θέλεις. Επίσης, οι έξτρα χαρακτήρες που εντόπισες είναι HTML entities που από λάθος μπήκαν στο κείμενο (τα διόρθωσα ήδη). Για περισσότερες λεπτομέρειες όμως θα πρέπει να περιμένεις το συγγραφέα του άρθρου, ο οποίος για λίγες μέρες θα λείπει σε άδεια. Δεν θα ‘ταν σωστό να επέμβω εγώ, αν και είμαι βέβαιος ότι μέχρι ν’ απαντήσει ο praeto θα ‘χεις βρει μόνος σου τη λύση :)

    • praeto | 01/08/2011 at 22:44

      1) Μετονομασία στήλης μπορεί να γίνει εύκολα με μια εντολή ALTER TABLE. Γκούγκλαρε “mysql rename table column” and you shall find. :)

      2) Μετά την διόρθωση του λάθους πρέπει να ξεκαθάρισε το θέμα φαντάζομαι. Και ναι, η εντολή διαγράφει ταινίες με rating μεγαλύτερο από 0, το οποίο έχει νόημα εφόσον το rating δέχεται αρνητικές τιμές.

  3. Mr_Root | 06/04/2013 at 15:56

    Πρώτη μου επαφή με το αντικείμενο και έχω κάποια προβληματάκια.
    Εστησα το lampp σε linux mint.
    Ξεκινάω το lampp με sudo /opt/lampp/lampp start
    Επειτα ξεκινάω την mysql με /opt/lampp/bin/mysql
    Το status και το show databases μου απαντάει κανονικά
    αλλά όταν πάω να δημιουργήσω μια καινούργια βάση μου λέει ότι δεν έχω τα απαραίτητα δικαιώματα.
    mysql> CREATE DATABASE testDB;
    ERROR 1044 (42000): Access denied for user ”@’localhost’ to database ‘testDB’
    mysql>

    ή
    mysql> mysql -u root
    -> status;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘mysql -u root
    status’ at line 1
    mysql>

    Εχω βάλει κωδικούς για ροοτ στην mysql κκαι στο lampp gia ton default χρηστη.

    Επίσης αν ξέρει κάποιος να μου πει που πρέπει να κάνω ξεζιπάρισμα το drupal για να το στήσω τοπικά στο pc μου.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων