Στις αρχικές εκδόσεις του οδηγού χρησιμοποιείται η εντολή mysql_connect η οποία έχει αντικατασταθεί πλέον απο την δομή mysqli. Το παρόν άρθρο θα ενημερωθεί σταδιακά με τον χρόνο.

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

Οι τύποι δεδομένων που αποθηκεύουμε αποτελούν συνήθως, αριθμούς και κείμενο. Η λίστα επαφών στο κινητό μας για παράδειγμα είναι μια μικρή βάση δεδομένων όπου μέσα σε αυτή κρατάμε το όνομα, το επώνυμο, το σταθερό τηλέφωνο, το κινητό, το email και άλλα σχετικά που έχουν να κάνουν με την εκάστοτε επαφή. Στο κινητό όλη αυτή η πληροφορία αποθηκεύεται σε αρχεία τα οποία βρίσκονται μέσα σε αυτό. Στο διαδίκτυο όμως, χρησιμοποιούνται διαδικτυακοί servers οι οποίοι αποτελούν server βάσεων δεδομένων και το μόνο που κάνουν είναι η αποθήκευση και η ανάκτηση πληροφοριών.

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

Σε αυτή την ενότητα θα μάθουμε να χρησιμοποιούμε την MySQL (My Structured Query Language) μέσα σε μια εφαρμογή με την χρήση της γλώσσας PHP.

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

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

Η εντολή σύνδεσης mysql_connect της php ή οποία εξυπηρετεί την σύνδεση της εφαρμογής php με μια βάση δεδομένων MySQL , ειναι ο πιο κοινός και παλαιότερος τρόπος σύνδεσης σε μια βάση δεδομένων MySQL, ωστόσο πλέον η μέθοδος αυτή τίνει να εξαφανστεί καθότι θεωρείται ξεπερασμένη και έχει αντικατασταθεί απο αντίστοιχες mysqli ή PDO (θα τα μελετήσουμε και τα δυο σε αργότερες ενότητες).

Για τα παρακάτω παραδείγματα θα χρησιμοποιηθεί ο πίνακας με όνομα students η δομή του οποίου είναι όπως ο παρακάτω πίνακας με 4 πεδία (fields) και 4 εγγραφές (records ή rows).

Id first_name last_name student_number degree
1 Κωνσταντίνος Παπαδόπουλος 3041 4
2 Δήμητρα Αναστασοπούλου 2134 6
3 Γιώργος Καρακίτσος 2222 5
4 Διονύσιος Δεσύλλας 2223 7

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

CREATE TABLE IF NOT EXISTS `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(60) CHARACTER SET utf8 NOT NULL,
  `last_name` varchar(60) CHARACTER SET utf8 NOT NULL,
  `student_number` int(11) NOT NULL,
  `degree` double NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `students` 
 (`id`, `first_name`, `last_name`, `student_number`, `degree`) 
VALUES
 (1, 'Κωνσταντίνος', 'Παπαδόπουλος', 3041, 4),
 (2, 'Δήμητρα', 'Αναστασοπούλου', 2134, 6),
 (3, 'Γιώργος', 'Καρακίτσος', 2222, 5),
 (4, 'Διονύσιος', 'Δεσύλλας', 2223, 7);

Σύνδεση

Για να συνδεθούμε σε μια βάση δεδομένων μέσω της php χρησιμοποιούμε την εντολή «new mysqli» η οποία δέχεται διαδοχικά τα τρία προαπαιτούμενα στοιχεία hostname, username, password, db_name (όνομα εξυπηρετητή, όνομα χρήστη, κωδικός, όνομα βάσης δεδομένων) και μας επιστρέφει ενα αντικείμενο mysqli το οποίο περιέχει την σύνδεση με την βάση δεδομένων.

$connection = new mysqli("localhost","root","","learncode");

Στο παράδειγμα που ακολουθεί, η «new mysqli» επιχειρεί την σύνδεση σε μια βάση δεδομένων. Αν αποτύχει εμφανίζει μήνυμα αποτυχίας. 

<?php
 $connection = new mysqli("localhost","root","","learncode");
 if($connection->connect_error){
  die('Αδύνατη σύνδεση: ' . $conn->connect_error); 
 }
?>

Στην μεταβλητή «$connection» αποθηκεύεται η ταυτότητα της σύνδεσης. Εάν δεν δημιουργηθεί κατά την διάρκεια της σύνδεσης τότε σημαίνει πως δεν πραγματοποιήθηκε. Η εντολή «die» λειτουργεί σαν συνδυασμός των «echo» και «exit». Τυπώνεται δηλαδή ένα μήνυμα και ύστερα το script τερματίζεται.

Το attribute «connect_error» του αντικειμένου «$connection» τύπου «mysqli» επιστρέφει ένα κείμενο με το σφάλμα που προήλθε από την εκτέλεση ενός προηγούμενου ερωτήματος προς μια βάση δεδομένων. Στην συγκεκριμένη περίπτωση θα μας επέστρεφε κάποιο σφάλμα σχετικά με το γιατί δεν μπορούμε να συνδεθούμε στην βάση δεδομένων.

Όπως μπορούμε να ανοίξουμε μια σύνδεση παρομοίως μπορούμε να την κλείσουμε κιόλας. Όταν πλέον έχουμε τελειώσει με τις αλλαγές μας με την βάση δεδομένων είναι προτιμότερο να κλείνουμε μια σύνδεση. Αυτό πραγματοποιείται με την χρήση της εντολής «close()» του αντικειμένου mysqli που υπάρχει ενεργό εκείνη την στιγμή δηλαδή στην περίπτωση μας του «$connection». Έτσι για να κλείσουμε την σύνδεση με βάση το προηγούμενο παράδειγμα θα γράφαμε «$connection->close()».

<?php
 $connection = new mysqli("localhost","root","","learncode");
 if($connection->connect_error){
  die('Αδύνατη σύνδεση:' .$connection->connect_error); 
 }
 
 //εντολές εδώ
 
 $connection->close();
?>

Ανάγνωση

Αρχικά για να μπορέσουμε να εκτελέσουμε ένα ερώτημα θα πρέπει να επιλέξουμε την βάση δεδομένων μέσα στην οποία θα εκτελέσουμε τα αντίστοιχα ερωτήματα. Αυτό γίνεται μέσω της εντολής «mysql_select_db» η οποία παίρνει δυο ορίσματα, πρώτα το όνομα της βάσης δεδομένων που θέλουμε να χρησιμοποιήσουμε (στην συγκεκριμένη περίπτωση «"dokimi"»), και ύστερα την ταυτότητα της σύνδεσης (στην συγκεκριμένη περίπτωση «$conn»).

Για να εκτελέσουμε ένα ερώτημα προς μια βάση δεδομένων θα πρέπει να χρησιμοποιήσουμε την εντολή «mysql_query» η οποία δέχεται ένα όρισμα, την εντολή σε SQL που θέλουμε να εκτελέσουμε. Όταν εκτελεστεί το ερώτημα επιστρέφεται το αποτέλεσμα σε μια μεταβλητή την οποία ορίζουμε εμείς.

Για να διαβάσουμε δεδομένα από έναν πίνακα μιας Βάσης Δεδομένων με την χρήση SQL, χρησιμοποιούμε την εντολή SELECT. Αν θέλουμε να επιλέξουμε όλες τις εγγραφές από τον πίνακα «students» χρησιμοποιούμε τον χαρακτήρα «*» που σημαίνει «όλα».

<?php
 $connection = new mysqli("localhost","root","","learncode");
 if($connection->connect_error){
  die('Αδύνατη σύνδεση: ' . $connection->connect_error); 
 }
 
 /* Επιλογή charset utf-8 */
 if (!$mysqli->set_charset("utf8")) {
    die("Δεν μπόρεσε να επιλεχθεί UTF-8 charset! " .$connection->error);
 }
 
 $result = $connection->query("SELECT * FROM students");
 
 // Εάν υπάρχουν αποτελέσματα
 if ($result->num_rows > 0) {
  // εκτύπωση κάθε γραμμής
  while($row = $result->fetch_assoc()) {
    echo $row['first_name']." ".$row['last_name'];
    echo "<br />";
  }
}
 
 $connection->close();
?>

Χρησιμοποιούμε την εντολή «set_charset('utf8');» προκειμένου οι χαρακτήρες που μεταφέρονται ως κείμενο από την βάση δεδομένων να μεταβιβάζονται σε κωδικοποίηση UTF-8 έτσι ώστε να είναι συμβατοί και αναγνώσιμοι με την κωδικοποίηση που χρησιμοποιούμε τόσο στον κώδικα μας όσο και στον φυλλομετρητή μας.

Το αποτέλεσμα του ερωτήματος αποθηκεύεται σε μορφή αντικειμένου mysqli στην μεταβλητή «$result» την οποία χρησιμοποιούμε αργότερα για να μετατρέψουμε σε πίνακα προκειμένου να αντλήσουμε τα δεδομένα με κάποια δομή επανάληψης.

Αφού αντλήσουμε τα δεδομένα από την βάση δεδομένων τότε η mysqli μας επιστρέφει το αποτέλεσμα σε μορφή πίνακα μέσω της εντολής «fetch_assoc()». Για μπορέσουμε να τα τυπώσουμε θα πρέπει να «τρέξουμε» τον πίνακα αυτόν με κάποια μορφή επανάληψης (for, while, foreach).

Αν θέλαμε να επιλέξουμε συγκεκριμένα πεδία από τον πίνακα, για παράδειγμα μόνο το id και το first_name τότε θα εκτελούσαμε το SQL query κάπως έτσι (το αποτέλεσμα μας δίνεται στο phpmyadmin):

SELECT `id`,`first_name` FROM students;

Εισαγωγή

Για να εισάγουμε δεδομένα σε μια βάση δεδομένων χρησιμοποιούμε την SQL εντολή INSERT. Υπάρχουν δύο τρόποι με τους οποίους μπορούμε να εισάγουμε δεδομένα με την INSERT. Ο πρώτος είναι να τα εισάγουμε χωρίς να αναφέρουμε τα πεδία του πίνακα που θέλουμε να τοποθετηθούν, αλλά δίνοντας τα δεδομένα στην κατάλληλη σειρά με την οποία τα πεδία έχουν δημιουργηθεί. Και ο δεύτερος είναι να εισάγουμε δεδομένα δίνοντας και την σειρά των πεδίων, αυτό μας δίνει την δυνατότητα να αγνοήσουμε κάποια πεδία και να εισάγουμε τιμές μόνο εκεί που μας ενδιαφέρει.

Ας δούμε ένα παράδειγμα SQL για την πρώτη περίπτωση:

INSERT INTO students VALUES (5,'Ιωάννης','Τζιτζήκας',3000,10);

Αν χρησιμοποιήσουμε αυτή την μέθοδο, τότε θα πρέπει να δώσουμε για όλα τα πεδία τιμές, ακόμη και για το id, που στην προκειμένη είναι αυτόματης αρίθμησης.

Αντίστοιχα σε ένα διακριτό INSERT επιλέγουμε εμείς ποια πεδία θα «γεμίσουμε».

INSERT INTO students (`first_name`,`last_name`,`student_number`) 
VALUES ('Κώστας','Γιώτολης',3000);

Με την παραπάνω εκτέλεση το «id» που χει οριστεί αυτόματης αρίθμησης θα πάρει αυτόματη τιμή χωρίς να του εισάγουμε εμείς χειροκίνητα, ενώ το «degree» θα πάρει εξ-ορισμού την τιμή μηδέν.

<!DOCTYPE HTML>
<html>
 <head>
  <meta charset="utf-8">
  <title>Εισαγωγή δεδομένων</title>
 </head>
 <body>
  <form method='post' action='insert.php'>
   Όνομα:<br/>
   <input type='text' name='fname'><br/>
   Επώνυμο:<br/>
   <input type='text' name='lname'><br/>
   Α.Μ.:<br/>
   <input type='text' name='snumber'><br/>
   Βαθμός:<br/>
   <input type='text' name='degree'><br/>
   <input type='submit' value='Αποστολή'>
  </form>
 </body>
</html>
<?php
 $connection = new mysqli("localhost","root","","learncode");
 if($connection->connect_error){
  die('Αδύνατη σύνδεση: ' . $connection->connect_error); 
 }
 
 /* Επιλογή charset utf-8 */
 if (!$mysqli->set_charset("utf8")) {
    die("Δεν μπόρεσε να επιλεχθεί UTF-8 charset! " .$connection->error);
 }
 
 $query="INSERT INTO students
  (`first_name`,`last_name`,`student_number`,`degree`) 
  VALUES 
   ('". $_POST['fname'] ."',
    '". $_POST['lname'] ."',
    '". $_POST['snumber'] ."',
    '". $_POST['degree'] . "'
   );";
 
 $result = $connection->query($query);
 
 if($result === TRUE){
  echo 'Επιτυχής εγγραφή!';
 }else{
 	die('Αδύνατη εγγραφή! :' . $connection->error);
 }
 
 $connection->close();
?>

Ας εισάγουμε μια νέα εγγραφή με στοιχεία όνομα: Αριστοτέλης, επώνυμο: Κεχαγιάς, ΑΜ: 2223, και βαθμό 10.

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

Όπως με την SELECT έτσι και με την INSERT η mysql επιστρέφει ένα αποτέλεσμα σε μια μεταβλητή της επιλογής μας. Το αποτέλεσμα αυτό εάν είναι κενό, σημαίνει ότι το ερώτημα δεν εκτελέστηκε σωστά και έτσι υπάρχει πρόβλημα εισαγωγής δεδομένων, έτσι προκύπτει και το «if(!$result)» το οποίο αναλαμβάνει τον ρόλο του ελέγχου. Παρομοίως το «mysql_error()» όπως και στην SELECT επιστρέφει το ανάλογο πρόβλημα της περίπτωσης.

Χρησιμοποιούμε το ερώτημα «mysql_query("SET NAMES utf8");» πριν την εκτέλεση του ερωτήματος εισαγωγής έτσι ώστε οι ελληνικοί χαρακτήρες να αναγνωριστούν από την βάση δεδομένων μας.

Ενημέρωση

Παρόμοια με την εισαγωγή και την ανάγνωση υπάρχει και η ενημέρωση. Όταν σε μια υπάρχουσα εγγραφή θέλουμε να αλλάξουμε μια τιμή, π.χ. να επεξεργαστούμε κάποιο λάθος όπως αυτό που κάναμε στην εντολή INSERT εισάγαμε μια εγγραφή με αριθμό μητρώο φοιτητή το οποίο υπάρχει ήδη. Αυτό θα ήταν ένα μεγάλο σφάλμα αν το πεδίο αριθμός μητρώου ήταν πεδίο-κλειδί για τον πίνακα students. Στην δικιά μας περίπτωση δεν είναι τεχνικό σφάλμα είναι όμως νοητό.

Για να ενημερώσουμε μια εγγραφή σε έναν πίνακα θα πρέπει να χρησιμοποιήσουμε την SQL εντολή UPDATE. Για να χρησιμοποιηθεί σωστά η UPDATE θα πρέπει να της πούμε «ΠΟΥ» θα βρει αυτό που θέλουμε να αλλάξουμε, επομένως χρησιμοποιούμε την εντολή «WHERE» σε συνδυασμό με την «UPDATE».

UPDATE students SET `student_number` = 2221 
WHERE `last_name` = 'Κεχαγιάς';

Στην ουσία αυτό που μας λέει παραπάνω εντολή είναι:

ΕΝΗΜΕΡΩΣΕ ΤΟΝ ΠΙΝΑΚΑ students ΘΕΣΕ student_number = 2221 
ΟΠΟΥ last_name = 'Κεχαγιάς';

Ας δούμε πως πραγματοποιείται το παραπάνω με χρήση της php.

<?php
 $conn = mysql_connect("localhost","root","");
 if(!$conn){
  die('Αδύνατη σύνδεση: ' . mysql_error()); 
 }
 
 mysql_select_db("dokimi",$conn);
 mysql_set_charset('utf8');
 
 mysql_query("SET NAMES utf8");
 
 $result = mysql_query("UPDATE students SET student_number = 2221 WHERE last_name = 'Κεχαγιάς';");
 
 if(!$result){
  die('Η ενημέρωση απέτυχε :' . mysql_error());
 }
 
 mysql_close($conn);
?>

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

Διαγραφή

Η διαγραφή μιας εγγραφής γίνεται μέσω της SQL εντολής DELETE σε συνδυασμό με την WHERE.

DELETE FROM students WHERE student_number = 2222;

Η παραπάνω εντολή αν εισαχθεί σε phpmyadmin θα διαγράψει την εγγραφή με student_number 2222.

<?php
 $conn=mysql_connect("localhost","root","");
 if(!$conn){
  die('Αδύνατη σύνδεση: ' .mysql_error()); 
 }
 
 mysql_select_db("dokimi",$conn);
 mysql_query("SET NAMES utf8");
 $result = mysql_query("SELECT * FROM students");
?>
<!DOCTYPE HTML>
<html>
 <head>
  <meta charset="utf-8">
  <title>Διαγραφή δεδομένων</title>
 </head>
 <body>
  <form method='post' action='delete.php'>
   <select name='delid'>
    <option value="" disabled selected>Επιλέξτε για διαγραφή</option>
    <?php 
     while($row=mysql_fetch_array($result)){
       echo "<option value='".$row['id']."'>".$row['first_name']." ".$row['last_name']."</option>";
     }
    ?>

   </select>
   <input type='submit' value='Διαγραφή'>
  </form>
 </body>
</html>
<?php
 mysql_close($conn);
?>
<?php
 $conn = mysql_connect("localhost","root","");
 if(!$conn){
  die('Αδύνατη σύνδεση: ' . mysql_error()); 
 }
 
 mysql_select_db("dokimi",$conn);
 
 $query = "DELETE FROM students WHERE id = ".$_POST['delid'].";";
  
 mysql_query("SET NAMES utf8");
 $result = mysql_query($query);
 
 if(!$result){
  die('Η διαγραφή απέτυχε :' . mysql_error());
 }
 
 echo "Η διαγραφή ολοκληρώθηκε!<br/> <a href='delete_form.php'>πίσω</a>.";
 mysql_close($conn);
?>

Μετά την διαγραφή ο πίνακας θα εμφανίζεται στο phpmyadmin έτσι: