φνδεςη με βάςη δεδομζνων Όλεσ οι διαδικτυακζσ εφαρμογζσ χρειάηονται και μια μζκοδο μόνιμθσ αποκικευςθσ των πλθροφοριϊν. Οι πλθροφορίεσ αυτζσ μπορεί να είναι άρκρα, χριςτεσ, προϊόντα κ.α., ανάλογα με τθ φφςθ τθσ κάκε εφαρμογισ. Η πιο διαδεδομζνθ μζκοδοσ αποκικευςθσ είναι οι βάςεισ δεδομζνων, οπότε πρζπει να δοφμε πωσ θ PHP μασ επιτρζπει να ςυνδεκοφμε και να διαχειριςτοφμε μια βάςθ. Η PHP μπορεί να ςυνεργαςτεί-διαχειριςτεί διάφορουσ τφπουσ (μθχανζσ) βάςεων δεδομζνων. Για να γίνει αυτό χρειαηόμαςτε κάποια βιβλιοκικθ που κα προςκζτει ςτθ PHP τισ κατάλλθλεσ λειτουργίεσ και ςυναρτιςεισ για τθ διαχείριςθ τθσ βάςθσ. Είναι πολφ ςυνθκιςμζνο να βλζπουμε τθ PHP να ςυνυπάρχει ςε ζνα server με τθ MySQL. Αυτι θ μθχανι βάςεων δεδομζνων δεν χρειάηεται επιπλζον βιβλιοκικεσ για να χρθςιμοποιθκεί από τθν PHP, αφοφ όλεσ οι απαραίτθτεσ λειτουργίεσ είναι ιδθ ενςωματωμζνεσ. Συγκεκριμζνα κα χειριςτοφμε βάςεισ τθσ MySQLi που είναι θ ςφγχρονθ βελτιωμζνθ ζκδοςθ τθσ MySQL. Για τθ ςφνδεςθ και διαχείριςθ τθσ βάςθσ θ PHP μασ παρζχει ζνα ζτοιμο ςφνολο ςυναρτιςεων που μποροφμε να χρθςιμοποιιςουμε. Στο παρακάτω ςφνδεςμο μπορείτε να βρείτε τθ λίςτα με τισ ςυναρτιςεισ αυτζσ, κάποιεσ από τισ οποίεσ κα χρθςιμοποιιςουμε ςτα παραδείγματα που ακολουκοφν. http://www.w3schools.com/php/php_ref_mysqli.asp Ασ δοφμε ενδεικτικά κάποιεσ από αυτζσ μαηί με τθν ερμθνεία τουσ. Η παρακάτω λίςτα ςυναρτιςεων είναι αρκετι για δθμιουργιςουμε απλά παραδείγματα με πλιρθ λειτουργικότθτα. mysqli_connect() mysqli_close() mysqli_error() mysqli_connect_error() mysqli_query() mysqli_fetch_all() mysqli_fetch_assoc() mysqli_insert_id() Δθμιουργεί μια ςφνδεςθ με τον server τθσ MySQL και ςε ςυγκεκριμζνθ βάςθ Κλείνει τθ ςφνδεςθ με τον MySQL Server Επιςτρζφει τθ περιγραφι του πιο πρόςφατου λάκουσ Επιςτρζφει τθ περιγραφι του λάκουσ ςφνδεςθσ ςτο server (αν ζχει υπάρξει πρόβλθμα ςφνδεςθσ) Εκτελεί ζνα ερϊτθμα πάνω ςτθ βάςθ που ζχουμε ςυνδεκεί Επιςτρζφει όλα τα αποτελζςματα ενόσ ερωτιματοσ που εκτελζςαμε ωσ ςχεςιακό ι αρικμθτικό πίνακα Επιςτρζφει μια ςειρά από τα αποτελζςματα ενόσ ερωτιματοσ που εκτελζςαμε ωσ ςχεςιακό πίνακα Επιςτρζφει το Id που δθμιουργικθκε αυτόματα ςτο τελευταίο επιτυχθμζνο ερϊτθμα ειςαγωγισ
φνδεςη ςτο server και δημιουργία βάςησ Στο πρϊτο παράδειγμα κα κεωριςουμε ότι δεν ζχουμε ςτθ διάκεςι μασ καμία βάςθ για τθν εφαρμογι μασ. Ζτςι κα δθμιουργιςουμε μια βάςθ με τθ χριςθ τθσ PHP. $servername = "localhost"; $password = ""; $conn = mysqli_connect($servername, $username, $password); die("αποηστημένη Σύνδεζη: ". mysqli_connect_error()); echo "Επιηστής ζύνδεζη!<br>"; // Δημιοσργία βάζης $sql = "CREATE DATABASE iek"; echo "Επιηστής δημιοσργία ηης βάζης"; else { echo "Αποηστία δημιοσργίας ηης βάζης: ". mysqli_error($conn); Βλζπουμε ςτο παραπάνω παράδειγμα ότι για να ςυνδεκοφμε ςτον MySQL server πρζπει να δϊςουμε τθ κζςθ του (localhost αφοφ πρόκειται για τον τοπικό server) και τα ςτοιχεία ςφνδεςθσ ςε αυτόν. Αν εκτελοφμε τα παραδείγματα ςε ζναν XAMPP ι WAMP Server ςυνικωσ αυτά είναι username:root και password:κενό. Η μεταβλθτι $conn που δθμιουργείται αντιπροςωπεφει τθ ςφνδεςθ με τον server και οποιαδιποτε ενζργεια κζλουμε από εδϊ και πζρα να εκτελζςουμε πάνω ςτο server που ςυνδεκικαμε πρζπει να ςυνοδεφεται από αυτιν. Αν θ $conn δεν ζχει αρχικοποιθκεί ςωςτά κατά τθ ςφνδεςθ τότε αυτό ςθμαίνει ότι θ ςφνδεςθ απζτυχε. Ζτςι με τθ παρακάτω εντολι ελζγχουμε αν θ ςφνδεςθ ιταν επιτυχισ και αν όχι τυπϊνουμε το μινυμα λάκουσ και τερματίηουμε το script. Ο τερματιςμόσ του script γίνεται με τθν εντολι die. die("αποηστημένη Σύνδεζη: ". mysqli_connect_error()); Για να δθμιουργιςουμε μια νζα βάςθ πάνω ςτθν οποία κα δουλζψουμε πρζπει να εκτελζςουμε ζνα SQL ερϊτθμα. Όπωσ κα κάνουμε ςε όλα τα SQL ερωτιματα που κα κελιςουμε να εκτελζςουμε, κα πρζπει πρϊτα να φτιάξουμε το ερϊτθμα ςαν μια αλφαρικμθτικι ποςότθτα (string). Το string αυτό κα το περάςουμε μετά ςαν παράμετρο ςτθ ςυνάρτθςθ mysqli_query για να εκτελεςτεί. Όπωσ φαίνεται ςτον κϊδικα μαηί με το ερϊτθμα ($sql) δίνουμε ςαν παράμετρο και τθ ςφνδεςθ ($conn) ςτθν οποία κζλουμε να εφαρμοςτεί. Αν το ερϊτθμα αποτφχει για κάποιο λόγο, θ εντολι mysqli_query κα επιςτρζψει false. Ζτςι μποροφμε να ελζγξουμε αν ο πίνακασ δθμιουργικθκε με επιτυχία.
// Δημιοσργία βάζης $sql = "CREATE DATABASE iek"; echo "Επιηστής δημιοσργία ηης βάζης"; else { echo "Αποηστία δημιοσργίας ηης βάζης: ".mysqli_error($conn); Τζλοσ με τθ ςυνάρτθςθ mysqli_close τερματίηουμε τθ ςφνδεςθ με τθ βάςθ. Δημιουργία Πίνακα ςτη βάςη Για να μπορζςουμε να δθμιουργιςουμε ζνα πίνακα ςτθ βάςθ δεδομζνων «iek που δθμιουργιςαμε νωρίτερα, κα πρζπει να ςυνδεκοφμε ςτθ ςυγκεκριμζνθ βάςθ. Ζτςι θ εντολι mysqli_connect() που χρθςιμοποιιςαμε ςτο προθγοφμενο παράδειγμα πρζπει να τροποποιθκεί ϊςτε να δζχεται ωσ παράμετρο και το όνομα τθσ βάςθσ, ςτθ ςυγκεκριμζνθ περίπτωςθ τθ βάςθ iek. $servername = "localhost"; $password = ""; $dbname = "iek"; $conn=mysqli_connect($servername,$username,$password,$dbname); die("αποηστημένη Σύνδεζη: ". mysqli_connect_error()); echo "Επιηστής ζύνδεζη!<br>"; // sql ερώηημα για ηη δημιοσργία ενός πίνακα $sql = "CREATE TABLE student ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, age int(3))"; echo "Επιηστής δημιοσργία ηοσ πίνακα"; else { echo "Αποηστία δημιοσργίας ηοσ πίνακα: ". mysqli_error($conn); Από το κϊδικα παραπάνω βλζπουμε ότι ο βαςικόσ κορμόσ είναι ο ίδιοσ και το μόνο που αλλάηει είναι ο τρόποσ ςφνδεςθσ ςτθ βάςθ (προςτζκθκε το όνομα τθσ βάςθσ) και το ερϊτθμα που εκτελοφμε ςτθ ςυνζχεια. Ο πίνακασ που δθμιουργείται με αυτό το ερϊτθμα ονομάηεται student και περιλαμβάνει μερικά βαςικά ςτοιχεία μόνο και μόνο για να ικανοποιεί τισ ανάγκεσ των παραδειγμάτων. Ζχοντασ πλζον τον πίνακα μποροφμε να πειραματιςτοφμε με όποιο ερϊτθμα κζλουμε (insert, update, select, delete) ακολουκϊντασ το ίδιο ςκεπτικό ςτο κϊδικα και τισ ίδιεσ ςυναρτιςεισ τθσ MySQLi.
Ειςαγωγή ςτοιχείων ςτο πίνακα Τϊρα που ξζρουμε πϊσ να επικοινωνιςουμε με τθ βάςθ και ζχουμε δθμιουργιςει ζνα πίνακα, ασ δοφμε πωσ μποροφμε να επιτρζψουμε ςτο χριςτθ να καταχωρίςει ςτοιχεία με τθ βοικεια μιασ φόρμασ με τθ μζκοδο POST. Ο κϊδικασ παρακάτω είναι ο κϊδικασ από τισ ςθμειϊςεισ για τθ POST (7-superglobals), προςαρμοςμζνοσ ςτισ ανάγκεσ των δεδομζνων που ζχουμε. Άρα θ φόρμα ηθτάει τρία ςτοιχεία: όνομα, επίκετο και θλικία. Βαςικοί περιοριςμοί το όνομα και το επίκετο να μθν είναι άδεια και θ θλικία να μθν είναι 0 ι αρνθτικι. Κατά τθν επιτυχι υποβολι τθσ φόρμασ καλείται θ ςυνάρτθςθ save_in_database τθν οποία ορίςαμε εμείσ και ςτθν οποία ςτζλνουμε ωσ παράμετρο όλο το πίνακα POST. Η ςυνάρτθςθ ςυνδζεται ςτθ βάςθ και καταχωρεί τα δεδομζνα με τθν εκτζλεςθ ενόσ ερωτιματοσ INSERT. function save_in_database($data) { //κώδικας για ηην αποθήκεσζη ζηη βάζη $sname = "localhost"; $pass = ""; $dbname = "iek"; $conn = mysqli_connect($sname,$username,$pass,$dbname); die("αποηστημένη Σύνδεζη: ". mysqli_connect_error()); // sql ερώηημα για ηην ειζαγωγή δεδομένων $sql = "INSERT INTO student SET firstname =.$data['firstname']., lastname =.$data['lastname']., age =.$data['age']. ; echo "Επιηστής αποθήκεσζη ζηο πίνακα"; else { echo "Αποηστία αποθήκεσζης ζηο πίνακα: ". mysqli_error($conn); $errors = array(); $firsname = ; $lastname = ; $age = ; if ($_SERVER['REQUEST_METHOD'] == 'POST') { // ελέγτοσμε κάθε πληροθορία τωριζηά // αν ενηοπίζοσμε λάθος ζε κάποια προζθέηοσμε μια // καηατώριζη ζηο πίνακα ηων λαθών
if (strlen(($_post['firstname']) == 0) $errors[ firstname ] = true; if (strlen(($_post['lastname']) == 0) $errors[ lastname ] = true; if ($_POST['age'] < 1) $errors[ age ] = true; if (empty($errors)) { save_in_database($_post); else { echo Ύπάρτοσν λάθη ζηη θόρμα ; $firstname = $_POST['firstname']; $lastname = $_POST['lastname']; $age = $_POST[ age ]; <form action="form.php" method="post"> <label>όνομα</label> <input name="firstname" value= echo $firstname; if (isset($errors[ firstname ])) echo style= border:2px solid red > ; type="text"> <br> <label>επίθεηο</label> <input name="lastname" value= echo $lastname; if (isset($errors[ lastname ])) echo style= border:2px solid red > ; type="text"> <br> <label>ηλικία</label> <input name="age" value= echo $age; if (isset($errors[ age ])) echo style= border:2px solid red > ; type="text"> <br> <input type="submit" value="υποβολή ζηοιτείων"> </form> ΠΡΟΟΧΗ: Η ςφνδεςθ ςτθ βάςθ δεν είναι απαραίτθτο να γίνεται κάκε φορά που κζλουμε να εκτελζςουμε ζνα ερϊτθμα. Αν θ πρόςβαςθ ςτθ βάςθ είναι ςυχνι (ςχεδόν ςε κάκε αρχείο) τότε τοποκετοφμε το κϊδικα ςφνδεςθσ ςε ζνα αρχείο που χρθςιμοποιείται από όλα τα scripts, όπωσ είναι το αρχείο header.php που χρθςιμοποιοφςαμε ςε όλεσ τισ εργαςτθριακζσ αςκιςεισ. Λήψη ςτοιχείων από το πίνακα Στο παρακάτω κϊδικα μποροφμε να δοφμε πωσ γίνεται θ λιψθ και εμφάνιςθ των ςτοιχείων του πίνακα με ζνα ερϊτθμα SELECT. Όπωσ είπαμε θ δομι του κϊδικα που αφορά ςτθ ςφνδεςθ ςτθ βάςθ είναι θ ίδια. Τροποποιϊντασ το ερϊτθμα SELECT του κϊδικα κα
μποροφςαμε να αντλιςουμε μόνο μια εγγραφι ι ζνα ςφνολο εγγραφϊν, ανάλογα με τα κριτιρια που κζλουμε. function get_from_database() { //κώδικας για ηην αποθήκεσζη ζηη βάζη $sname = "localhost"; $pass = ""; $dbname = "iek"; $conn = mysqli_connect($sname,$username,$pass,$dbname); die("αποηστημένη Σύνδεζη: ". mysqli_connect_error()); // sql ερώηημα για ηην ειζαγωγή δεδομένων $sql = "SELECT id, firstname, lastname FROM student"; $result = mysqli_query($conn, $sql); $results = mysqli_fetch_all($result, MYSQLI_ASSOC); return $results; $students = get_from_database(); foreach ($students as $res) { echo "id: ". $res["id"]." - "; echo "Name: ". $res["firstname"]." "; echo $res["lastname"]."<br>";