Το σύστημα βάσεων δεδομένων...

43
MySQL - PHP Ιωάννης Γ. Τσούλος Το σύστημα βάσεων δεδομένων MySQL 1. Εισαγωγή H mysql είναι ένα ελεύθερο σύστημα διαχειρίσεως βάσεων δεδομένων που είναι ευρύτατα διαδεδομένη στα UNIX συστήματα, αν και τα τελευταία χρόνια δείχνει να κατακτά και τον κόσμο των Win32. Οι ενδιαφερόμενοι μπορούν να βρουν την τελευταία έκδοση στο www.mysql.com H mysql είναι πολυνηματική και πολυχρηστική και υποστηρίζει τα τελευταία standards της SQL. Στην αναφορά που κρατάτε στα χέρια σας δεν θα κάνουμε κάποια λεπτομερή παρουσίασή της καθώς κάτι τέτοιο απαιτεί πάρα πολλές σελίδες. Απλά θα δώσουμε τις βασικές της αρχές και τις σημαντικότερες εντολές της προκειμένου να φτιάξουμε γρήγορα και εύκολα απλές και λειτουργικές βάσεις δεδομένων. Τα πειράματα που παρουσιάζονται παρακάτω έγιναν σε RedHat Linux 7.2 και 7.3 που χρησιμοποιεί την έκδοση 3.23.41 της MySQL. Φυσικά αυτό δεν περιορίζει σε τίποτα την γενικότητα των παραδειγμάτων που ακολουθούν 2. Είσοδος Για να ξεκινήσουμε την mysql σαν απλοί χρήστες αρκεί να γράψουμε mysql σε ένα τερματικό. Αν λάβουμε το μήνυμα ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) σημαίνει πως η mysql δεν τρέχει ή καλύτερα ο εξυπηρέτης της δεν εκτελείται. Είναι απαραίτητο για να μπορούμε να μπούμε στην mysql να εκτελείται ήδη ο εξυπηρέτης της μιας και η βάση είναι όχι μόνον πολυχρηστική αλλά επιτρέπει και την σύνδεση από άλλα μηχανήματα. Αν λοιπόν εμφανιστεί ένα μήνυμα σαν και το παραπάνω θα πρέπει ο διαχειριστής του μηχανήματος (root) να ξεκινήσει τον εξυπηρέτη (σε redhat αρκεί η εντολή /etc/rc.d/init.d/mysql restart). Αν και στο internet υπάρχουν διαθέσιμα πολλές γραφικές διαπροσωπείες για την mysql, ο καλύτερος τρόπος να ξεκινήσει κανείς μαζί της είναι με την χρήση εντολών σε τερματικό. Αν θέλουμε να δούμε κάποια βοήθεια απλά δίνουμε \h και αν θέλουμε να τερματίσουμε την σύνοδο δίνουμε \q. 3. Δημιουργία βάσεων δεδομένων Για να φτιάξουμε μία νέα βάση δεδομένων πρέπει να έχουμε δικαίωμα από τον διαχειριστή να το κάνουμε. Σε Linux συστήματα αυτό συνήθως δεν γίνεται. Δικαιώματα δημιουργίας και διαγραφής σε μία βάση δεδομένων έχει μόνον ο υπερχρήστης. Για να δημιουργήσει ο υπερχρήστης μία νέα βάση δεδομένων αρκεί να δώσει create database name; όπου το name είναι το όνομα της βάσεως. Στην συνέχεια θα πρέπει να δώσει ΣΕΛΙΔΑ 1/43

Transcript of Το σύστημα βάσεων δεδομένων...

MySQL - PHPΙωάννης Γ. Τσούλος

Το σύστημα βάσεων δεδομένων MySQL

1. ΕισαγωγήH mysql είναι ένα ελεύθερο σύστημα διαχειρίσεως βάσεων δεδομένων που είναι ευρύτατα διαδεδομένη στα UNIX συστήματα, αν και τα τελευταία χρόνια δείχνει να κατακτά και τον κόσμο των Win32. Οι ενδιαφερόμενοι μπορούν να βρουν την τελευταία έκδοση στο www.mysql.com H mysql είναι πολυνηματική και πολυχρηστική και υποστηρίζει τα τελευταία standards της SQL. Στην αναφορά που κρατάτε στα χέρια σας δεν θα κάνουμε κάποια λεπτομερή παρουσίασή της καθώς κάτι τέτοιο απαιτεί πάρα πολλές σελίδες. Απλά θα δώσουμε τις βασικές της αρχές και τις σημαντικότερες εντολές της προκειμένου να φτιάξουμε γρήγορα και εύκολα απλές και λειτουργικές βάσεις δεδομένων. Τα πειράματα που παρουσιάζονται παρακάτω έγιναν σε RedHat Linux 7.2 και 7.3 που χρησιμοποιεί την έκδοση 3.23.41 της MySQL. Φυσικά αυτό δεν περιορίζει σε τίποτα την γενικότητα των παραδειγμάτων που ακολουθούν

2. ΕίσοδοςΓια να ξεκινήσουμε την mysql σαν απλοί χρήστες αρκεί να γράψουμε mysql σε ένα τερματικό. Αν λάβουμε το μήνυμα

ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

σημαίνει πως η mysql δεν τρέχει ή καλύτερα ο εξυπηρέτης της δεν εκτελείται. Είναι απαραίτητο για να μπορούμε να μπούμε στην mysql να εκτελείται ήδη ο εξυπηρέτης της μιας και η βάση είναι όχι μόνον πολυχρηστική αλλά επιτρέπει και την σύνδεση από άλλα μηχανήματα. Αν λοιπόν εμφανιστεί ένα μήνυμα σαν και το παραπάνω θα πρέπει ο διαχειριστής του μηχανήματος (root) να ξεκινήσει τον εξυπηρέτη (σε redhat αρκεί η εντολή /etc/rc.d/init.d/mysql restart).

Αν και στο internet υπάρχουν διαθέσιμα πολλές γραφικές διαπροσωπείες για την mysql, ο καλύτερος τρόπος να ξεκινήσει κανείς μαζί της είναι με την χρήση εντολών σε τερματικό. Αν θέλουμε να δούμε κάποια βοήθεια απλά δίνουμε \h και αν θέλουμε να τερματίσουμε την σύνοδο δίνουμε \q.

3. Δημιουργία βάσεων δεδομένωνΓια να φτιάξουμε μία νέα βάση δεδομένων πρέπει να έχουμε δικαίωμα από τον διαχειριστή να το κάνουμε. Σε Linux συστήματα αυτό συνήθως δεν γίνεται. Δικαιώματα δημιουργίας και διαγραφής σε μία βάση δεδομένων έχει μόνον ο υπερχρήστης. Για να δημιουργήσει ο υπερχρήστης μία νέα βάση δεδομένων αρκεί να δώσει

create database name;

όπου το name είναι το όνομα της βάσεως. Στην συνέχεια θα πρέπει να δώσει

ΣΕΛΙΔΑ 1/43

δικαιώματα και σε μας με την χρήση της εντολής

grant all on name.* to user;

Αφού γίνουν όλα αυτά για να χρησιμοποιήσουμε μία βάση δεδομένων απαιτείται να δώσουμε την εντολή use name στην γραμμή εντολών της mysql. Αν την πρώτη φορά που ζητήσουμε να χρησιμοποιήσουμε την βάση πάρουμε ένα μήνυμα λάθους σχετικά με δικαιώματα, τότε μπορούμε να εισάγουμε την εντολή connect name και ύστερα use name και το πρόβλημα έχει λυθεί. Αν όλα τα παραπάνω ακούγονται πολύπλοκα μπορούμε να χρησιμοποιήσουμε την προκαθορισμένη βάση δεδομένων test, για την οποία δεν χρειάζεται να ζητήσουμε κάτι από τον διαχειριστή συστήματος. Ωστόσο είναι κοινή βάση και έτσι ότι φτιάξουμε στην συνέχεια θα μπορούν να το δουν και να το αλλάξουν και άλλοι χρήστες του συστήματος.

4. Δημιουργία πινάκωνΑφού συνδεθούμε σε μία βάση δεδομένων το επόμενο βήμα είναι να κάνουμε κάποια εργασία σε πίνακες που διαθέτει. Αν δεν έχει πίνακες μπορούμε να φτιάξουμε με την εντολή create table. Αν για παράδειγμα θέλουμε ένα πίνακα για την περιγραφή φοιτητών μπορούμε να γράψουμε:

create table student(name varchar(20), lastname varchar(20), code int);

5. Εισαγωγή δεδομένωνΗ εισαγωγή δεδομένων στην βάση μπορεί να γίνει είτε με την εντολή insert είτε από κάποιο αρχείο. Με την εντολή insert μπορούμε να γράψουμε για το παράδειγμα του πίνακα φοιτητών:

insert into student(name,lastname,code) values('giannis','papadopoulos',122);

Αν έχουμε να περάσουμε κάποιες χιλιάδες ονόματα η παραπάνω διαδικασία γίνεται κουραστική. Αυτό που μπορούμε να κάνουμε είναι να γράψουμε τις πλειάδες που θέλουμε σε ένα αρχείο κειμένου, έστω students.txt, και στην συνέχεια να φορτώσουμε αυτά τα στοιχεία στην βάση δεδομένων

load data local infile 'students.txt' into table student;

Στο αρχείο δεδομένων τα πεδία στην κάθε πλειάδα χωρίζονται μεταξύ τους με TAB.

6. Ενημέρωση δεδομένωνΠολλές φορές χρειάζεται να αλλάξουμε κάποια από τα δεδομένα που έχουμε εισάγει νωρίτερα σε κάποιον πίνακα. Η αλλαγή αυτή γίνεται με την χρήση της εντολής update. Για το παράδειγμα των φοιτητών που είδαμε προηγουμένως μία έγκυρη εντολή ενημερώσεως θα μπορούσε να είναι:

update students set name='kostas' where name='giannis';

7. ΕρωτήματαΗ εντολή που χρησιμοποιούμε για να εκτελέσουμε κάποια ερωτήματα σε μία βάση δεδομένων είναι η select. Η πλήρης (όσο γίνεται) σύνταξή της είναι

ΣΕΛΙΔΑ 2/43

select field1, field2,...

from tablename

where boolean – condition;

7.1 Όλα τα δεδομέναΓια να πάρουμε όλα τα δεδομένα από έναν πίνακα χρησιμοποιούμε την σύνταξη

select * from tablename;

7.2 Συγκεκριμένες πλειάδεςΓια να ανακτήσουμε συγκεκριμένες πλειάδες από έναν πίνακα αρκεί να ορίσουμε κάποια λογική συνθήκη στην ενότητα where της εντολής select. Για παράδειγμα για να εμφανίσουμε τους φοιτητές με κωδικό μεγαλύτερο του 500 γράφουμε

select *

from student

where code>500;

7.3 Συγκεκριμένες στήλεςΓια να επιλέξουμε συγκεκριμένες στήλες από έναν πίνακα πρέπει να προσδιορίσουμε τις στήλες αυτές στην κεφαλή του select. Για παράδειγμα για να εμφανίσουμε μόνον τα ονόματα των φοιτητών γράφουμε:

select name

from student;

7.4 Ταξινόμηση πλειάδωνΕίναι χρήσιμο στην έξοδο των αποτελεσμάτων από μία επιλογή να δούμε τα αποτελέσματα ταξινομημένα προκειμένου να αποφασίσουμε πιο εύκολα. Αυτό γίνεται βάζοντας το επίθεμα ORDER BY COLUMN στο τέλος της εντολής select. Column είναι το όνομα του πεδίου κατά το οποίο επιθυμούμε ταξινόμηση. Για παράδειγμα αν θέλουμε να ταξινομήσουμε τους φοιτητές ως προς το επίθετό τους γράφουμε:

select *

from student

order by lastname;

7.5 Ταίριασμα προτύπωνΜε το ταίριασμα προτύπων κάνουμε πράξεις μεταξύ αλφαριθμητικών προκειμένου να βρίσκουμε πλειάδες στις οποίες υπάρχει ταίριασμα κάποιου ονόματος με ένα συγκεκριμένο πρότυπο αλφαριθμητικού. Για παράδειγμα για να βρούμε όλους τους φοιτητές που το όνομά τους τελειώνει σε 'ΟΣ' μπορούμε να γράψουμε

select *

ΣΕΛΙΔΑ 3/43

from student

where name like '%ΟΣ';

Το σύμβολο % συμβολίζει το οτιδήποτε.

8. ΔιαγραφήΓια να διαγράψουμε κάποιες πλειάδες από μία βάση δεδομένων πρέπει να χρησιμοποιήσουμε την εντολή delete, που συντάσσεται ως εξής:

delete from tablename where condition;

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

delete from student where code<0;

Αν θέλουμε να διαγράψουμε ολόκληρο τον πίνακα student, τότε δίνουμε

drop table student;

ΣΕΛΙΔΑ 4/43

Η γλώσσα PHP

1. ΕισαγωγήPhp είναι ακρωνύμιο για το Php Hypertext Preprocessor, το οποίο φυσικά είναι μία επαναλαμβανόμενη ακολουθία του ίδιου του ονόματος. Ουσιαστικά πρόκειται για μια γλώσσα script που εκτελείται στην μεριά του διακομιστή σελιδών. Για να δούμε με τι μοιάζει μπορούμε να μελετήσουμε το επόμενο παράδειγμα:

<html>

<head>

<title> Βασική Σελίδα </title>

</head>

<body>

<?

echo “ΓΕΙΑ ΣΑΣ ΑΠΟ ΤΗΝ PHP”;

?>

</body>

</html>

Όπως μπορούμε να καταλάβουμε με μία πρώτη ανάγνωση του κώδικα η PHP περικλείεται μέσα σε κώδικα HTML με την χρήση των TAGS <? ?>. Σκοπός της PHP είναι να δώσει ζωντάνια σε έναν στατικό κώδικα HTML, ώστε να μπορούμε μέσα από απλές σελίδες να εκτελούμε και κώδικα που να προσαρμόζεται στις απαιτήσεις του χρήστη. Οι σελίδες PHP επειδή εκτελούνται από τον server δεν τις ανοίγουμε ποτέ σαν απλά έγγραφα από τον φυλλομετρητή που χρησιμοποιούμε, αλλά πρέπει να συνδεθούμε μέσω του φυλλομετρητή στον απομακρυσμένο διακομιστή σελιδών και να ζητήσουμε την εκτέλεση της σελίδας. Αν λοιπόν ο χρήστης user έχει στον φάκελο public_html στον κόμβο www.teiep.gr την σελίδα first.php για να την δούμε θα πρέπει να δώσουμε στο πεδίο διευθύνσεως του φυλλομετρητή μας http://www.teiep.gr/~user/first.php Αν από την άλλη δεν έχουμε μόνιμη σύνδεση στο INTERNET (μόνιμο ΙΡ) και θέλουμε απλώς να δοκιμάσουμε μία σελίδα στο μηχάνημα που βρισκόμαστε, τότε πολύ απλά δίνουμε στο πεδίο διευθύνσεως του φυλλομετρητή http://localhost/~user/first.php Στην επόμενη ενότητα θα μελετήσουμε τα βασικά στοιχεία της γλώσσας.

2. Βασικά στοιχεία της γλώσσας

2.1 Βασική ΣύνταξηΓια να μπορέσουμε να γράψουμε κώδικα PHP που να εκτελείται θα πρέπει να

ΣΕΛΙΔΑ 5/43

περικλείεται στα TAGS που είδαμε στην προηγούμενη ενότητα. Επιπλέον οι εντολές που υπάρχουν σε μία ενότητα PHP διαχωρίζονται μεταξύ τους με το Ελληνικό ερωτηματικό (;) ακριβώς όπως θα κάναμε και στην γλώσσα C. Έτσι το επόμενο παράδειγμα

<html>

<head>

<title> Βασική Σελίδα </title>

</head>

<body>

<?

echo “ΓΕΙΑ ΣΑΣ ΑΠΟ ΤΗΝ PHP”;

echo “Αυτό είναι το δεύτερο μήνυμα”;

?>

</body>

</html>

περιέχει μία ενότητα PHP με 2 εντολές σε αυτήν. Εδώ θα πρέπει να πούμε πως η εντολή echo τυπώνει στην σελίδα HTML στην θέση που βρισκόμαστε το κείμενο που υπάρχει μέσα στα διπλά εισαγωγικά. Αν λοιπόν ανοίξουμε την παραπάνω σελίδα θα δούμε στην οθόνη το κείμενο

ΓΕΙΑ ΣΑΣ ΑΠΟ ΤΗΝ ΡΗΡΑυτό είναι το δεύτερο μήνυμα.

Στην παραπάνω έξοδο δεν υπάρχει κανένα λάθος. Και τα δύο μηνύματα εμφανίστηκαν το ένα μετά το άλλο και δεν υπήρξε αλλάγή γραμμής ανάμεσά τους. Αν θέλουμε να γίνει κάτι τέτοιο, τότε θα πρέπει να ενσωματώσουμε το TAG <BR> μέσα στο κείμενο που θα εκτυπώσουμε. Έτσι λοιπόν η ενότητα κώδικα

echo “MHNYMA1<BR>”;

echo “MHNYMA2”;

θα τυπώσει

MHNYMA1

MHNYMA2

Φυσικά από την στιγμή που μπορούμε να ενσωματώσουμε ένα TAG μπορούμε να ενσωματώσουμε οποιοδήποτε άλλο. Η επόμενη ενότητα κώδικα

echo “MHNYMA1<BR>”;

echo “<B>MHNYMA2</B>;

θα τυπώσει

ΜΗΝΥΜΑ1

ΜΗΝΥΜΑ2

ΣΕΛΙΔΑ 6/43

Ένα άλλο βασικό στοιχείο σε γλώσσες προγραμματισμού είναι ο σχολιασμός κώδικα. Στην PHP αυτό γίνεται με την χρήση των σχολίων που συναντάμε στην C++. Έτσι τα σχόλια μπορούν να βρίσκονται μετά από // ή ακόμα και να περικλείονται μέσα σε /* */.

2.2 Μεταβλητές

2.2.1 Ονοματολογία

Αν οι δυνατότητες της PHP περιορίζονταν στο να γράφει απλώς κείμενο επί της οθόνης , τότε δεν θα ήταν περισσότερο χρήσιμη από ότι η απλή HTML. Ωστόσο πρόκειται για μία γλώσσα προγραμματισμού και σαν τέτοια έχει και μεταβλητές και τελεστές αλλά και δομές ελέγχου. Οι μεταβλητές στην PHP ξεκινούν πάντα με το σύμβολο $ ακολουθούμενο από ένα όνομα με λατινικά γράμματα, αριθμούς και _ που πρέπει να ξεκινά με γράμμα ή κάτω παύλα. Έτσι έγκυρα ονόματα είναι $i, $kala, $var11, $_ab κτλ Τέλος πρέπει να επισημανθεί πως η γλώσσα θεωρεί διαφορετικές μεταβλητές αυτές που γράφονται με πεζά ή κεφαλαία γράμματα. Έτσι οι μεταβλητές $a και $Α δεν είναι ίδιες.

2.2.2 Τύποι δεδομένων

Τυπικά η γλώσσα έχει τους ακόλουθους τύπους δεδομένων

1. Boolean

2. Integer

3. Double

4. String

Ωστόσο δεν παρέχεται στον προγραμματιστή κάποιος άμεσος τρόπος ώστε να δηλώσει μία μεταβλητή με κάποιον από τους παραπάνω τύπους. Η ανάθεση σε μία μεταβλητή μίας τιμής κατευθύνει τον διερμηνευτή, ώστε να καταλάβει ποιος είναι ο απαιτούμενος τύπος. Έστω η επόμενη ενότητα κώδικα

<%

$a=1;

$b=TRUE;

$c=2.2;

$d=”good morning”;

%>

Δημιουργεί τέσσερις μεταβλητές, την a με ακέραιο τύπο, την b με boolean τύπο, την c με τύπο πραγματικών αριθμών και τέλος την d με τύπο αλφαριθμητικού. Ωστόσο καμία μεταβλητή δεν δεσμεύεται στατικά με έναν τύπο παρά μόνον στην ανάθεση. Έτσι αν στην ίδια ενότητα κώδικα με την προηγούμενη ή σε κάποια άλλη υπάρχει η ανάθεση $d=-1.7, τότε δεν θα προκληθεί κάποιο λάθος και απλά ο νέος τύπος για την μεταβλητή $d είναι double.

ΣΕΛΙΔΑ 7/43

2.2.3 Μεταβλητές του Apache

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

1. $SERVER_NAME Είναι το όνομα του διακομιστή σελιδών που μας διερμηνεύει τις σελίδες. Σε μηχάνημα χωρίς δίκτυο επιστρέφει localhost.localdomain

2. $REQUEST_METHOD Επιστρέφει την μέθοδο που χρησιμοποιήθηκε για την πρόσβαση στην σελίδα, αν αυτό έγινε με την χρήση κάποιας φόρμας. Πιθανές τιμές αυτής της μεταβλητής είναι GET, HEAD, POST, PUT

3. $QUERY_STRING Επιστρέφει τα QUERY_STRINGS που βρίσκονται στην γραμμή διευθύνσεων του φυλλομετρητή. Αν για παράδειγμα έχουμε γράψει

http://localhost/~user/page1.php?a=1

τότε $QUERY_STRING=”a=1” Από την άλλη αν έχουμε δώσει την διεύθυνση

http://localhost/~user/page1.php?a=1&b=2

τότε $QUERY_STRING=”a=1&b=2”

4. $HTTP_USER_AGENT Επιστρέφει σε μορφή αλφαριθμητικού πληροφορία για τον φυλλομετρητή που χρησιμοποιούμε για να δούμε την συγκεκριμένη σελίδα. Για παράδειγμα σε PC με Linux και φυλλομετρητή Konqueror επεστράφη η ακόλουθη πληροφορία

Mozilla/5.0 (compatible; Konqueror/3.0.0; Linux)

5. $REMOTE_ADDR Μας δίνει την διεύθυνση (ΙΡ) από την οποία βλέπουμε την συγκεκριμένη σελίδα. Αν φυσικά χρησιμοποιούμε το localhost θα μας επιστρέψει 127.0.0.1

6. $SCRIPT_FILENAME Μας δίνει υπό την μορφή απόλυτης διαδρομής το μονοπάτι προς το εκτελούμενο script. Παράδειγμα τιμής είναι το /home/user/public_html/page1.php

7. $SCRIPT_NAME Μας δίνει υπό την μορφή διαδρομών του διακομιστή το μονοπάτι προς το εκτελούμενο script. Για το προηγούμενο παράδειγμα επιστρέφει /~user/page1.php

2.2.4 Ανάκτηση Query Strings

Πολλές φορές θα έχουμε προσέξει πως στο Internet μια σελίδα δεν εμφανίζεται απλώς με το όνομά της, αλλά και με διάφορα QUERY STRINGS που την ακολουθούν στο πεδίο διευθύνσεως του φυλλομετρητή. Για παράδειγμα η αναφορά στην σελίδα

http://localhost/~user/page1.php?a=1&b=2

αναφέρεται στην σελίδα page1.php και της περνά σαν πληροφορία δύο query strings, το a με τιμή 1 και το b με τιμή 2. Τα δύο query strings δεν είναι απαραίτητο πως θα χωρίζονται πάντα με &. Πολλές φορές μπορεί να

ΣΕΛΙΔΑ 8/43

χρησιμοποιούμε και το % χωρίς περιορισμό. Ωστόσο στα παραδείγματα αυτού του κειμένου χρησιμοποιούμε το &. Στο επόμενο παράδειγμα παίρνουμε δύο παραμέτρους στην σελίδα μας και τα εκτυπώνουμε μέσα σε αυτήν

<html>

<head>

<title> ΣΕΛΙΔΑ </title>

</head>

<body>

<?

$a=$_GET['a'];

$b=$_GET['b'];

echo “Η ΠΡΩΤΗ ΠΑΡΑΜΕΤΡΟΣ ΕΙΝΑΙ $a<BR>”;

echo “Η ΔΕΥΤΕΡΗ ΠΑΡΑΜΕΤΡΟΣ ΕΙΝΑΙ $b<BR>”;

?>

</body>

</html>

Φυσικά θα πρέπει να χρησιμοποιήσουμε τα QUERY STRINGS a και b προκειμένου να δούμε τις τιμές τους από τις δύο echo εντολές. Για την προηγούμενη σελίδα θα τυπώσει στο παράθυρο του φυλλομετρητή

Η ΠΡΩΤΗ ΠΑΡΑΜΕΤΡΟΣ ΕΙΝΑΙ 1

Η ΔΕΥΤΕΡΗ ΠΑΡΑΜΕΤΡΟΣ ΕΙΝΑΙ 2

Για να εκτυπώσουμε τις τιμές παραμέτρων μέσα από την echo αρκεί να παρεμβάλλουμε τα ονόματα των μεταβλητών στο σημείο που θέλουμε.

2.2.5 Ανάκτηση πεδίων φόρμας

Ένα άλλο σημαντικό στοιχείο στον προγραμματισμό σελιδών είναι η επικοινωνία μεταξύ σελιδών με την χρήση φορμών. Η ανάκτηση των τιμών των πεδίων των φορμών γίνεται πολύ απλά με το όνομα των πεδίων ακριβώς όπως κάναμε προηγουμένως και με τα QUERY STRINGS, αλλά με χρήση του πίνακα $_POST αντί για τον πίνακα $_GET. Στο επόμενο παράδειγμα εισάγουμε στην φόρμα το όνομα και το επίθετο ενός ατόμου και στην δεύτερη σελίδα τα εμφανίζουμε στην οθόνη του φυλλομετρητή.

form1.html

<html>

<head>

<title> ΣΕΛΙΔΑ ΕΙΣΑΓΩΓΗΣ </title>

</head>

<body>

ΣΕΛΙΔΑ 9/43

<form method=”post” action=”page1.php”>

ΟΝΟΜΑ:<input type=”text” name=”name”>

<BR>

ΕΠΙΘΕΤΟ:<input type=”text” name=”lastname”>

<BR>

<input type=”submit” value=”send”>

</form>

</body>

</html>

page1.php

<html>

<head>

<title> ΔΕΥΤΕΡΗ ΣΕΛΙΔΑ </title>

</head>

<body>

<?

$name=$_POST['name'];

$lastname=$_POST['lastname'];

echo "ΤΟ ΟΝΟΜΑ ΣΑΣ ΕΙΝΑΙ $name <BR>";

echo "ΤΟ ΕΠΙΘΕΤΟ ΣΑΣ ΕΙΝΑΙ $lastname <BR>";

?>

</body>

</html>

2.2.6 Ανάκτηση τιμών λίστας

Σε πολλές περιπτώσεις θα χρειαστεί να φτιάξουμε πτυσσόμενες λίστες προκειμένου να παρέχουμε στον χρήστη την δυνατότητα να επιλέξει από μία σειρά επιλογών. Στην επόμενη φόρμα φτιάχνουμε μία λίστα επιλογών για τις τέσσερις βασικές αριθμητικές πράξεις:

<html>

<head>

<title>

TEST PAGE

</title>

</head>

ΣΕΛΙΔΑ 10/43

<body>

<form method=”post” action=”test1.php”>

ΠΡΑΞΕΙΣ:<select name=”list”>

<option> add</option>

<option> sub </option>

<option> mult </option>

<option> div </option>

</select>

<br>

<input type=”submit” value=”ok”>

</form>

</body>

</html>

Για να φτιάξουμε μία λίστα χρησιμοποιούμε το tag select και με το πεδίο name δίνουμε ένα όνομα στην λίστα. Αυτό το όνομα είναι ιδιαίτερα σημαντικό, καθώς η PHP θα χρησιμοποιήσει μία μεταβλητή με αυτό το όνομα προκειμένου να αναφερθεί στο επιλεγμένο στοιχείο της λίστας. Οι επιλογές της λίστες μπαίνουν πάντα ανάμεσα στα tag <select> </select> με την βοήθεια του tag <option>. Ανάμεσα στα <select> </select> δεν μπορεί να μπει τίποτα άλλο παρά μόνον επιλογές με <option> και τίποτα άλλο. Μία απλή σελίδα η οποία εμφανίζει την τιμή που επιλέξαμε από την λίστα είναι η επόμενη:

<html>

<head>

<title>

PHP PAGE

</title>

</head>

<body>

<?

$list=$_POST['list'];

echo “ΕΠΙΛΕΞΑΤΕ ΤΟ ΣΤΟΙΧΕΙΟ $list<br>”;

?>

</body>

</html>

ΣΕΛΙΔΑ 11/43

2.3 Τελεστές

2.3.1 Αριθμητικοί τελεστές

ΤΕΛΕΣΤΗΣ ΑΠΟΤΕΛΕΣΜΑ

$a+$b Πρόσθεση $a και $b

$a-$b Αφαίρεση $b από $a

$a * $b Πολλαπλασιασμός $a με $b

$a / $b Διαίρεση $a και $b

$a % $b Υπόλοιπο της ακέραιας διαιρέσεως $a/$b

Αν τα δύο ορίσματα του τελεστή / είναι ακέραιοι τότε το αποτέλεσμα της διαιρέσεως είναι ακέραιος αριθμός. Επίσης υπάρχει και ο τελεστής . (τελεία) ο οποίος κάνει ότι το + στους αριθμούς για τα αλφαριθμητικά. Με αυτόν τον τελεστή συνενώνουμε δύο αλφαριθμητικά. Για παράδειγμα η έκφραση “HELLO”.” WORLD” έχει σαν αποτέλεσμα “HELLO WORLD”

2.3.2 Τελεστές αναθέσεως

Όμοια με την C η PHP έχει και τελεστές αναθέσεως. Για παράδειγμα είναι απόλυτα έγκυρο να γράψουμε σε κάποιο σημείο του κώδικα

$a=($b = 2);

όπως και να γράψουμε

$a+=2;

Η πρώτη εντολή αναθέτει το 2 στην μεταβλητή $b και φυσικά μετά την αναθέτει και στην μεταβλητή $a. Στην δεύτερη εντολή το 2 προστίθεται στην τιμή που έχει εκείνη την στιγμή η μεταβλητή $a.

2.3.3 Τελεστές συγκρίσεως

Για να συγκρίνουμε αποτελέσματα πράξεων μεταξύ τους χρησιμοποιούμε τους τελεστές συγκρίσεως, οι οποίοι παρουσιάζονται στον επόμενο πίνακα.

ΤΕΛΕΣΤΗΣ ΟΝΟΜΑ ΑΠΟΤΕΛΕΣΜΑ

$a == $b ΙΣΟΤΗΤΑ Αληθές αν έχουν την ίδια τιμή τα $a, $b

$a === $b ΤΑΥΤΟΤΗΤΑ Αληθές αν έχουν την ίδια τιμή τα $a ,$b και είναι του ίδιου τύπου

$a != $b ΟΧΙ ΙΣΟΤΗΤΑ Αληθές αν δεν έχουν την ίδια τιμή τα $a, $b

$a !== $b ΟΧΙ ΤΑΥΤΟΤΗΤΑ Αληθές αν δεν έχουν την ίδια τιμή τα $a, $b ή δεν έχουν τον ίδιο τύπο.

ΣΕΛΙΔΑ 12/43

ΤΕΛΕΣΤΗΣ ΟΝΟΜΑ ΑΠΟΤΕΛΕΣΜΑ

$a < $b ΜΙΚΡΟΤΕΡΟ Αληθές αν $a < $b

$a <= $b ΜΙΚΡΟΤΕΡΟ Ή ΙΣΟΝ Αληθές αν $a<=$b

$a > $b ΜΕΓΑΛΥΤΕΡΟ Αληθές αν $a>$b

$a >= $b ΜΕΓΑΛΥΤΕΡΟ Ή ΙΣΟΝ Αληθές αν $a>=$b

2.3.4 Τελεστές εκτελέσεως

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

<?

$result=`ls -CF';

echo “LS RESULTS=<B>$result</B>”;

?>

Στην παραπάνω ενότητα εκτελείται η εντολή ls -CF του UNIX και το αποτέλεσμα αυτής εκχωρείται στην μεταβλητή $result. Στην συνέχεια με μία echo εμφανίζουμε με έντονα γράμματα τα αποτελέσματα της εντολής.

2.3.5 Λογικοί τελεστές

Το τελευταίο είδος τελεστών που θα παρουσιάσουμε είναι οι λογικοί τελεστές.

ΤΕΛΕΣΤΗΣ ΟΝΟΜΑ ΑΠΟΤΕΛΕΣΜΑ

$a and $b AND Αληθές αν και $a αληθές και $b αληθές

$a or $b OR Αληθές αν ή $a αληθές ή $b αληθές

$a xor $b XOR Αληθές αν μόνον $a αληθές ή μόνον $b αληθές

! $a NOT Αληθές αν $a ψευδές

$a && $b AND Αληθές αν και $a αληθές και $b αληθές

$a || $b OR Αληθές αν ή $a αληθές ή $b αληθές

Οι τελεστές and και or έχουν την ίδια σημασία με τους && και || αλλά μικρότερη προτεραιότητα.

ΣΕΛΙΔΑ 13/43

2.4 Δομές ΕλέγχουΜια γλώσσα προγραμματισμού θεωρείται νεκρή χωρίς δομές ελέγχου. Οι δομές ελέγχου πάντα περιορίζονταν σε δύο κατηγορίες: τις δομές επιλογής και τις δομές ανακυκλώσεως. Στις πρώτες αποφασίζουμε για το ποια θα είναι η επόμενη εντολή που θα εκτελεστεί χρησιμοποιώντας μία λογική συνθήκη. Στις δομές ανακυκλώσεως μια ομάδα εντολών εκτελείται πολλές φορές με βάση μία λογική συνθήκη ή έναν προκαθορισμένο αριθμό επαναλήψεων.

2.4.1 Απλός επιλογέας

Ο απλός επιλογέας αποφασίζει για την επόμενη εντολή που θα εκτελεστεί με την χρήση μιας λογικής συνθήκης. Η σύνταξή του είναι

if(condition)

{

group1;

}

Που σημαίνει πως αν ισχύει η λογική συνθήκη condition, τότε εκτελείται η ομάδα εντολών group1. Διαφορετικά αυτή η ομάδα εντολών δεν εκτελείται. Το επόμενο απλό παράδειγμα δείχνει μία εφαρμογή του απλού επιλογέα.

<?

$a=1;

$b=2;

if($b < $a)

{

$b=$a;

}

echo “b=$b a=$a”;

?>

Φυσικά πάντα δεν υπάρχει ένας μόνο δρόμος στις αποφάσεις. Για αυτόν τον λόγο έχει προβλεφτεί να υπάρχει και ένα else για να καλύψει αυτήν την περίπτωση, όπως δείχνει το επόμενο παράδειγμα

<?

$a=1;

$b=2;

if($a < $b)

{

echo “TO A EINAI ΜΙΚΡΟΤΕΡΟ ΤΟΥ Β”;

}

ΣΕΛΙΔΑ 14/43

else

{

echo “ΤΟ Β ΕΙΝΑΙ ΜΙΚΡΟΤΕΡΟ ΤΟΥ Α”;

}

?>

2.4.2 Πολλαπλός επιλογέας

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

switch (variable)

{

case value1:

group1;

break;

case value2:

group2;

break;

.........................................

default:

group-default;

break;

}

Αν η τιμή της μεταβλητής είναι ίση με value1, τότε εκτελούνται οι εντολές group1. Διαφορετικά ελέγχουμε αν είναι ίση με value2. Αν είναι έτσι, εκτελούνται οι εντολές group2. Αν δεν βρεθεί ταίριασμα εκτελούνται οι εντολές που ακολουθούν πρόταση default. Εδώ θα πρέπει να επισημάνουμε τα ακόλουθα σε σχέση με την switch.

1. Οι εντολές break δεν είναι απαραίτητες για την συντακτική εγκυρότητα της switch. Αν δεν υπάρχουν όμως τότε θα εκτελεστεί και το επόμενο μπλοκ εντολών μετά το πρώτο ταίριασμα της μεταβλητής.

2. Η πρόταση default δεν είναι επίσης απαραίτητη. Ωστόσο συνίσταται η χρήση της προκειμένου να εξασφαλίσουμε πως τουλάχιστον μία ομάδα εντολών θα εκτελεστεί αλλά και πως έχουμε καλύψει όλες τις πιθανές περιπτώσεις για την τιμή της μεταβλητής.

3. Δεν πρέπει σε καμία περίπτωση η πρόταση switch να θεωρηθεί ισοδύναμη με πολλαπλά if. Στα πολλαπλά if δεν έχουμε μόνον ελέγχους για ισότητα.

Ένα από παράδειγμα για το πως δουλεύει η εντολή switch παρουσιάζεται στο

ΣΕΛΙΔΑ 15/43

επόμενο παράδειγμα

<?

$var=1;

switch ($var)

{

case 1:

echo “H TIMH EINAI 1”;

break;

case 2:

echo “ H TIMH EINAI 2”;

break;

default:

echo “OYTE 1 OYTE 2”;

break;

}

?>

Ένα λίγο πιο δυσνόητο παράδειγμα είναι αυτό που ακολουθεί:

<?

$var=5;

switch ($var)

{

case 1:

case 2:

case 3:

echo “ΕΙΝΑΙ ΑΠΟ 1 ΜΕΧΡΙ 3”;

break;

case 4:

case 5:

case 6:

echo “EINAI ΑΠΟ 4 ΜΕΧΡΙ 6”;

break;

default:

echo “EINAI ΣΕ ΑΛΛΟ ΣΥΝΟΛΟ”;

break;

ΣΕΛΙΔΑ 16/43

}

?>

Στο παραπάνω παράδειγμα αν η μεταβλητή είναι από 1 μέχρι 3 εμφανίζεται το πρώτο μήνυμα. Αν είναι από 4 μέχρι 6 το δεύτερο αλλιώς το τρίτο. Δεν είναι ιδιαίτερα βολικός τρόπος για να καλύψουμε σύνολα αλλά τουλάχιστον είναι ένας τρόπος.

2.4.3 Επανάληψη με while

Ο απλούστερος τρόπος για να γράψουμε μία επανάληψη είναι με την χρήση της εντολής while. Η σύνταξή της είναι ίδια με αυτήν που συναντάμε στην C, δηλαδή:

while(condition)

{

group;

}

Δηλαδή όσο ισχύει η condition εκτελούνται οι εντολές στην ομάδα εντολών group. Ένα απλό παράδειγμα είναι αυτό ενός απλού μετρητή:

<?

$sum=0;

$i=1;

while($i<=100)

{

$sum=$sum+$i;

$i=$i+1;

}

?>

Σε αυτό το παράδειγμα υπολογίζουμε το άθροισμα ∑i=1

100

i Φυσικά ο βρόγχος

while δεν είναι πάντα ο πλέον κατάλληλος για προκαθορισμένο πλήθος επαναλήψεων, καθώς θα πρέπει από μόνοι μας να φροντίζουμε για την ανανέωση της μεταβλητής που ελέγχει τον βρόγχο. Αν ξεχάσουμε την αύξηση της μεταβλητής $i, τότε θα έχουμε έναν ατέρμονό βρόγχο.

2.4.4 Επανάληψη με do .. while

Ο δεύτερος βρόγχος που θα εξετάσουμε είναι ο βρόγχος do..while. Η σύνταξή του έχει ως ακολούθως:

do

{

ΣΕΛΙΔΑ 17/43

group;

}while(condition);

Εδώ βλέπουμε πως το σύνολο εντολών θα εκτελεστεί και ύστερα θα ελέγξουμε αν η συνθήκη είναι αληθής ή ψευδής. Η διαφορά με τον προηγούμενο βρόγχο είναι ότι με το do...while οι εντολές θα εκτελεστούν τουλάχιστον μία φορά, όπως άλλωστε φαίνεται και στο επόμενο παράδειγμα:

<?

$var=100;

do

{

$var=$var+1;

}while($var<50);

echo “var=$var”;

?>

Μετά την εκτέλεση του παραπάνω κώδικα η τιμή του $var θα είναι 101, αφού θα εκτελεστεί ο βρόγχος τουλάχιστον μία φορά.

2.4.5 Επανάληψη με for

Το τελευταίο είδος επαναλήψεως που θα εξετάσουμε είναι αυτό με την χρήση της εντολής for. Η σύνταξή της είναι ίδια με αυτήν που συναντάμε στην γλώσσα C, δηλαδή:

for(init;check;update)

{

group;

}

Η σημασία των “παραμέτρων” του for είναι η ακόλουθη:

1. init Είναι μία εντολή που εκτελείται σε κάθε περίπτωση πριν την έναρξη του βρόγχου ακόμα και αν οι εντολές στο σώμα του δεν εκτελεστούν καμία φορά.

2. check Είναι μία λογική συνθήκη που εκτελείται πριν την κάθε επανάληψη. Αν εξαρχής δεν είναι αληθής , τότε οι εντολές στο σώμα του βρόγχου δεν θα εκτελεστούν καμία φορά.

3. update Είναι μία εντολή που εκτελείται στο τέλος του βρόγχου μετά την εκτέλεση των εντολών στο σώμα του βρόγχου και οπωσδήποτε πριν τον έλεγχο της συνθήκης check.

Ένα απλό παράδειγμα του βρόγχου είναι αυτό που ακολουθεί:

<?

$sum=0;

for($i=1;$i<=100;$i=$i+1)

ΣΕΛΙΔΑ 18/43

{

$sum=$sum+$i;

}

?>

Αξίζει να σημειωθεί πως κάποιες από τις παραμέτρους του βρόγχου μπορούν να παραληφθούν, αλλά με κανέναν τρόπο δεν παραλείπονται τα Ελληνικά ερωτηματικά που τις διαχωρίζουν. Για παράδειγμα στην επόμενη πρόταση δεν υπάρχει init και update και όμως ο βρόγχος δουλεύει κανονικά.

<?

for(;$i<=100;)

{

$sum=$sum+$i;

$i=$i+1;

}

?>

Στην παραπάνω περίπτωση η πρόταση for είναι ισοδύναμη με ένα while.

3. Συναρτήσεις

3.1 ΕισαγωγήΤο πιο σημαντικό θέμα στην PHP είναι οι συναρτήσεις της. Η γλώσσα διαθέτει ένα πλούσιο ρεπερτόριο από συναρτήσεις, με τις οποίες μπορούμε να κάνουμε τα πάντα σε θέματα όπως βάσεις δεδομένων, πίνακες, μαθηματικά, συμπίεση δεδομένων κτλ. Επειδή η αναφορά σε όλες τις συναρτήσεις της γλώσσας θα απαιτούσε εκατοντάδες σελίδες και επειδή ο προσανατολισμός αυτού του κειμένου είναι προς το ηλεκτρονικό εμπόριο θα εστιάσουμε την μελέτη μας σε ότι έχει να κάνει με ηλεκτρονικό εμπόριο. Αν κάπου χρειαστεί να αναφέρουμε κάποια ειδική συνάρτηση θα το κάνουμε.

3.1.1 Ορισμός συναρτήσεων

Μία συνάρτηση μπορεί να εμφανιστεί σε οποιοδήποτε σημείο του κώδικα μας ακόμα και μετά την χρήση της. Μια συνάρτηση έχει τον επόμενο ορισμό

function name($arg1,$arg2,...,$argN)

{

group;

return value;

}

Το αναγνωριστικό function είναι απαραίτητο πριν από το όνομα της συναρτήσεως προκειμένου να κατανοήσει ο διερμηνευτής της γλώσσας πως

ΣΕΛΙΔΑ 19/43

δεν πρόκειται για απλό κώδικα, αλλά για συνάρτηση της οποίας ο κώδικας φυσικά θα εκτελεστεί όταν αυτή κληθεί. Στο σώμα της συναρτήσεως (group) βάζουμε εντολές όπως θα τις βάζαμε και σε συνεχόμενο κώδικα. Σε μία συνάρτηση δεν είναι απαραίτητο να υπάρχει η εντολή επιστροφής τιμής return. Ωστόσο γενικά οι συναρτήσεις θα πρέπει να επιστρέφουν τιμές. Επίσης οι συναρτήσεις δεν είναι απαραίτητο να παίρνουν ορίσματα όπως κάναμε στο παραπάνω παράδειγμα. Βέβαια η χρήση παραμέτρων είναι ένας τρόπος επικοινωνίας ανάμεσα στο καλούμενο πρόγραμμά και καλών πρόγραμμά. Ένα παράδειγμα μίας απλής συναρτήσεως είναι και το επόμενο που προσθέτει τα δύο ορίσματα που δέχεται και τα επιστρέφει.

<?

function add($a,$b)

{

return $a+$b;

}

$result=add(10,20);

echo “result=$result<BR>”;

?>

Όπως βλέπουμε η αναφορά στην τιμή της συναρτήσεως δεν γίνεται με το $ μπροστά από το όνομά της. Αυτό γίνεται αλλά έχει άλλη σημασία όπως θα δούμε παρακάτω. Προς το παρόν αρκεί να θυμόμαστε πως όταν θέλουμε να πάρουμε το αποτέλεσμα μίας συναρτήσεως δεν βάζουμε το $ πριν από το όνομά της. Το παραπάνω παράδειγμα θα μπορούσε να είχε γραφεί και αλλιώς

<?

$result=add(10,20);

echo “result=$result<BR>”;

function add($a,$b)

{

return $a+$b;

}

?>

Γιατί όπως είπαμε δεν είναι απαραίτητο να δηλώνεται η συνάρτηση πριν από την χρήση της. Βέβαια για να αποφεύγονται λάθη αλλά και επειδή πριν την έκδοση 4 αυτό δεν υποστηρίζονταν καλό είναι να δηλώνουμε τις συναρτήσεις πριν τις χρησιμοποιήσουμε.

3.1.2 Ορίσματα

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

ΣΕΛΙΔΑ 20/43

επόμενο απλό παράδειγμα:

<?

$a=1;

$b=2;

$c=3;

function add($a,$b)

{

return $a+$b;

}

function sub($a,$b)

{

return $a-$b;

}

$result=sub(2,b);

echo “result=$result”;

?>

Ένα δεύτερο σημείο που πρέπει να προσέξουμε με τα ορίσματα είναι πως μπορούμε να χρησιμοποιήσουμε πέρασμα με αναφορά προκειμένου να πετύχουμε την αλλαγή μεταβλητών μέσα σε μία συνάρτηση. Για να περάσουμε μια μεταβλητή με αναφορά χρησιμοποιούμε τον τελεστή & μπροστά από το όνομα του ορίσματος στον ορισμό της συναρτήσεως. Στο επόμενο παράδειγμα μέσα από την συνάρτηση swap ανταλλάσσουμε τις τιμές δύο μεταβλητών:

<?

function swap(&$a,&$b)

{

$temp=$a;

$a=$b;

$b=$temp;

}

$var1=100;

$var2=200;

swap($var1,$var2);

echo “var1=$var1 and var2=$var2<BR>”;

ΣΕΛΙΔΑ 21/43

?>

Ο παραπάνω τρόπος περάσματος τιμών με αναφορά είναι λίγο πολύ ίδιος με αυτόν που βρίσκουμε στην C++. Ωστόσο η PHP έχει ακόμα έναν τρόπο περάσματος τιμών με αναφορά :

<?

function swap($a,$b)

{

$temp=$a;

$a=$b;

$b=temp;

}

$var1=100;

$var2=200;

swap(&$var1,&$var2);

echo “var1=$var1 and var2=$var2<BR>”;

?>

Λογικά η νέα έκδοση της συναρτήσεως swap δεν θα έπρεπε να ανταλλάσει τις τιμές των μεταβλητών. Ωστόσο αυτό γίνεται επειδή αν προσέξετε καλά στην κλήση της συναρτήσεως δεν περνάμε απλώς τις μεταβλητές $var1 και $var2, αλλά τις διευθύνσεις αυτών με την χρήση του τελεστή & μπροστά από το ονόματα των μεταβλητών.

Ένα ακόμα σημαντικό στοιχείο που πρέπει να πούμε για τις συναρτήσεις της PHP είναι η χρήση προκαθορισμένων τιμών στις παραμέτρους. Αυτό σημαίνει πως δεν είναι απαραίτητο να καλούμε μία συνάρτηση περνώντας τιμές σε όλα της τα ορίσματα.

<?

function add($a,$b=1)

{

return $a+$b;

}

$result1=add(100);

$result2=add(200,300);

echo “result1=$result1 and result2=$result2<BR>”;

?>

Ορίσαμε την συνάρτηση add() να δέχεται δύο ορίσματα. Το δεύτερο όρισμα δεν είναι απαραίτητο να το περάσουμε στην κλήση της συναρτήσεως , για αυτό και δηλώνουμε πως η προκαθορισμένη του τιμή θα είναι 1. Έτσι το πρώτο

ΣΕΛΙΔΑ 22/43

αποτέλεσμα είναι 101 και το δεύτερο 500.

3.2 ΠίνακεςΟ προσεκτικός αναγνώστης θα παρατήρησε πως μέχρι τώρα αποφύγαμε να μιλήσουμε για πίνακες στην ενότητα των μεταβλητών ή των δομών ελέγχου. Ο λόγος είναι απλός: Η γλώσσα δεν έχει πίνακες, τουλάχιστον όχι με την συνηθισμένη έννοια του όρου. Για την δημιουργία και τον χειρισμό πινάκων η γλώσσα διαθέτει ειδικές συναρτήσεις και ειδικές δομές ελέγχου. Οι πίνακες όπως θα δούμε παίζουν σημαντικό ρόλο στο ηλεκτρονικό εμπόριο, καθώς σε αυτούς μπορούμε να αποθηκεύουμε στοιχεία από ίδιες ομάδες αλλά και γιατί οι συναρτήσεις χειρισμού βάσεων δεδομένων επιστρέφουν πολύ συχνά πίνακες.

3.2.1 Δημιουργία πινάκων

Οι πίνακες δημιουργούνται με την χρήση της συναρτήσεως Array(). Η συνάρτηση αυτή παίρνει σαν όρισμα τα στοιχεία του πίνακα και τον δημιουργεί όπως φαίνεται και στο επόμενο παράδειγμα

<?

$my_array=Array(1,7,9,11);

echo “πρώτο=$my_array[0]<BR>”;

echo “δεύτερο=$my_array[1]<BR>”;

echo “τρίτο=$my_array[2]<BR>”';

echo “τέταρτο=$my_array[3]<BR>”;

?>

Στο παράδειγμα αυτό δημιουργούμε τον πίνακα $my_array με τα στοιχεία 1,7,9,11 και στην συνέχεια τα τυπώνουμε από το πρώτο προς το τελευταίο. Όπως βλέπουμε οι δείκτες των πινάκων ξεκινούν από το 0 και φτάνουν μέχρι το μέγεθος του πίνακα -1, ακριβώς όπως θα κάναμε και στην C. Ένα άλλο σημαντικό στοιχείο είναι η αναφορά στα στοιχεία του πίνακα. Αυτή γίνεται με την χρήση του [ ] . Φυσικά τα στοιχεία ενός πίνακα είναι με την σειρά τους μεταβλητές και έτσι αναφορές όπως

$my_array[2]=100

είναι καθόλα έγκυρες.

Ο τρόπος δημιουργίας πινάκων που είδαμε προηγουμένως δεν είναι ο μόνος. Μπορούμε κατά την δημιουργία ενός πίνακα να προσδιορίσουμε σε ποια θέση θα μπει κάθε στοιχείο στον πίνακα, όπως δείχνει και το επόμενο παράδειγμα:

<?

$fruits=Array(

2=>”ΜΗΛΑ”,

0=>”ΛΕΜΟΝΙΑ”,

1=>”ΠΟΡΤΟΚΑΛΙΑ”,

ΣΕΛΙΔΑ 23/43

3=>”ΑΧΛΑΔΙΑ”

);

echo “πρώτο=$fruits[0]<BR>”;

echo “δεύτερο=$fruits[1]<BR>”;

echo “τρίτο=$fruits[2]<BR>”';

echo “τέταρτο=$fruits[3]<BR>”;

?>

Για να προσδιορίσουμε σε ποια θέση θα μπει κάποιο στοιχείο σε έναν πίνακα αρκεί να γράψουμε τον δείκτη της θέσεως, τον τελεστή => και στην συνέχεια την τιμή που θέλουμε να έχει ο πίνακας σε εκείνη την θέση.

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

<?

$my_array=Array(4=>1,3,7,11);

?>

Σε αυτήν την περίπτωση ο πίνακας ξεκινά από το 4 και έχει τα στοιχεία 1,3,7,11 στις θέσεις 4,5,6,7.

Οι πίνακες κατακερματισμού παίζουν ιδιαίτερα σημαντικό ρόλο στον προγραμματισμό, καθώς με την χρήση κλειδιών μπορούμε αυτόματα να αποκτήσουμε πρόσβαση σε πληροφορία που θα απαιτούσε σημαντικό χρόνο αναζητήσεως. Η PHP διαθέτει πίνακες κατακερματισμού, οι οποίοι μάλιστα δημιουργούνται με την χρήση της συναρτήσεως Array() που είδαμε για την δημιουργία πινάκων. Ένα απλό παράδειγμα πίνακα κατακερματισμού είναι και το επόμενο που παρουσιάζει έναν πίνακα κόστους για προΐόντα που πουλά ένα κατάστημα ειδών πληροφορικής:

<?

$cost=Array(

"CPU"=>100,

"MB"=>80,

"RAM"=>30,

"HDISK"=>120,

"PRINTER"=>110

);

$cost_printer=$cost["PRINTER"];

echo "THE COST OF PRINTER IS

ΣΕΛΙΔΑ 24/43

$cost_printer<BR>";

?>

Σε πολλές εφαρμογές οι πίνακες δεν είναι μονοδιάστατοι. Η δημιουργία περισσοτέρων διαστάσεων γίνεται πάλι με την χρήση της συναρτήσεως Array() αλλά με διαφορετικό τρόπο από ότι είδαμε προηγουμένως:

<?

$my_array=Array(

Array(1,6,7),

Array(2,4,5),

Array(5,5,8)

);

for($i=0;$i<3;$i=$i+1)

{

for($j=0;$j<3;$j=$j+1)

{

$var=$my_array[$i][$j];

echo "$var ";

}

echo "<BR>";

}

?>

Με άλλα λόγια οι πολυδιάστατοι πίνακες δημιουργούνται με την χρήση ένθετων πινάκων . Βέβαια οι ένθετοι πίνακες δεν είναι απαραίτητο να έχουν όλοι την ίδια διάσταση.

3.2.2 Πλοήγηση σε πίνακες

Με τον όρο πλοήγηση σε πίνακες εννοούμε την ενέργεια που κάνουμε να κινηθούμε από την μία άκρη ενός πίνακα στην άλλη. Οι πίνακες στην PHP δεν είναι πίνακες με την έννοια του όρου που τον συναντάμε στις άλλες διαδικασιακές γλώσσες.. Στην ουσία πρόκειται για γραμμικές λίστες οι οποίες διαθέτουν κάποιον δείκτη θέσεως ο οποίος δείχνει και την τρέχουσα θέση στην οποία κάνουμε κάποια συγκεκριμένη πράξη όπως έναν έλεγχο.

Η απλούστερη ενέργεια που θέλουμε να κάνουμε σε έναν πίνακα είναι να ψάξουμε για ένα στοιχείο σε αυτόν. Η πρώτη συνάρτηση που το κάνει αυτό είναι η in_array(value,array). Η πρώτη της παράμετρος είναι η τιμή για την οποία ψάχνουμε και η δεύτερη παράμετρος είναι ο πίνακας στον οποίο γίνεται η έρευνα. Η συνάρτηση αυτή επιστρέφει TRUE ή FALSE, ανάλογα με το αν υπάρχει στον πίνακα η τιμή ή όχι. Αν και αυτή η συνάρτηση είναι αρκετά απλή στην σκέψη και στην λειτουργία δεν μας δίνει την θέση στην οποία βρίσκεται το

ΣΕΛΙΔΑ 25/43

στοιχείο στον πίνακα. Αυτό γίνεται με την συνάρτηση array_search(value,array). Η συνάρτηση αυτή ψάχνει για το στοιχείο value στον πίνακα array και θα επιστρέψει αν υπάρχει το κλειδί (ή θέση) αυτού του στοιχείου στον πίνακα.

Όπως αναφέραμε παραπάνω οι πίνακες είναι στην ουσία γραμμικές λίστες. Επομένως υπάρχει κάποιος τρόπος να της διατρέξουμε από την αρχή μέχρι το τέλος. Αυτήν την λειτουργία κάνει η συνάρτηση next(array), η οποία επιστρέφει το επόμενο στοιχείο σε έναν πίνακα και ταυτόχρονα μετακινεί τον δείκτη θέσεως του πίνακα κατά 1 στοιχείο. Αν έχουμε φτάσει στο τέλος του πίνακα η συνάρτηση αυτή επιστρέφει FALSE. Ένα απλό παράδειγμα της χρήσεώς της φαίνεται παρακάτω:

<?

$a=Array(1,2,11,-2,4,5);

$item=next($a);

while($item)

{

echo “element=$item<BR>”;

$item=next($a);

}

?>

Το παραπάνω πρόγραμμα όσο απλό και αν φαίνεται έχει ένα ελάττωμα: δεν τυπώνει το πρώτο στοιχείο του πίνακα, αλλά το παρακάμπτει. Αυτό γίνεται επειδή η next() περνά αμέσως στο επόμενο στοιχείο του πίνακα. Αν θέλουμε να παίρνουμε κάθε φορά το τρέχον στοιχείο σε έναν πίνακα, τότε πρέπει να χρησιμοποιήσουμε την συνάρτηση current(array) η οποία επιστρέφει το στοιχείο σε εκείνη την θέση του πίνακα που βρισκόμαστε. Το παραπάνω παράδειγμα γραμμένο σωστά έχει ως ακολούθως:

<?

$a=Array(1,2,11,-2,4,5);

do

{

$item=current($a);

echo “current=$item<BR>”;

}while(next($a));

?>

Αν δεν θέλουμε να περάσουμε από όλα τα στοιχεία ενός πίνακα, αλλά απλά να πάμε στο τέλος του, τότε μπορούμε να χρησιμοποιήσουμε την συνάρτηση end(), η οποία επιστρέφει το τελευταίο στοιχείο στον πίνακα και μετακινεί τον δείκτη του πίνακα στην τελευταία θέση του.

ΣΕΛΙΔΑ 26/43

Όμοια με την συνάρτηση next() υπάρχει και η prev() η οποία δίνει το προηγούμενο στοιχείο σε έναν πίνακα και επιστρέφει FALSE όταν φτάσουμε στην αρχή του πίνακα.

Οι προηγούμενες συναρτήσεις γενικά μετακινούν τον δείκτη ενός πίνακα για να κάνουν την δουλεία τους. Ωστόσο σε πολλές περιπτώσεις θα μας χρειαστεί να μετακινηθούμε κατά μήκος ενός πίνακα πολλές φορές. Σε αυτήν την περίπτωση θα πρέπει να χρησιιμοποιήσουμε την συνάρτηση reset(array), η οποία επαναθέτει τον δείκτη ενός πίνακα στην αρχή. Έτσι οι μελλοντικές συναρτήσεις next(), prev() κτλ θα ξεκινήσουν και πάλι από την πρώτη θέση του πίνακα.

3.2.3 Πράξεις μεταξύ πινάκων

Έκτος από την πλοήγηση σε έναν πίνακα πολύ σημαντικό είναι να εξετάσουμε και τις συναρτήσεις για πράξεις μεταξύ πινάκων. Στον επόμενο πίνακα παρουσιάζονται οι σημαντικότερες από αυτές τις συναρτήσεις και την σημασία τους:

ΣΥΝΑΡΤΗΣΗ ΣΗΜΑΣΙΑ

array_diff(array1,array2,...)

Επιστρέφει τα στοιχεία που υπάρχουν μόνον στο array1

array_flip(array) Αντιμεταθέτει τα κλειδιά και τις τιμές του πίνακα array. Έχει επίδραση σε ακέραιες και string τιμές.

array_intersect(array1,array2,...)

Επιστρέφει την τομή των στοιχείων των πινάκων.

array_sum(array) Επιστρέφει το άθροισμα των στοιχείων του πίνακα.

array_unique(array) Διαγράφει τις διπλές τιμές από τον πίνακα array.

array_reverse(array) Αναποδογυρίζει τον πίνακα array

3.2.4 Ταξινόμηση πινάκων

Για την ταξινόμηση πινάκων η PHP διαθέτει μία σειρά από συναρτήσεις που παρουσιάζονται στον επόμενο πίνακα:

ΣΥΝΑΡΤΗΣΗ ΣΗΜΑΣΙΑ

arsort(array) Ταξινομεί τον πίνακα αντίστροφα και τα κλειδιά διατηρούν την σχέση τους με τις τιμές.

asort (array) Ταξινομεί τον πίνακα και τα κλειδιά διατηρούν την σχέση τους με τις τιμές.

krsort(array) Ταξινομεί τον πίνακα αντίστροφα βάσει του κλειδιού

ksort(array) Ταξινομεί τον πίνακα βάσει του κλειδιού

rsort(array) Ταξινομεί τον πίνακα αντίστροφα

sort(array) Ταξινομεί τον πίνακα

ΣΕΛΙΔΑ 27/43

3.2.5 Η δομή foreach

Μια πολύ χρήσιμη δομή που παρέχει η γλώσσα για την κίνηση μέσα σε πίνακες είναι η δομή foreach. Η δομή αυτή εμφανίζεται με δύο μορφές. Στην πρώτη μορφή του γράφουμε

foreach($array as $value)

{

group;

}

Σε αυτήν την μορφή η μεταβλητή $value παίρνει διαδοχικά μία μία τις τιμές που περιέχονται στον πίνακα $array. Κάθε φορά που έχουμε μία νέα τιμή από τον πίνακα εκτελούνται οι εντολές στον σύνολο group. Για παράδειγμα μπορούμε με αυτόν τον τρόπο να τυπώσουμε όλα τα στοιχεία που υπάρχουν στην λίστα

<?

$ar=Array(1,7,12,34);

foreach($ar as $v)

{

echo “Value=$v<BR>”;

}

?>

Έτσι ακόμα και αν δεν ξέρουμε πόσα στοιχεία έχει ένας πίνακας μπορούμε να τον διατρέξουμε και να εκτελέσουμε διάφορες πράξεις πάνω στον πίνακα. Βέβαια η PHP διαθέτει την συνάρτηση count() η οποία επιστρέφει το πλήθος των στοιχείων ενός πίνακα. Η δομή foreach εκτελεί την πράξη reset() πάνω σε ένα αντίγραφο του πίνακα πριν την έναρξη των πράξεων . Έτσι ο προγραμματιστής απαλλάσσεται από την μέριμνα την τοποθετήσεως του δείκτη του πίνακα. Ωστόσο αυτό σημαίνει πως πράξεις σαν και την επόμενη δεν έχουν το αποτέλεσμα που θα επιθυμούσαμε:

<?

$ar=Array(1,3,5,10);

foreach($ar as $v)

{

$v=$v+1;

}

print_r($ar);

?>

ΣΕΛΙΔΑ 28/43

Η συνάρτηση print_r() απλά τυπώνει τα στοιχεία ενός πίνακα. Θα περιμέναμε να προστεθεί 1 σε κάθε στοιχείο του πίνακα. Αυτό όμως δεν συνέβη, καθώς η foreach δεν επηρεάζει τον πραγματικό πίνακα.

Η δεύτερη μορφή με την οποία εμφανίζεται η δομή είναι η επόμενη:

foreach($array as $key=>$value)

{

group;

}

Σε αυτήν την μορφή σε κάθε επανάληψη εκτελούνται οι εντολές στο group και η μεταβλητή $value λαμβάνει την επόμενη τιμή στον πίνακα αλλά και η μεταβλητή $key παίρνει το κλειδί σε εκείνη την θέση στον πίνακα. Και αυτή η μορφή της δομής δεν επηρεάζει τον πραγματικό πίνακα Το επόμενο παράδειγμα δείχνει την χρήση αυτής της μορφής της δομής

<?

$ar=Array(

“a”=>1

“b”=>2,

“c”=>3,

“d”=>4

);

foreach($ar as $key=>$value)

{

echo “key=$key<BR>”;

echo “value=$value<BR>”;

}

?>

3.2.6 Στοιβάδες

Το τελευταίο σημεία που θα εξετάσουμε στους πίνακες είναι η χρήση τους με την μορφή στοιβάδας. Στοιβάδες είναι δομές δεδομένων στις οποίες επιτρέπονται δύο πράξεις:

• Η εισαγωγή ενός στοιχείο στο τέλος της στοιβάδας (κορυφή).

• Η εξαγωγή ενός στοιχείου από το τέλος της στοιβάδας.

Για να καταλάβουμε καλύτερα την δομή της θα πρέπει να την φανταστούμε σαν μία σειρά από πιάτα. Μπορούμε μόνον να πάρουμε το επάνω πιάτο ή να βάλουμε κάποιο άλλο πάνω από αυτό. Αυτή η δομή έχει πάρα πολλά πλεονεκτήματα 1 και για αυτόν τον λόγο αξίζει να αφιερώσουμε λίγο χρόνο για

1 Ειδικά στους μεταφραστές

ΣΕΛΙΔΑ 29/43

να την μελετήσουμε.

Η πρώτη συνάρτηση που θα εξετάσουμε είναι η συνάρτηση array_push(array,value). Η συνάρτηση αυτή τοποθετεί την τιμή value στο τέλος του array και επιστρέφει το νέο πλήθος στοιχείων που έχει ο πίνακας. Αν θέλουμε μπορούμε να προσθέσουμε περισσότερα στοιχεία στον πίνακα βάζοντας και τρίτο και τέταρτο όρισμα στην συνάρτηση. Στο επόμενο παράδειγμα οι ζυγοί αριθμοί από το 2 έως και το 100 τοποθετούνται σε έναν πίνακα:

<?

$ar=Array();

for($i=2;$i<=100;$i+=2)

{

array_push($ar,$i);

}

print_r($ar);

?>

Η δεύτερη συνάρτηση που θα εξετάσουμε είναι η συνάρτηση array_pop(array) επιστρέφει το τελευταίο στοιχείο του πίνακα. Αν ο πίνακας είναι άδειος επιστρέφει NULL.

<?

$ar=Array();

for($i=2;$i<=100;$i+=2)

{

array_push($ar,$i);

}

do

{

$v=array_pop($ar);

echo “value=$v<BR>”;

}while($v!=NULL);

?>

3.3 Ημερομηνία και ώραΜε την βοήθεια της γλώσσας μπορούμε να ανακτήσουμε την ώρα και την ημερομηνία και να τα ενσωματώσουμε στις σελίδες μας. Στον επόμενο πίνακα παρουσιάζονται οι σημαντικότερες συναρτήσεις για ημερομηνία και ώρα

ΣΥΝΑΡΤΗΣΗ ΣΗΜΑΣΙΑ

date() Ανάκτηση ημερομηνίας

ΣΕΛΙΔΑ 30/43

ΣΥΝΑΡΤΗΣΗ ΣΗΜΑΣΙΑ

time() Ανάκτηση ώρας σε δευτερόλεπτα (UNIX)

getdate() Επιστρέφει πίνακα με μήνες, χρόνια, μέρες

localtime() Επιστρέφει πίνακα με λεπτά, δευτερόλεπτα κτλ

Η συνάρτηση date() γενικά απαιτεί ένα αλφαριθμητικό με πολλές παραμέτρους και θα ήταν χάσιμο χρόνο να τις αναλύσουμε αυτήν την στιγμή εδώ. Από την άλλη η time() είναι χρήσιμη για να μετρήσουμε χρονικές αποστάσεις. H getdate() και η localtime() είναι οι πιο εύχρηστες και μας επιστρέφουν πληροφορία που μπορεί να διαβαστεί εύκολα από άνθρωπο.

<?

$current_date=getdate();

$month= $current_date["month"];

$year= $current_date["year"];

$day= $current_date["mday"];

$minutes= $current_date["minutes"];

$seconds= $current_date["seconds"];

$hours= $current_date["hours"];

echo "TIME $hours:$minutes :$seconds <BR>";

echo "DATE $day / $month / $year <BR>";

?>

3.4 MySQL

3.4.1 Εισαγωγή

Για όσους ασχολούνται με ηλεκτρονικό εμπόριο το πλέον σημαντικό θέμα στον σχεδιασμό σελιδών είναι η σύνδεση με βάσεις δεδομένων και η εκτέλεση ερωτημάτων μέσω του διαδικτύου σε αυτές. Η PHP έχει δεκάδες συναρτήσεις για αυτόν τον σκοπό με τις οποίες μπορούμε να συνδεθούμε σε βάσεις ORACLE, SQL SERVER, INGRESS κτλ. Ωστόσο σε αυτό το κείμενο παρουσιάζονται μόνον οι συναρτήσεις που έχουν να κάνουν με την MySQL, καθώς μπορεί κανείς να την βρει εύκολα, δεν είναι ιδιαίτερα απαιτητική σε πόρους και προ πάντων εργάζεται το ίδιο σε όλα τα λειτουργικά συστήματα στα οποία είναι εγκατεστημένη.

3.4.2 Σύνδεση με βάση

Το πρώτο που κοιτάμε να κάνουμε όταν θέλουμε να εργαστούμε σε μία βάση είναι να συνδεθούμε σε αυτήν. Η σύνδεση για την MySQL γίνεται με την συνάρτηση

ΣΕΛΙΔΑ 31/43

mysql_connect(IP,username,password);

Η παραπάνω συνάρτηση επιστρέφει έναν περιγραφέα της βάσεως (περιγραφέας αρχείου) σε περίπτωση επιτυχίας. Σε περίπτωση αποτυχίας επιστρέφει FALSE. Τα ορίσματα έχουν την ακόλουθη σημασία

1. IP Είναι η διεύθυνση του μηχανήματος στην οποίο τρέχει ο εξυπηρέτης της MySQL. Για παράδειγμα σε αυτό μπορούμε να δώσουμε τιμές όπως “195.130.121.51”, “localhost”, “pegasus.cs.uoi.gr” κτλ. Όταν ο εξυπηρέτης είναι στο ίδιο μηχάνημα με το κώδικα, τότε μπορούμε να βάλουμε την τιμή localhost.

2. username Είναι ο κώδικος με τον οποίο θα συνδεθούμε στην βάση του απομακρυσμένου μηχανήματος. Αν η βάση δεδομένων βρίσκεται στον ίδιο υπολογιστή με τον κώδικα βάζουμε το username που έχουμε σε αυτό το μηχάνημα.

3. password Είναι το συνθηματικό το οποίο αντιστοιχεί στον κωδικό συνδέσεως για την βάση του απομακρυσμένου μηχανήματος. Αν η βάση δεδομένων βρίσκεται στον ίδιο υπολογιστή βάζουμε δύο συνεχόμενα “ , δηλαδή το αφήνουμε κενό.

Ένα παράδειγμα συνδέσεως παρατίθεται στην συνέχεια

<?

$link=mysql_connect("localhost","sheridan","") ;

if(!$link)

{

echo “ΛΑΘΟΣ ΣΤΗΝ ΣΥΝΔΕΣΗ<BR>;

}

else

{

mysql_close($link);

}

?>

Η συνάρτηση mysql_close() κλείνει μία σύνδεση που έχει ανοίξει επιτυχώς προηγουμένως. Θα πρέπει να σημειωθεί πάντως πως ακόμα και με την mysql_connect() δεν επιτυγχάνουμε σύνδεση με συγκεκριμένη βάση δεδομένων παρά μόνον σύνδεση με τον εξυπηρέτη. Για να συνδεθούμε με συγκεκριμένη βάση δεδομένων και να μπορέσουμε να εκτελέσουμε ερωτήματα πρέπει να χρησιμοποιήσουμε την συνάρτηση mysql_select_db(database). Η παράμετρος database επιλέγει την βάση δεδομένων με την οποία επιθυμούμε να εργαστούμε. Αν ο δεν έχουμε φτιάξει κάποια συγκεκριμένη βάση, τότε απλά μπορούμε να βάλουμε την default βάση test.

ΣΕΛΙΔΑ 32/43

3.4.3 Δημιουργία βάσεων

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

mysql_create_db(“name”,$link)

Αυτή η συνάρτηση δημιουργεί την βάση name. Σε περίπτωση επιτυχίας επιστρέφει TRUE και σε περίπτωση αποτυχίας επιστρέφει FALSE. Το δεύτερο όρισμα είναι ο περιγραφέας που έχουμε πάρει με την σύνδεση προηγουμένως. Από την άλλη αν θέλουμε να διαγράψουμε μία βάση δεδομένων θα πρέπει να χρησιμοποιήσουμε την συνάρτηση

mysql_drop_db(database,$link)

η οποία έχει παρόμοια στην σημασία ορίσματα με την προηγούμενη συνάρτηση. Ωστόσο πρέπει να επισημανθεί πως η δημιουργία και η διαγραφή βάσεων δεδομένων εξαρτάται από τον διαχειριστή της βάσεως δεδομένων στην οποία συνδεόμαστε και από τα δικαιώματα που έχουμε επί των βάσεων δεδομένων που προσπαθούμε να δημιουργήσουμε ή/και να διαγράψουμε.

3.4.4 Ανάκτηση πλειάδων

Η βασικότερη συνάρτηση που θα δούμε είναι η mysql_query(query,link). Το πρώτο όρισμα είναι το ερώτημα σε μορφή αλφαριθμητικού που θέλουμε να εκτελέσουμε και το δεύτερο όρισμα είναι ο περιγραφέας της βάσεως δεδομένων που έχουμε ανοίξει. Το αποτέλεσμα αυτής της συναρτήσεως αν είναι FALSE, σημαίνει πως το ερώτημα απέτυχε. Οι λόγοι αποτυχίας μπορεί να έχουν να κάνουν είτε με την σύνταξη του ερωτήματος είτε με δικαιώματα που υπάρχουν επί της βάσεως δεδομένων που θέλουμε. Το επόμενο απλό παράδειγμα δείχνει πως μπορούμε να εκτελέσουμε ερώτημα επιλογής σε μία βάση δεδομένων:

<html>

<head>

<TITLE> ΔΟΚΙΜΗ </TITLE>

</head>

<body>

<?

$link=mysql_connect("localhost","sheridan","");

if(!$link)

{

echo "ΛΑΘΟΣ ΣΤΗΝ ΣΥΝΔΕΣΗ<BR>";

}

mysql_select_db("test",$link);

$result=mysql_query("select * from test",$link);

ΣΕΛΙΔΑ 33/43

if(!$result)

{

echo "ΛΑΘΟΣ ΣΤΟ ΕΡΩΤΗΜΑ";

}

mysql_close($link);

?>

</body>

</html>

Στο παραπάνω παράδειγμα έχω φτιάξει στην βάση δεδομένων test έναν πίνακα με τα πεδία name, job, code. Τα δύο πρώτα είναι αλφαριθμητικά και το τρίτο είναι ακέραιος και είναι το κλειδί της βάσεως. Αν και το παραπάνω παράδειγμα είναι επιτυχές δεν εμφανίζει κάτι στην οθόνη. Η βάση μου έχει αρκετές γραμμές αλλά καμία δεν εμφανίζεται επί της οθόνης. Αυτό γίνεται γιατί με το που εκτελείται ένα ερώτημα τα αποτελέσματα αποθηκεύονται σε δυαδική μορφή στην μεταβλητή που ανατίθεται το ερώτημα, στην παραπάνω περίπτωση στην μεταβλητή $result. Για να μπορέσουμε λοιπόν να ανακτήσουμε αυτές τις πλειάδες θα πρέπει να επεξεργαστούμε τα δεδομένα στο $result με την συνάρτηση myql_fetch_array() που αναλαμβάνει να φέρει μία προς μία τις όποιες γραμμές υπάρχουν σε αυτόν τον πίνακα. Το επόμενο παράδειγμα ολοκληρώνει αυτό που είδαμε προηγουμένως:

<html>

<head>

<TITLE> ΔΟΚΙΜΗ </TITLE>

</head>

<body>

<?

$link=mysql_connect("localhost","sheridan","");

if(!$link)

{

echo "ΛΑΘΟΣ ΣΤΗΝ ΣΥΝΔΕΣΗ<BR>";

}

mysql_select_db("test",$link);

$result=mysql_query("select * from test",$link);

if(!$result)

{

echo "ΛΑΘΟΣ ΣΤΟ ΕΡΩΤΗΜΑ";

}

ΣΕΛΙΔΑ 34/43

echo "<table border=1>";

while($row=mysql_fetch_array($result))

{

echo "<tr>";

foreach($row as $v)

{

echo "<td> $v </td>";

}

echo “</tr>”;

}

echo “</table>”;

mysql_close($link);

?>

</body>

</html>

Η mysql_fetch_array() αναλαμβάνει να σπάσει το $result σε γραμμές. Κάθε κλήση σε αυτήν λαμβάνει την επόμενη γραμμή. Το αποτέλεσμα της συναρτήσεως είναι ένας πίνακας με μήκος ίσο με το πλήθος των στοιχείων κάθε πλειάδας. Αυτό σημαίνει πως μπορούμε να ταξινομήσουμε τον πίνακα ή να το επεξεργαστούμε με κάποια από τις συναρτήσεις που έχουμε δει σε προηγούμενη ενότητα για τον χειρισμό πινάκων.

Το παραπάνω παράδειγμα δεν είναι πλήρες. Μπορεί να τυπώνει στην οθόνη τα πεδία ενός πίνακα αλλά δεν τυπώνει τα ονόματα των πεδίων. Έτσι αν δεν ξέρουμε την δομή ενός πίνακα δεν θα μπορέσουμε να καταλάβουμε τι παριστάνει κάθε στήλη. Για αυτόν τον λόγο υπάρχει η συνάρτηση

$fields=mysql_list_fields(database,table,link)

Το πρώτο όρισμα είναι το όνομα της βάσεως για την οποία ενδιαφερόμαστε. Το δεύτερο όρισμα είναι το όνομα του πίνακα και το τρίτο όρισμα είναι ο περιγραφέας της βάσεως δεδομένων. Το αποτέλεσμα είτε θα είναι FALSE αν υπάρχει κάποιο σφάλμα (ανύπαρκτος πίνακας) είτε θα είναι μία λίστα με τα ονόματα των πεδίων του πίνακα. Για να ξέρουμε πόσα πεδία έχει ένας πίνακας αρκεί να καλέσουμε την συνάρτηση:

$columns=mysql_num_fields($fields)

Η συνάρτηση αυτή θα επιστρέψει το πλήθος των στηλών που υπάρχουν στην λίστα $fields. Η λίστα $fields προήλθε από την mysql_list_fields(). Στην συνέχεια με την συνάρτηση

$fieldname=mysql_field_name($fields,pos)

λαμβάνουμε το όνομα του πεδίου, σαν αλφαριθμητικό πλέον, από την λίστα

ΣΕΛΙΔΑ 35/43

fields στην θέση pos. Το αρχικό μας παράδειγμα ολοκληρωμένο τώρα και με ονόματα πεδίων έχει ως ακολούθως:

<html>

<head>

<TITLE> ΔΟΚΙΜΗ </TITLE>

</head>

<body>

<?

$link=mysql_connect("localhost","sheridan","");

if(!$link)

{

echo "ΛΑΘΟΣ ΣΤΗΝ ΣΥΝΔΕΣΗ<BR>";

}

mysql_select_db("test",$link);

$result=mysql_query("select * from test",$link);

if(!$result)

{

echo "ΛΑΘΟΣ ΣΤΟ ΕΡΩΤΗΜΑ";

}

$fields=mysql_list_fields(“test”,”test”,$link)

echo "<table border=1>";

echo "<tr>";

for($i=0;$i<$columns;$i++)

{

echo "<td>";

echo mysql_field_name($fields,$i);

echo "</td>";

}

echo "</tr>";

while($row=mysql_fetch_array($result))

{

echo "<tr>";

foreach($row as $v)

{

ΣΕΛΙΔΑ 36/43

echo "<td> $v </td>";

}

echo “</tr>”;

}

echo “</table>”;

mysql_close($link);

?>

</body>

</html>

3.4.5 Εισαγωγή πλειάδων

Ένα άλλο σημαντικό ζήτημα που έχουμε στις βάσεις δεδομένων και στο ηλεκτρονικό εμπόριο είναι η εισαγωγή νέων εγγραφών σε μία βάση δεδομένων ή η ενημέρωση παλαιών. Με την PHP κάτι τέτοιο είναι αρκετά απλό αρκεί να γνωρίζουμε MySQL. Στην MySQL για να ενημερώσουμε έναν πίνακα σε μία βάση δεδομένων γράφουμε

INSERT INTO TABLENAME(field1,field2,...) VALUES(val1,val1,val3);

Με τον όρο TABLENAME εννοούμε το όνομα του πίνακα. Field1, field2 κτλ είναι τα ονόματα των πεδίων στον πίνακα στα οποία κάνουμε εισαγωγή. Για το παράδειγμα του πίνακα test που είδαμε παραπάνω μπορούμε να φτιάξουμε την επόμενη σελίδα. Στην πρώτη δίνονται τρία πεδία: όνομα, εργασία και κωδικός και στην δεύτερη αυτά τα στοιχεία εισάγονται στην βάση δεδομένων και εμφανίζονται πλέον όλα μαζί στην οθόνη μας.

Η πρώτη σελίδα έχει ως ακολούθως:

<html>

<head>

<title> ΔΕΥΤΕΡΗ ΣΕΛΙΔΑ </title>

</head>

<body>

<form method="post" action="page2.php">

ONOMA:<input type="text" name="name">

<br>

ERGASIA:<input type="text" name="job">

<br>

CODIKOS:<input type="text" name="code">

<br>

<input type="submit" value="ok">

ΣΕΛΙΔΑ 37/43

</form>

</body>

</html>

Ουσιαστικά είναι μία απλή φόρμα χωρίς κώδικα PHP. Από την σύνταξή της καταλαβαίνουμε πως η δεύτερη σελίδα πρέπει να ονομαστεί page2.php η οποία και παρουσιάζεται στην συνέχεια:

<html>

<head>

<TITLE> ΔΟΚΙΜΗ </TITLE>

</head>

<body>

<?

$name=$_POST['name'];

$job=$_POST['job'];

$code=$_POST['code'];

$link=mysql_connect("localhost","sheridan","");

if(!$link)

{

echo "ΛΑΘΟΣ ΣΤΗΝ ΣΥΝΔΕΣΗ<BR>";

}

mysql_select_db("test",$link);

$query="insert into test(name,job,code) values(";

$query=$query."'$name','$job',$code)";

$result=mysql_query($query,$link);

$result=mysql_query("select * from test",$link);

if(!$result)

{

echo "ΛΑΘΟΣ ΣΤΟ ΕΡΩΤΗΜΑ";

}

echo "<table border=1>";

echo "<tr>";

for($i=0;$i<$columns;$i++)

{

echo "<td>";

ΣΕΛΙΔΑ 38/43

echo mysql_field_name($fields,$i);

echo "</td>";

}

echo "</tr>";

while($row=mysql_fetch_array($result))

{

echo "<tr>";

foreach($row as $v)

{

echo "<td> $v </td>";

}

echo “</tr>”;

}

echo “</table>”;

mysql_close($link);

?>

</body>

</html>

Για να κάνουμε την εισαγωγή της νέας εγγραφής στην βάση δεδομένων δημιουργήσαμε ένα αλφαριθμητικό στην μεταβλητή $query. Το αλφαριθμητικό αυτό είναι το ερώτημα που θα εκτελέσουμε στην βάση δεδομένων. Όπως βλέπουμε παρεμβάλλουμε τις τιμές των μεταβλητών $name, $job και $code μέσα στο αλφαριθμητικό όπως ακριβώς θα κάναμε με την γνωστή εντολή echo. Έτσι το αλφαριθμητικό που θα προκύψει αν δώσουμε σαν τιμές Giannis, Teacher 200 είναι

insert into test(name,job,code) values('Giannis','Teacher',200)

Δηλαδή είναι ακριβώς το αλφαριθμητικό που θα δίναμε στην κονσόλα της MySQL. Βέβαια δεν αρκεί να φτιάξουμε το query. Θα πρέπει και να το εκτελέσουμε με την συνάρτηση mysql_query(). Τότε και μόνον τότε εκτελείται η εισαγωγή στην βάση δεδομένων. Αξίζει να προσέξουμε στο παραπάνω ερώτημα πως περικλείσαμε τις μεταβλητές σε μονά εισαγωγικά. Αυτό έγινε επειδή στην MySQL απαιτείται τα αλφαριθμητικά να μπαίνουν σε μονά εισαγωγικά.

3.4.6 Διαγραφή πλειάδων

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

ΣΕΛΙΔΑ 39/43

delete from tablename where field1=value1 and field2=value2...

Η επόμενη φόρμα δέχεται ένα όνομα και μία εργασία και τα στέλνει στην σελίδα page4.php όπου και διαγράφει από την γνωστή βάση test την πλειάδα με αυτά τα στοιχεία

<html>

<head>

<title>

EISODOS STOIXEION

</title>

</head>

<body>

<form method="post" action="page4.php">

ONOMA:<input type="text" name="name">

<br>

ERGASIA:<input type="text" name="job">

<br>

<input type="submit" value="send">

</form>

</body>

</html>

Η σελίδα page4.php έχει ως εξής:

<html>

<head>

<title>

DIAGRAFI STOIXEION

</title>

</head>

<body>

<?

$name=$_POST['name'];

$job=$_POST['job'];

$link=mysql_connect("localhost","","");

mysql_select_db("test");

$query="delete from test where name='$name' and job='$job'";

ΣΕΛΙΔΑ 40/43

mysql_query($query,$link);

mysql_close($link);

?>

</body>

</html>

3.5 ΑλφαριθμητικάH PHP διαθέτει πολλές συναρτήσεις για τον χειρισμό αλφαριθμητικών. Οι κυριότερες από αυτές παρουσιάζονται στον επόμενο πίνακα:

ΣΥΝΑΡΤΗΣΗ ΕΠΙΣΤΡΕΦΕΙ

chop(string) Το string χωρίς τα κενά στο τέλος (αν έχει)

chr(ascii) Τον χαρακτήρα που αντιστοιχεί στον κωδικό ascii

ltrim(string) Το string χωρίς τους κενούς χαρακτήρες στην αρχή

ord(string) Την ascii θέση του πρώτου χαρακτήρα του string

strstr(string1,string2) Την πρώτη εμφάνιση του string1 στο string2

strcmp(string1,string2) Θετική τιμή αν string2>string1, 0 αν είναι ίδια και αρνητική αλλιώς

strcoll(string1,string2) Ότι και η strcmp αλλά με την χρήση locale

strlen(string) Το μήκος του string

strrev(string) Το string ανάποδα

substr(string,start,length) Από την θέση start τους επόμενους length χαρακτήρες

3.6 Αποστολή e-mailΚάτι άλλο που μπορούμε να κάνουμε με την PHP είναι να στείλουμε e-mail σε άλλους χρήστες στο διαδίκτυο. Αυτό είναι αρκετά σημαντικό ειδικά στην περίπτωση των ηλεκτρονικών καταστημάτων που πιθανόν θέλουν να ενημερώνουν τους πελάτες τους για νέα προΐόντα ή να τους ειδοποιούν για πληρωμές κτλ. Η αποστολή γίνεται με την συνάρτηση

mail(recipient,subject,message)

Η συνάρτηση αυτή στέλνει στον παραλήπτη που προσδιορίζεται από το recipient το μήνυμα με σώμα message και θέμα subject. Αν η αποστολή ήταν επιτυχής επιστρέφει TRUE. Σε άλλη περίπτωση επιστρέφει FALSE. Αν οι παραλήπτες είναι

ΣΕΛΙΔΑ 41/43

περισσότεροι από ένας τότε στην παράμετρο recipient τους παραθέτουμε με κόμμα ανάμεσα. Ένα παράδειγμα αποστολής είναι και αυτό:

mail(“[email protected], [email protected]”,”WELCOME”,”WELCOME TO OUR STORE”)

4. Ασκήσεις1. Να γραφεί συνάρτηση που να μετατρέπει το όνομα που έχει ένα εκτελούμενο

script σε πραγματικό όνομα αρχείο του Linux.

2. Να γραφούν δύο σελίδες. Στην πρώτη εισάγονται σε μία φόρμα δύο αριθμοί και στην δεύτερη εμφανίζεται το άθροισμά των δύο αυτών αριθμών.

3. Να γραφούν δύο σελίδες. Στην πρώτη εισάγεται μία εντολή του UNIX και στην δεύτερη εκτελείται αν δεν περιέχεται σε αυτήν το cp, rm, rmdir, ln

4. Να γραφούν δύο σελίδες. Στην πρώτη σελίδα θα εισάγονται δύο αριθμοί και θα επιλέγεται μία πράξη από μία λίστα επιλογών. Στην δεύτερη σελίδα θα εκτελείται η επιλεχθείσα πράξη επί των αριθμών και θα εμφανίζεται το αποτέλεσμα.

5. Να γραφεί συνάρτηση η οποία θα υπολογίζει με μη αναδρομικό τρόπο το παραγοντικό ενός αριθμού.

6. Να γραφεί συνάρτηση η οποία θα ταξινομεί έναν πίνακα με την τεχνική του Bubble Sort.

7. Να γραφεί συνάρτηση η οποία θα υπολογίζει και θα επιστρέφει την ορίζουσα ενός πίνακα 3Χ3

8. Ένα κατάστημα πουλά δύο προΐόντα. Το αντικείμενο Α κοστίζει 100 ΕΥΡΩ και το αντικείμενο Β κοστίζει 200 ΕΥΡΩ. Να φτιάξετε μία φόρμα παραγγελιών για τα δύο αυτά προΐόντα και στην δεύτερη σελίδα εμφανίστε το συνολικό κόστος των αντικειμένων που αγοράστηκαν.

9. Να γραφεί συνάρτηση η οποία θα υπολογίζει τον μέσο όρο ενός πίνακα που της δίνεται σαν όρισμα.

10.Να γραφεί συνάρτηση η οποία θα δέχεται δύο πίνακες σαν όρισμα και θα επιστρέφει έναν πίνακα που θα είναι η ένωσή τους.

11.Να γραφεί η συνάρτηση print_r2() που να κάνει ότι και η print_r().

12.Σε έναν πίνακα υπάρχουν δεξιές και αριστερές παρενθέσεις καθώς και άλλα σύμβολα. Να γραφεί συνάρτηση που με χρήση array_push() και array_pop() θα επιστρέφει 1 αν οι παρενθέσεις ταιριάζουν και 0 αλλιώς.

13.Φτιάξτε την βάση δεδομένων persons. Σε αυτή θα υπάρχουν ονόματα, επίθετα και αριθμοί μητρώου. Στην συνέχεια να δημιουργηθούν δύο σελίδες. Στην πρώτη θα δίνεται ένα όνομα και ένα επίθετο και στην δεύτερη θα εξετάζουμε αν υπάρχει εγγραφή με τέτοια στοιχεία στην βάση δεδομένων. Η εξέταση για αυτό να γίνει με δύο τρόπους. Το αποτέλεσμα της εξετάσεως θα είναι είτε η φράση ΥΠΑΡΧΕΙ ΣΤΗΝ ΒΑΣΗ είτε η φράση ΔΕΝ ΥΠΑΡΧΕΙ ΣΤΗΝ ΒΑΣΗ.

ΣΕΛΙΔΑ 42/43

14.Φτιάξτε την βάση δεδομένων emp. Σε αυτήν υπάρχουν ονόματα, επίθετα και μισθοί υπαλλήλων. Στην συνέχεια φτιάξτε μία σελίδα στην οποία θα υπολογίζεται και θα εμφανίζεται ο μέσος όρος του μισθού των υπαλλήλων καθώς και το άτομο(όνομα, επίθετο) που λαμβάνει τον μεγαλύτερο μισθό.

15.Φτιάξτε μία βάση δεδομένων persons. Σε αυτήν θα υπάρχουν ονόματα, επίθετα και αριθμοί μητρώου. Στην συνέχεια να δημιουργηθούν δύο σελίδες. Στην πρώτη σελίδα θα δίνεται ένα όνομα και ένα επίθετο που υπάρχουν στην βάση και ένα όνομα και ένα επίθετο στα οποία θέλουμε να αλλάξουμε τα προηγούμενα δύο. Στην δεύτερη σελίδα θα γίνεται αυτή η ενημέρωση στην βάση δεδομένων.

16.Φτιάξτε μία βάση δεδομένων με το όνομα accounts. Σε αυτήν θα υπάρχουν πραγματικά ονόματα, κωδικοί προσβάσεως και συνθηματικά. Στην συνέχεια δημιουργήστε δύο σελίδες. Η πρώτη σελίδα θα δέχεται ένα κωδικό προσβάσεως και ένα συνθηματικό. Αν ο κωδικός δεν είναι root και το συνθηματικό δεν είναι ένα προκαθορισμένο τότε απλά θα ελέγχει στην βάση τον κωδικό που δίνεται και αν υπάρχει και το συνθηματικό είναι σωστό θα εμφανίζει το πραγματικό όνομα του κατόχου. Σε διαφορετική περίπτωση αν δηλαδή το συνθηματικό είναι root και το password είναι το σωστό θα επιτρέπει μέσω άλλης σελίδας την εισαγωγή ενός νέου ατόμου στην βάση δεδομένων.

17.Φτιάξτε μία βάση δεδομένων με το όνομα persons. Σε αυτήν θα υπάρχουν ονόματα, επίθετα και e-mail. Στην συνέχεια φτιάξτε μία σελίδα στην οποία θα στέλνεται ένα e-mail σε καθένα άτομο το οποίο περιέχει στο επίθετό του το στοιχείο ΙΔΗΣ.

ΣΕΛΙΔΑ 43/43