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

PHP & MySQL Tutorial – Η Επιστροφή του Βασιλιά

Αφού μάθατε τα βασικά της PHP και του τρόπου με τον οποίο αυτή συνδυάζεται με την HTML ήρθε η ώρα να επιστρέψετε στην MySQL, την οποία αφήσατε πίσω στο 1ο μέρος, ώστε να σχεδιάσετε ένα real world project που να συνδυάζει όλες τις γνώσεις που αποκομίσατε.

Το βασικό συστατικό ενός επιτυχημένου ιστοτόπου είναι φυσικά το περιεχόμενό του (content) – οι πληροφορίες που περιέχει. Πάρτε για παράδειγμα ένα blog ή ένα forum χωρίς δημοσιεύσεις. Δεν θα είχε και πολλές επισκέψεις. Η ποιότητα αλλά και η ποσότητα του πραγματικού περιεχομένου είναι οι κύριοι παράγοντες που ουσιαστικά καθορίζουν την επιτυχία ενός site.
Όσο η ποσότητα του περιεχομένου αυξάνεται τόσο πιο επιτακτική γίνεται η ανάγκη για την αποδοτική του οργάνωση. Η οργάνωση του περιεχόμενου ενός site σε στατικές HTML ιστοσελίδες ανήκει στο μακρινό παρελθόν αφού η μέθοδος αυτή αφενός δεν έχει ευελιξία στον τρόπο παρουσίασης της πληροφορίας και αφετέρου καθιστά εφιαλτική την συντήρηση του site από τον διαχειριστή του όταν το περιεχόμενο ξεπεράσει τις μερικές δεκάδες σελίδων. Έτσι, οι σχεδιαστές σελίδων σήμερα, χρησιμοποιούν βάσεις δεδομένων για να αποθηκεύουν το περιεχόμενο ώστε να αποφύγουν τα προβλήματα οργάνωσης και συντήρησης του ιστοτόπου. Μάλιστα η χρήση βάσεων κάνει την δουλειά τους προσαρμόσιμη σε πολλές εφαρμογές. Έτσι, αντί να σχεδιάζουν ένα site από την αρχή για κάθε project, χρησιμοποιούν έτοιμες δυναμικές πλατφόρμες διαχείρισης περιεχομένου (CMS – Content Management System) τις οποίες προσαρμόζουν στις ανάγκες του project. Έτσι πολλά site που φαινομενικά είναι εντελώς διαφορετικά βασίζονται ακριβώς στον ίδιο κώδικα σελίδας και διαφέρουν μόνο επειδή το ίδιο το περιεχόμενο και κάποιες ρυθμίσεις, αποθηκευμένα σε μια βάση δεδομένων, είναι διαφορετικά.
Δείτε ένα σύγχρονο forum για παράδειγμα. Το πιο πιθανό είναι ότι βασίζεται σε μια έτοιμη πλατφόρμα forum όπως το vBulletin ή το phpBB. Σαν επισκέπτες μπορείτε να διαμορφώσετε την εμφάνιση των σελίδων επιλέγοντας πόσες δημοσιεύσεις θα βλέπετε ανά σελίδα, τον τρόπο ταξινόμησης των δημοσιεύσεων (χρονολογικά, κατά νήμα, κατά συγγραφέα) και έχετε την δυνατότητα να βλέπετε σε μια σελίδα δημοσιεύσεις που πληρούν συγκεκριμένα κριτήρια κάνοντας μια έρευνα κ.α.. Από την άλλη πλευρά, ο διαχειριστής του forum, ο οποίος δεν χρειάζεται να γνωρίζει τίποτα από HTML εφόσον ρυθμίσει αρχικά την πλατφόρμα, μπορεί να ξεκουράζεται. Οι δημοσιεύσεις αναρτούνται και προστίθενται στην κεντρική πλοήγηση (navigation) του forum αυτόματα. Έχει την δυνατότητα δε να αλλάξει καθολικά την εμφάνιση του forum μέσα σε μερικά λεπτά, χωρίς να επηρεαστεί το περιεχόμενο, το οποίο είναι ασφαλώς αποθηκευμένο μέσα σε μια βάση δεδομένων, ανεξάρτητο από τα μενού πλοήγησης και τα υπόλοιπα χαρακτηριστικά εμφάνισης του site.
Όλα αυτά είναι ουσιαστικά υλοποιήσιμα επειδή το περιεχόμενο είναι ασφαλώς αποθηκευμένο σε βάσεις δεδομένων, ανεξάρτητο από τα μενού πλοήγησης και τα υπόλοιπα χαρακτηριστικά εμφάνισης του site.
Διαδικασία ανάκτησης σελίδας HTML/PHP με κλήσεις MySQL. Ο επισκέπτης γράφει την διεύθυνση της σελίδας που επιθυμεί να επισκεφτεί (1). Στο παράδειγμα ο browser θα ζητήσει την σελίδα page1.html από τον server www.samplehost.com. Ο web server λαμβάνει την αίτηση (2) και ζητά το αρχείο της σελίδας από τον σκληρό δίσκο (3). Εφόσον το αρχείο αυτό έχει την κατάληξη php ο web server υποθέτει ότι ανάμεσα σε κώδικα HTML το αρχείο page1.php περιέχει και τμήματα κώδικα PHP και έτσι στέλνει το αρχείο στον PHP interpreter (4). Ο PHP interpreter εντοπίζει τα κομμάτια κώδικα PHP ανάμεσα στον υπόλοιπο κώδικα και τα εκτελεί. Επειδή κατά την μετάφραση του κώδικα υπάρχει κάποια κλήση προς την βάση DB_1 στον MySQL server, το process του interpreter συνδέεται με τον MySQL server και στέλνει την σχετική αίτηση (5). Ο MySQL server εκτελεί την αίτηση και επιστρέφει τα αποτελέσματα στον PHP interpreter (6). Τα βήματα (5) και (6) επαναλαμβάνονται για κάθε κλήση MySQL μέσα στο page1.php. Όταν η μετάφραση του κώδικα τελειώσει, ο interpreter επιστρέφει στον web server το αρχείο page1.php αλλαγμένο (7). Το νέο αρχείο δεν περιέχει κώδικα PHP πλέον, αλλά κάθε κομμάτι τέτοιου κώδικα έχει αντικατασταθεί με τα αποτελέσματα των εντολών echo που περιέχονταν στο κομμάτι. Ο web server στέλνει το νέο αρχείο που περιέχει μόνο κώδικα HTML στον browser του επισκέπτη (8). Ο browser μεταγλωττίζει τον κώδικα αυτό και παρουσιάζει την σελίδα (9).Για να έχει ανάλογα χαρακτηριστικά, επιλέξαμε το δικό μας project να είναι ένα λειτουργικό βιβλίο επισκεπτών (guestbook). Έτσι, πέρα από πρακτικό (real world), το guestbook είναι και εξαιρετικό παράδειγμα γιατί μελετώντας το μπορεί κάποιος να καταλάβει τον τρόπο λειτουργίας πολύ πιο πολύπλοκων πλατφόρμων όπως τα fora, τα blogs, τα wikis και τα διάφορα άλλα CMS.

Διαχείριση βάσεων MySQL μέσω PHP

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

Όνομα & Σύνταξη Περιγραφή

mysql_connect (διευθ_server, username, password)

Ανοίγει σύνδεση με τον MySQL server. Υποχρεωτικά πρέπει να συμπληρωθούν ως παράμετροι η διεύθυνση του server, το username και το password του λογαριασμού σας στον server. Η mysql_connect λειτουργεί ως συνάρτηση επιστρέφοντας σαν αποτέλεσμα μια τιμή που χρησιμεύει σαν αναφορά στην συγκεκριμένη σύνδεση. Στην πράξη η τιμή αυτή αποθηκεύεται συνήθως σε μια μεταβλητή και δίνεται ως παράμετρος σύνδεση σε άλλες σχετικές με MySQL εντολές που ζητούν να διευκρινιστεί η σύνδεση που θέλετε να χρησιμοποιήσετε.

mysql_select_db (όνομα_βάσης, σύνδεση)

Επιλέγει μια συγκεκριμένη βάση για χρήση αφού έχει γίνει σύνδεση με τον MySQL server. Δέχεται ως παραμέτρους, το όνομα της βάσης και την σύνδεση που αναφέραμε στην περιγραφή της mysql_connect. Και οι δύο είναι υποχρεωτικές.

mysql_query (αίτηση_mysql, σύνδεση)

Η συνάρτηση αυτή δέχεται ως παράμετρο μια αίτηση (εντολή) MySQL και την διοχετεύει μέσω της σύνδεσης σύνδεση στην MySQL. H MySQL εκτελεί την αίτηση στην βάση που έχει επιλεγεί μέσω της mysql_select_db. Όταν η εντολή MySQL είναι SELECT, DESCRIBE ή άλλες εντολές που επιστρέφουν αποτελέσματα η mysql_query επιστρέφει τα αποτελέσματά τους ή την Boolean τιμή False αν η εκτέλεση της εντολής αποτύχει. Όταν η εντολή MySQL είναι INSERT, UPDATE, DELETE, DROP ή οποιαδήποτε άλλη που δεν επιστρέφει αποτελέσματα, η συνάρτηση mysql_query επιστρέφει TRUE αν η εντολή εκτελεστεί με επιτυχία ή FALSE σε αντίθετη περίπτωση.

mysql_result (αποτελέσματα, γραμμή, στήλη)

Τα αποτελέσματα που επιστρέφει η mysql_query είναι σε μορφή πίνακα δύο διαστάσεων όπως ακριβώς οι πίνακες MySQL που είδαμε στο 1ο μέρος του tutorial. Οι πίνακες αυτοί δεν ανήκουν σε κάποιο συνήθη τύπο δεδομένων της PHP και συνεπώς δεν είναι άμεσα προσπελάσιμοι σε αυτήν. Η συνάρτηση mysql_result χρησιμοποιείται για την ανάγνωση αυτών των πινάκων. Δέχεται ως παράμετρο τον πίνακα αποτελεσμάτων μιας mysql_query και επιστρέφει το περιεχόμενο ενός συγκεκριμένου κελιού. Οι συντεταγμένες του κελιού αυτού δίνονται και αυτές ως παράμετροι. Έχετε υπόψη ότι οι συντεταγμένες αυτές ξεκινούν από το 0 και όχι από το 1 και έτσι π.χ. οι συντεταγμένες του 3ου κελιου της πρώτης γραμμής είναι (0,2). Ακόμα, στην παράμετρο στήλη μπορεί να συμπληρωθεί αντί του αριθμού στήλης το όνομά της.

mysql_num_rows (αποτελέσματα)

Η συνάρτηση αυτή επιστρέφει τον αριθμό γραμμών του πίνακα αποτελεσμάτων που επέστρεψε μια mysql_query.

Για να δείτε τις εντολές αυτές στην πράξη και να κατανοήσετε την λειτουργία τους καλύτερα πληκτρολογήστε και σώστε το παρακάτω παράδειγμα ως dbdemo.php και αφού «σηκώσετε» τους απαραίτητους server στο XAMPP Control Panel, δοκιμάστε το στον browser σας (απαραίτητη για την λειτουργία του παραδείγματος είναι η βάση moviescollection που δημιουργήσατε στο 1ο μέρος του tutorial. Επίσης, αν έχετε αλλάξει το συνθηματικό του χρήστη root στην MySQL μέσω της επιλογής security στην κεντρική σελίδα του XAMPP, πράγμα που προτείνεται για λόγους ασφαλείας των βάσεών σας, αλλάξτε ανάλογα την γραμμή 4 του script.):

<?php
  $dbhost = "localhost";
  $dbuser = "root";
  $dbpass = "";
  $dbname = "moviescollection";
  $dbconnection = mysql_connect($dbhost, $dbuser, $dbpass);
  mysql_select_db($dbname, $dbconnection);
  $query = "SELECT MovieName, Rating, ReleaseYear FROM movies WHERE ReleaseYear > 1990 ORDER BY ReleaseYear";
  $results = mysql_query($query, $dbconnection);
  $numberofresults = mysql_num_rows($results);
  echo "Found " . $numberofresults . "  movies that were released after 1990.<br>";
  echo "In chronological order these are:<br>";
  for ($i=0; $i < $numberofresults; $i = $i + 1)
  {
    $moviename = mysql_result($results, $i, 0);
    $rating = mysql_result($results, $i, "Rating");
    $ryear = mysql_result($results, $i, 2);
    echo $i + 1 . " - <b>" . $moviename . "</b>, released in year " . $ryear . " and rated " . $rating . ".<br>";
  }  
?>

Ο κώδικας HTML που επιστρέφει η PHP μετά την μετάφραση του κώδικα στο dbdemo.php. Σε αντιστοιχία με την πρώτη εικόνα, αυτός είναι ο κώδικας που επιστρέφει στον web server o PHP interpreter στο βήμα 7 και ο ίδιος που στέλνει ο web server στον browser του επισκέπτη στο βήμα 8.Το script αυτό παρουσιάζει σε μια σελίδα όλες τις ταινίες του πίνακα movies της βάσης moviescollection οι οποίες προβλήθηκαν μετά το 1990. Ο κώδικας είναι απλός και αν έχετε διαβάσει τα δύο προηγούμενα μέρη του tutorial μπορείτε εύκολα με την βοήθεια του παραπάνω Ο ίδιος κώδικας (της δεύτερης εικόνας) μεταφρασμένος στον browser (βήμα 9 της πρώτης εικόνας).πίνακα εντολών να τον ερμηνεύσετε. Προσέξτε μόνο τον διαφορετικό τρόπο με τον οποίο δηλώνεται η παράμετρος στήλη στις δύο mysql_result των γραμμών 16-17. Παρατηρήστε επίσης ότι ως επισκέπτης της σελίδας, ζητώντας το page source από τον browser σας, δεν έχετε την δυνατότητα να δείτε τον κώδικα PHP που την δημιούργησε αλλά μόνο τα αποτελέσματα των εντολών echo και έτσι οι γραμμές 3,4 δεν «προδίδουν» απόρρητα δεδομένα στους επισκέπτες σας.

Προετοιμασία για το βιβλίο επισκεπτών

Αρχικά δημιουργήστε μια νέα βάση με όνομα guestbook για να βάλετε μέσα τους πίνακες που χρειάζονται. Οι πίνακες αυτοί θα είναι τρεις. Ο πίνακας comments θα είναι ο κύριος πίνακας όπου θα αποθηκεύεται το περιεχόμενο του guestbook, δηλαδή το όνομα και το email των επισκεπτών (εφόσον το δηλώσουν) μαζί με το σχόλιό τους, όπως επίσης και η ημερομηνία και ώρα της καταχώρησης του κάθε σχολίου. Ο πίνακας settings όπου θα αποθηκεύονται κάποιες ρυθμίσεις εμφάνισης καθώς και ο κωδικός διαχείρισης του guestbook. Τέλος, επειδή η σελίδα θα εμφανίζει ένα μετρητή εμφανίσεων, χρειάζεται να δημιουργήσετε και τον (εκφυλισμένο σε ένα κελί) πίνακα counter ώστε να αποθηκεύεται ο αριθμός εμφανίσεων της σελίδας. Ανοίξτε λοιπόν το MySQL Monitor και πληκτρολογήστε τις παρακάτω εντολές για να δημιουργήσετε την βάση και τους πίνακες:

CREATE DATABASE guestbook;

USE guestbook;

CREATE TABLE comments (
autoID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50), email VARCHAR(150),
comment TEXT, date INT UNSIGNED);

CREATE TABLE settings (
pass VARCHAR(16), title VARCHAR(100),
showhits TINYINT, bgcolor VARCHAR(7),
tablecolor1 VARCHAR(7), tablecolor2 VARCHAR(7),
tablebordercolor VARCHAR(7));

CREATE TABLE counter (hits BIGINT UNSIGNED);

Οι περιγραφές των πινάκων της βάσης guestbook από το MySQL Monitor. Παρατηρήστε ότι στους πίνακες settings και counter δεν έχει οριστεί πρωτεύον κλειδί αφού οι πίνακες αυτοί προορίζονται για αποθήκευση μιας μόνο εγγραφής.Παρατηρήστε ότι για την αποθήκευση ημερομηνίας και ώρας χρησιμοποιείται η στήλη date του πίνακα comments η οποία δηλώθηκε ως ακέραιος αριθμός αντί να δηλωθεί με κάποιο έτοιμο τύπο πεδίου της MySQL για αποθήκευση χρονικών στιγμών όπως οι DATE, TIME, TIMESTAMP κλπ. Αυτό γίνεται επειδή η PHP χειρίζεται πολύ πιο εύκολα χρονικές στιγμές αποθηκευμένες ως ακέραιους αριθμούς οι οποίοι αντιπροσωπεύουν τον αριθμό δευτερολέπτων που έχουν περάσει από την ώρα 0:00GMT της 1ης Ιανουαρίου του 1970 μέχρι την δεδομένη στιγμή.
Στην συνέχεια, για να δώσετε τις αρχικές ρυθμίσεις στο guestbook σας, πληκτρολογήστε τις ακόλουθες εντολές:

INSERT INTO settings VALUES (
"dhacker", "My Guestbook", 1, "#CCFFCC", 
"#CCFFFF", "#CCCCFF", "#CCCCFF");

INSERT INTO counter VALUES (0);

Αν και η προετοιμασία της βάσης τελείωσε, είναι καλή πρακτική να αφήνετε το MySQL Monitor ανοικτό για να επαληθεύετε αργότερα την σωστή λειτουργία των script.

Ο κώδικας

Το βιβλίο επισκεπτών αποτελείται από 3 αρχεία PHP. Το πρώτο, gb.php, θα είναι η κύρια σελίδα που θα εμφανίζει την φόρμα υποβολής σχολίου καθώς και τα υπάρχοντα σχόλια των επισκεπτών. Το gb_admin.php θα είναι η σελίδα όπου εσείς σαν διαχειριστές του βιβλίου θα μπορείτε να αλλάζετε ορισμένες ρυθμίσεις που αφορούν την εμφάνισή του. Τέλος, το gb_config.php θα περιέχει πληροφορίες σχετικές με την πρόσβαση στον MySQL server (ακριβώς όπως οι γραμμές 2-5 στο dbdemo.php) οι οποίες, επειδή είναι κοινές για όλο το project, θα καλούνται από κάθε άλλο PHP script.

Το gb_config.php

Επειδή το μικρό αυτό script είναι απαραίτητο για την λειτουργία των άλλων δύο, αρχίστε από αυτό. Ο κώδικάς του είναι:

<?php
  $db_host = "localhost";
  $db_user = "root";
  $db_password = "";
  $db_name = "guestbook";
?>

Όπως βλέπετε δεν είναι τίποτα άλλο από ανάθεση τιμών σε 4 μεταβλητές οι οποίες θα χρησιμοποιούνται συχνά. Ισχύουν τα ίδια σχόλια που κάναμε για τις γραμμές 2-5 του dbdemo.php. To script αυτό είναι πολύ πρακτικό όταν δημιουργείτε ένα site με πολλές σελίδες που χρησιμοποιούν τον MySQL server. Για παράδειγμα, σε περίπτωση που αλλάξετε password στον χρήστη root της MySQL, αντί να κάνετε αλλαγές σε όλες σας τις σελίδες ώστε να ενημερωθούν σχετικά με την αλλαγή, εσείς θα αλλάξετε μόνο μια γραμμή μέσα στο db_config.php.

Το gb.php

Η κύρια σελίδα του βιβλίου επισκεπτών, έχει ως εξής:

<?php
  Require "gb_config.php";
  $mysqlconnection = mysql_connect($db_host, $db_user, $db_password);
  mysql_select_db($db_name, $mysqlconnection);
  $query = "SELECT * from settings";
  $results = mysql_query($query, $mysqlconnection);
  $gbtitle = mysql_result($results, 0, "title");
  $showhits = mysql_result($results, 0, "showhits");
  $bgcolor = mysql_result($results, 0, "bgcolor");
  $tcolor1 = mysql_result($results, 0, "tablecolor1");
  $tcolor2 = mysql_result($results, 0, "tablecolor2");
  $tcolorb = mysql_result($results, 0, "tablebordercolor");
  if (strlen($_POST["submit"]) > 0)
  {
    $name = $_POST["txt_name"];
    $email = $_POST["txt_email"];
    $comment = $_POST["txt_comment"];
    if ((strlen($name) != 0) and (strlen($comment) != 0))
    {
      $date = time();
      $query = "INSERT INTO comments VALUES (NULL, '$name', '$email', '$comment', $date)";
      mysql_query($query, $mysqlconnection);
    }
    elseif (strlen($name) == 0)
    {
      $error = "Απαραίτητη η συμπλήρωση ονόματος";
    }
    else
    {
      $error = "Πρέπει να γράψετε ένα σχόλιο";
    }
  }
?>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title><?php echo $gbtitle ?></title>
  </head>
  <body bgcolor="<?php echo $bgcolor ?>">
    <center>
      <h1><?php echo $gbtitle ?></h1>
      <?php
        $query = "SELECT * FROM counter";
        $results = mysql_query($query, $mysqlconnection);
        $hits = mysql_result($results, 0, "hits");
        $hits = $hits + 1;
        $query = "UPDATE counter SET hits='" . $hits . "'";
        mysql_query($query, $mysqlconnection);
        if ($showhits == 1) 
        {
          echo "<h3>" . $hits . " εμφανίσεις</h3>";
        } 
      ?>
      <form action="gb.php" method="POST">
        <font face="arial" size="1">
          Σχόλιο: <br>
          <textarea style="width: 75%" rows="10" name="txt_comment"><?php echo $comment ?></textarea><br><br>
          Όνομα: <input type="text" name="txt_name" size=30 maxlength=50 value="<?php echo $name ?>">&nbsp&nbsp&nbsp
          Email: <input type="text" name="txt_email" size=60 maxlength=150 value="<?php echo $email ?>"><br><br>
          <?php echo $error ?>
          <input type="submit" name="submit" value="Αποστολή">
        </font>
      </form>
      <br><br>
      <table bgcolor=<?php echo $tcolorb ?> border="0" width="75%" cellspacing="2" cellpadding="2">
        <?php
          $query = "SELECT * FROM comments ORDER BY date DESC";
          $results = mysql_query($query, $mysqlconnection);
          for ($i = 0; $i < mysql_num_rows($results); $i = $i + 1)
          {
            $name = mysql_result($results, $i, "username");
            $email = mysql_result($results, $i, "email");
            $comment = nl2br(mysql_result($results, $i, "comment"));
            $datetime = mysql_result($results, $i, "date");
            $date = date("d/m/Y", $datetime);
            $time = date("G:i:s", $datetime);
            if ($i % 2)
            {
              $tablebgcolor = $tcolor1;
            }
            else
            {
              $tablebgcolor = $tcolor2;
            }
            if (strlen($email) > 0)
            {
              $name = '<a href="mailto:' . $email . '">' . $name . '</a>';
            }
            echo '<tr valign="top" bgcolor="' . $tablebgcolor . '">
                    <td width="100%">
                      <font face="arial" size="2">
                        <b>Ο/Η επισκέπτης ' . $name . ' έγραψε:</b><br>' . $comment . '
                      </font>
                    </td>
                    <td width="1%">
                      <font face="arial" size="2">
                        <b>Ημερομηνία<br></b>' . $date . '<br><b>Ώρα</b><br>' . $time . '
                      </font>
                    </td>
                  </tr>';            
          }          
        ?>
      </table>
    </center>
  </body>
</html>

Η σελίδα ξεκινά με κώδικα PHP όπως φαίνεται από την γραμμή 1. Στην 2 καλείται το gb_config.php ώστε να εκτελεσθεί ο κώδικάς του και να ανακτηθούν οι σχετικές με την σύνδεση MySQL πληροφορίες. Αυτές χρησιμοποιούνται άμεσα στις γραμμές 3-4 όπου πραγματοποιείται η σύνδεση της PHP με τον MySQL server και επιλέγεται η βάση guestbook για χρήση. Στις γραμμές 5-6 η PHP ανακτά τις ρυθμίσεις του βιβλίου επισκεπτών από τον πίνακα settings της βάσης και τις αναθέτει ως τιμές σε μεταβλητές στις γραμμές 7-12 για να χρησιμοποιηθούν αργότερα.
Η σελίδα, όπως θα δείτε παρακάτω στην συνέχεια της περιγραφής του κώδικα, εμφανίζει μια φόρμα (γρ. 55-63) που προτρέπει τον επισκέπτη να στείλει το σχόλιό του. Κατά την υποβολή της φόρμας, η σελίδα στέλνει το σχόλιο και τα στοιχεία του επισκέπτη στον εαυτό της ως παραμέτρους με την μέθοδο POST. Στέλνει επίσης την παράμετρο submit με τιμή “Αποστολή” (γρ. 61). Αυτό το τελευταίο γίνεται ώστε κατά την κλήση της σελίδας, το script να μπορεί να ελέγξει αν η σελίδα καλείται από τον επισκέπτη ή αν καλείται από τον εαυτό της μετά από υποβολή σχολίου. Αν ισχύει το πρώτο δεν θα υπάρχουν παράμετροι POST ενώ αν ισχύει το δεύτερο θα υπάρχει σίγουρα η παράμετρος submit με τιμή το αλφαριθμητικό “Αποστολή”.
Γυρίστε τώρα στην γραμμή 13 όπου έμεινε η περιγραφή. Σε αυτήν γίνεται ο έλεγχος που μόλις περιγράφηκε πιο πάνω μέσω μιας εντολής if. Όταν η παράμετρος submit στα δεδομένα POST έχει την τιμή “Αποστολή” τότε (και μόνον τότε) το μήκος της τιμής της παραμέτρου θα είναι αυστηρά θετικό ώστε σύμφωνα με τον έλεγχο if να εκτελεστούν οι γραμμές 15-31. Οι γραμμές αυτές λοιπόν θα εκτελεστούν μόνο όταν η σελίδα έχει κληθεί από τον εαυτό της αφού κάποιος επισκέπτης υπέβαλε σχόλιο. Το σχόλιο αυτό πρέπει να αποθηκευθεί στην βάση οπότε το σχόλιο μαζί με το όνομα και το email του επισκέπτη ανακτούνται από τα δεδομένα POST και αποθηκεύονται σε μεταβλητές στις γραμμές 15-17. Επειδή δεν επιτρέπεται η καταχώρηση σχολίου αν ο επισκέπτης έχει ξεχάσει να συμπληρώσει το όνομά του ή το σχόλιο (ενώ η συμπλήρωση email δεν είναι υποχρεωτική) στην γραμμή 18 ελέγχεται σε μια νέα φωλιασμένη if αν το μήκος το ονόματος και του σχολίου είναι μη μηδενικά. Αν είναι, αυτό σημαίνει ότι το όνομα και το σχόλιο έχουν συμπληρωθεί από τον επισκέπτη και πραγματοποιείται η εκτέλεση των γραμμών 20-22 όπου μέσω της σύνδεσης με τον MySQL server προστίθεται το νέο σχόλιο μαζί με τα παρεχόμενα στοιχεία του επισκέπτη και την τρέχουσα ημερομηνία και ώρα στον πίνακα comments της βάσης guestbook. Παρατηρήστε ότι η mysql_query στην γραμμή 22, που είναι υπεύθυνη για την καταχώρηση της νέας εγγραφής στον πίνακα μεταβιβάζοντας μια εντολή INSERT στον MySQL server, συντάχθηκε ως εντολή και όχι ως συνάρτηση (όπως έγινε στην mysql_query της γραμμής 6 που μεταβιβάζει εντολή SELECT) αφού τώρα δεν αναμένονται αποτελέσματα. Ωστόσο οι γραμμές 20-22 δεν εκτελούνται και καμιά εγγραφή δεν εισάγεται στην βάση αν ο έλεγχος υπόθεσης της γραμμής 18 αποτύχει. Συγκεκριμένα οι elseif και else των γραμμών 24 και 28 αντίστοιχα φροντίζουν ώστε η μεταβλητή $error να πάρει την κατάλληλη τιμή ανάλογα με το αν ο επισκέπτης της σελίδας ξέχασε να εισάγει το όνομά του ή το σχόλιο. Στην γραμμή 33 δηλώνεται το τέλος του κώδικα PHP και μέχρι αυτό το σημείο η σελίδα που θα επιστραφεί από τον PHP interpreter στον web server δεν θα περιέχει τίποτα αφού δεν έχει χρησιμοποιηθεί καθόλου η εντολή echo.
Τμήμα κώδικα του gb.php στο PSPad. Για σωστή εμφάνιση των ελληνικών ρυθμίστε τον editor σας να αποθηκεύει με χρήση της κωδικοσελίδας UTF-8.Αυτό αλλάζει στην γραμμή 34 όπου ξεκινά πλέον κώδικας HTML. Στις γραμμές 35-38 βρίσκεται το τμήμα <head> της σελίδας, όπου δηλώνεται η κωδικοσελίδα και ο τίτλος της. Θυμηθείτε ότι ο τίτλος της σελίδας είναι ρυθμιζόμενος και όχι σταθερός. Το script έχει ανακτήσει τον επιλεγμένο τίτλο από την βάση και τον έχει αποθηκεύσει στην μεταβλητή $gbtitle (γρ. 6-7). Έτσι στην γραμμή 37 και ενώ πλέον ο κώδικας είναι HTML, γίνεται μια «σύντομη βουτιά» ξανά στην PHP ώστε να τυπωθεί στην σελίδα η τιμή της $gbtitle, δηλαδή ο τίτλος της. Αυτές οι «σύντομες βουτιές», όπου εν μέσω HTML κώδικα ανοίγει και κλείνει το <?php> tag σε μια γραμμή, είναι πολύ πρακτικές και χρησιμοποιούνται συχνά συνήθως για να τυπώνεται η τιμή μιας μεταβλητής όπως έγινε και στην γραμμή 37. Έτσι στην γραμμή 39, όπου ξεκινά το τμήμα <body> της σελίδας, επαναλαμβάνεται η ίδια μέθοδος για να τυπωθεί το επιλεγμένο χρώμα φόντου της σελίδας. Και ξανά στην γραμμή 41 για την εμφάνιση του τίτλου στο κέντρο της κορυφής της σελίδας.
Στις γραμμές 42-53, οι οποίες αφορούν αποκλειστικά τον μετρητή εμφανίσεων της σελίδας, γίνεται επιστροφή σε κώδικα PHP. Το script στέλνει μια αίτηση SELECT (γρ. 43) στον MySQL server (γρ. 44) ώστε να ανακτήσει τον μέχρι στιγμής αριθμό εμφανίσεων από τον πίνακα counter. Αποθηκεύει τον αριθμό αυτό στην μεταβλητή $hits (γρ. 45) και αφού τον αυξήσει κατά ένα (γρ. 46) στέλνει μια νέα αίτηση, αυτή την φορά UPDATE (γρ. 47), ώστε να ενημερώσει τον μετρητή για τον νέο αριθμό εμφανίσεων (γρ. 48). Ακολουθεί έλεγχος της ρύθμισης (γρ. 49) σχετικά με το αν θα εμφανίζεται ο μετρητής στην σελίδα η οποία είναι αποθηκευμένη στην μεταβλητή $showhits (γρ. 8). Αν η τιμή της τελευταίας είναι 1 τότε τυπώνεται στην σελίδα ο αριθμός εμφανίσεων (γρ. 51).
Αφού κλείσει το PHP tag η σελίδα επιστρέφει σε κώδικα HTML από την γραμμή 54 όπου ξεκινά η φόρμα υποβολής σχολίου. Δείτε πάλι τις «σύντομες βουτιές» σε PHP στις γραμμές 57-60. Αν ο επισκέπτης έχει μόλις καλέσει την σελίδα για πρώτη φορά οι μεταβλητές $comment, $name, $email και $error δεν θα έχουν πάρει τιμή και έτσι οι echo των γραμμών αυτών δεν θα τυπώσουν τίποτα. Έτσι η σελίδα θα εμφανίσει μια άδεια φόρμα έτοιμη προς συμπλήρωση. Αν όμως ο επισκέπτης έχει μόλις πατήσει το κουμπί «Αποστολή» της φόρμας και η σελίδα έχει καλέσει τον εαυτό της τότε ανάλογα με το αν ο επισκέπτης συμπλήρωσε επαρκώς η ελλιπώς την φόρμα, κάποιες από τις εν λόγω μεταβλητές θα έχουν πάρει τιμή στις γραμμές 15,16,17,26 και 30. Με τον τρόπο αυτό, αν ο επισκέπτης λόγου χάρη χάσει χρόνο εισάγοντας ένα εκτενές σχόλιο αλλά ξεχάσει να γράψει το όνομά του πριν πατήσει το κουμπί «Αποστολή», η σελίδα θα του συγχωρήσει το λάθος του εμφανίζοντας αυτόματα το σχόλιό και το email του (αν το είχε συμπληρώσει πριν) ξανά και παραπέμποντάς τον να εισάγει πλέον μόνο το όνομά του που είναι αναγκαίο.
Στην γραμμή 61 προστίθεται το κουμπί «Αποστολή», με το οποίο καλείται ξανά η σελίδα (αφού έτσι ορίζει η δήλωση της φόρμας στην γραμμή 54) μαζί όμως με δεδομένα POST που περιέχουν τα στοιχεία που συμπλήρωσε ο επισκέπτης στην φόρμα και την παράμετρο submit η οποία μελετήθηκε νωρίτερα κατά τον έλεγχο if της γραμμής 13. Αυτό είναι και το τελευταίο στοιχείο της φόρμας η οποία κλείνει στην γραμμή 63.
Στην γραμμή 65, με ένα <table> tag, δηλώνεται ο πίνακας HTML που θα εμφανίζει τα υπάρχοντα σχόλια προηγούμενων επισκεπτών. Μέσω PHP, μέσα στο tag, τυπώνεται το χρώμα των συνόρων του πίνακα ($tcolorb, γρ. 12) με τον ίδιο τρόπο που τυπώθηκε το χρώμα φόντου μέσα στο <body> tag νωρίτερα στην γραμμή 39.
Το βιβλίο επισκεπτών σε δράση. Όπως βλέπετε οι επισκέπτες μπορούν να εισάγουν links και αναφορές σε βίντεο. Ουσιαστικά μπορούν να εισάγουν οτιδήποτε μπορεί κάποιος να εισάγει σε μια σελίδα με χρήση HTML και Javascript. Αυτό, εκ πρώτης όψεως μπορεί να σας φαίνεται σαν ένα πολύ καλό feature αλλά δεν είναι γιατί ένας κακόβουλος επισκέπτης μπορεί να εισάγει ως σχόλιο κώδικα που κάνει το βιβλίο επισκεπτών σας να δυσλειτουργεί. Ο τρόπος που μπορείτε να το αποφύγετε αυτό αφήνεται ως άσκηση ;-).Στην 66 γίνεται επιστροφή για άλλη μια φορά σε κώδικα PHP. Το script τώρα ανακτά από την βάση με μια αίτηση SELECT όλον τον πίνακα comments με τις εγγραφές του ταξινομημένες χρονολογικά και τον αποθηκεύει στην $results (γρ. 67-68). Μετά ξεκινά ένας βρόγχος for (γρ. 69) όπου η βοηθητική μεταβλητή $i παίρνει αρχικά την τιμή 0 και αυξάνει κατά ένα σε κάθε επανάληψη. Ο βρόγχος επαναλαμβάνει την εκτέλεση του κώδικα των γραμμών 71-100 μια φορά για κάθε γραμμή του πίνακα comments αφού σταματά μόνο όταν η $i, αυξανόμενη, φτάσει των αριθμό γραμμών του πίνακα αποτελεσμάτων $results. Κάθε γραμμή του πίνακα όμως είναι ένα σχόλιο χρήστη και συνεπώς ο βρόγχος επαναλαμβάνεται για κάθε σχόλιο.
Για το $i σχόλιο λοιπόν οι γραμμές 71-74 αναθέτουν σε μεταβλητές το όνομα του σχολιαστή, το email του, το ίδιο το σχόλιο και τον ακέραιο αριθμό που αντιπροσωπεύει την στιγμή καταχώρησης του σχολίου. Στις 75-76 ο αριθμός αυτός μετατρέπεται σε αναγνώσιμη ημερομηνία και ώρα και αποθηκεύεται σε νέες μεταβλητές. Η χρήση της συνάρτησης nl2br στην γραμμή 73 γίνεται επειδή τα σχόλια αναμένεται να περιέχουν χαρακτήρες newline δηλαδή αναμένεται οι επισκέπτες να πατούν το πλήκτρο Enter κατά την σύνταξη σχολίου για να αλλάξουν γραμμή. Χωρίς αυτήν όταν αργότερα το σχόλιο θα τυπωθεί στην σελίδα, θα εμφανίζεται σε μια γραμμή και όχι όπως το εισήγαγε ο επισκέπτης.
Στον έλεγχο if-else που ακολουθεί (γρ. 77-84) ελέγχεται με χρήση του τελεστή % αν ο αριθμός σχολίου $i είναι περιττός ή άρτιος και δίνει στην μεταβλητή $tablebgcolor την τιμή της ρύθμισης $tcolor1 ή $tcolor2 (βλ. γραμμές 10-11) αντίστοιχα. Το $tablebgcolor θα χρησιμοποιηθεί αργότερα για να χρωματίσει το φόντο της γραμμής του πίνακα HTML που θα τυπωθεί και έτσι ο πίνακας αυτός θα έχει χρώμα που θα εναλλάσσεται μεταξύ του $tcolor1 και του $tcolor2 σε κάθε του γραμμή.
Ακολουθεί άλλος ένας έλεγχος if στον οποίο ελέγχεται το μήκος της $email (γρ. 85). Αν αυτό είναι θετικό, οπότε ο επισκέπτης είχε δηλώσει διεύθυνση email κατά την καταχώρηση του σχολίου του, η μεταβλητή $name αλλάζει ώστε να μην είναι ένα απλό όνομα αλλά ένα mailto link που παραπέμπει στο email του επισκέπτη (γρ. 87).
Αμέσως μετά είναι οι γραμμές 89-100 που περιέχουν μια μόνο εντολή echo όπως δηλώνεται από τον χαρακτήρα τερματισμού ; στο τέλος της γραμμής 100. Η echo αυτή αναλαμβάνει να τυπώσει στην σελίδα κώδικα HTML, ο οποίος θα εμφανίζει μια γραμμή στον πίνακα HTML που δηλώθηκε στην γραμμή 65. Η γραμμή αυτή, που δηλώνεται με το HTML tag <tr>, χρωματίζεται με την χρήση της $tablebgcolor όπως αυτή πήρε τιμή στις γραμμές 79 ή 83 και περιγράφηκε παραπάνω. Στην γραμμή δημιουργούνται με χρήση του HTML tag <td> δύο στήλες. Στην πρώτη τυπώνεται η $name και η $comment ενώ στην δεύτερη η $date και η $time.
Στην επόμενη γραμμή ο βρόγχος κλείνει και έτσι όταν η υπόθεση της for πάψει να ισχύει και η εκτέλεση του κώδικα ξεφύγει από τον βρόγχο, στην σελίδα έχει τυπωθεί ένας ολόκληρος πίνακας HTML που περιέχει όμορφα μορφοποιημένα όλα τα σχόλια των επισκεπτών. Το βιβλίο επισκεπτών σας είναι έτοιμο για χρήση.

Το gb_admin.php

Το gb_admin όπως φαίνεται στον browser. Αν θέλετε οι αλλαγές που θα κάνετε στις ρυθμίσεις να μην αγνοηθούν μην ξεχάσετε να εισάγετε το password που είναι αποθηκευμένο στη στήλη pass του πίνακα settings της βάσης σας.Επειδή σε κανένα site ο διαχειριστής δεν χρειάζεται να ανοίξει το MySQL Monitor για να αλλάξει κάποια ρύθμιση, έτσι και στο δικό σας βιβλίο επισκεπτών είναι χρήσιμη μια σελίδα η οποία θα δίνει την δυνατότητα σε εσάς μόνο, ως διαχειριστή, να αλλάζετε τις ρυθμίσεις του βιβλίου. Τον ρόλο αυτό αναλαμβάνει το gb_admin.php. Το script που περιέχει αναλαμβάνει να εμφανίσει μια φόρμα με τις υπάρχουσες ρυθμίσεις. Τις ρυθμίσεις αυτές μπορείτε να αλλάξετε και στην συνέχεια να υποβάλετε την φόρμα, αφού όμως πρώτα εισάγετε και τον κωδικό διαχειριστή του βιβλίου επισκεπτών στον οποίο δώσατε ως αρχική τιμή το αλφαριθμητικό «dhacker» κατά την εισαγωγή αρχικών τιμών στον πίνακα settings. Έτσι, αφού υποβάλετε την φόρμα η σελίδα καλεί τον εαυτό της περνώντας τις νέες ρυθμίσεις ως παραμέτρους POST όμοια με το gb.php. Η σελίδα ελέγχει αν ο κωδικός διαχειριστή που εισάγατε συμφωνεί με αυτόν που είναι αποθηκευμένος στην στήλη pass του πίνακα settings και αν αυτό ισχύει αποθηκεύει στον πίνακα τις νέες ρυθμίσεις.
Μια πλήρως σχολιασμένη υλοποίηση των παραπάνω είναι ο κώδικας που ακολουθεί. Αποθηκεύστε τον ως gb_admin.php. Εναλλακτικά, δεν θα ήταν καθόλου κακή ιδέα, πριν σπεύσετε να τον πάρετε έτοιμο, να προσπαθήσετε να τον δημιουργήσετε μόνοι σας. Η εμπειρία που έχετε αποκομίσει από το gb.php είναι παραπάνω από επαρκής.

<?php
  // Εισαγωγή από το gb_config.php των απαραίτητων μεταβλητών για σύνδεση με την βάση.
  require "gb_config.php";
  // Σύνδεση με τον MySQL server και επιλογή της βάσης guestbook
  $mysqlconnection = mysql_connect($db_host, $db_user, $db_password); 
  mysql_select_db($db_name, $mysqlconnection);
  // Ανάκτηση password διαχειριστή βιβλίου επισκεπτών από τον πίνακα settings
  $query = "SELECT pass FROM settings";
  $results = mysql_query($query, $mysqlconnection);
  $pass = mysql_result($results, 0, 0);
  // Ανάθεση στη μεταβλητή $enteredpass του password που εισήγαγε ο χρήστης στην φόρμα.
  // Αν ο χρήστης δεν έχει υποβάλει ακόμα φόρμα, η $enteredpass παραμένει κενή αφού 
  // το $_POST["txt_pass"] δεν επιστρέφει δεδομένα.
  $enteredpass = $_POST["txt_pass"];
  // Γίνεται σύγκριση του password που εισήγαγε ο χρήστης με το password που ανακτήθηκε
  // από τον πίνακα ρυθμίσεων της βάσης.
  if ($enteredpass == $pass)
  {
    // Αν τα δύο password ταιριάζουν...
    // ...αποθηκεύονται σε μεταβλητές οι νέες ρυθμίσεις που υπάρχουν στα δεδομένα POST.
    $newgbtitle = $_POST["txt_pagename"];
    $newshowhits = $_POST["showhits"];
    $newbgcolor = $_POST["txt_bgcolor"];
    $newtcolor1 = $_POST["txt_tcolor1"];
    $newtcolor2 = $_POST["txt_tcolor2"];
    $newtcolorb = $_POST["txt_tcolorb"];
    // ...γίνεται έλεγχος αν στις νέες ρυθμίσεις έχει τσεκαριστεί η επιλογή σχετικά
    // με το αν θα εμφανίζεται ο μετρητής στην σελίδα ή όχι. Επειδή η ρύθμιση αυτή
    // αποθηκεύεται στον πίνακα settings ως ακέραιος η τιμή on (αν το αντίστοιχο
    // checkbox είναι τσεκαρισμένο) μετατρέπεται σε 1, ενώ κάθε άλλη τιμή (αν το
    // checkbox δεν έχει τσεκαριστεί) μετατρέπεται σε 0.
    if ($newshowhits == "on")
    {
      $newshowhits = 1;
    }
    else
    {
      $newshowhits = 0;
    }
    // ...δημιουργείται η αίτηση UPDATE που ενημερώνει τον πίνακα settings με τις νέες
    // ρυθμίσεις και στέλνεται στον MySQL server.
    $query = "UPDATE settings SET title='" . $newgbtitle . "', showhits=" . $newshowhits
      . ", bgcolor='" . $newbgcolor . "', tablecolor1='" . $newtcolor1 . "', tablecolor2='"
      . $newtcolor2 . "', tablebordercolor='" . $newtcolorb . "'";
    mysql_query($query, $mysqlconnection);
  }
  // Σε κάθε περίπτωση, είτε τα pasword ταίριαξαν στην if της γραμμής 17, είτε όχι,
  // πρέπει να εμφανιστεί η φόρμα με τις ρυθμίσεις.
  // Ανάκτηση όλων των ρυθμίσεων από τον πίνακα settings
  $query = "SELECT * FROM settings";
  $results = mysql_query($query, $mysqlconnection);
  // Αποθήκευση όλων των ρυθμίσεων σε μεταβλητές (πλην του password διαχειριστή
  // το οποίο δεν χρειάζεται στην παρούσα φάση)
  $gbtitle = mysql_result($results, 0, 1);
  $showhits = mysql_result($results, 0, 2);
  $bgcolor = mysql_result($results, 0, 3);
  $tcolor1 = mysql_result($results, 0, 4);
  $tcolor2 = mysql_result($results, 0, 5);
  $tcolorb = mysql_result($results, 0, 6);
?>
<!-- Εδώ ξεκινάει απλός κώδικας HTML και έτσι αναγκαζόμαστε να αλλάξουμε και -->
<!-- την σήμανση των σχολίων από σχόλια PHP σε σχόλια HTML.                  -->
<html>
  <!-- Το τμήμα head της σελίδας που περιέχει τον τίτλο της και την          -->
  <!-- απαραίτητη δήλωση κωδικοσελίδας.                                      -->
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Διαχείρηση Βιβλίου Επισκεπτών</title>
  </head>
  <!-- Το κύριο τμήμα της σελίδας ξεκινά εδώ.                                -->
  <body bgcolor="<?php echo $bgcolor ?>">
    <center><h1>Επιλογές Βιβλίου Επισκεπτών</h1>
    <!-- Μετά τους απαραίτητους τίτλους ξεκινά η φόρμα. Προσέξτε την χρήση   -->
    <!-- των γνώριμων πλέον inline PHP "βουτιών". Η φόρμα αναγκάζει την      -->
    <!-- να καλέσει τον εαυτό της κατά την υποβολή με την μέθοδο POST.       -->
    <form action="gb_admin.php" method="POST">
      <font face="arial" size="1">
        Τίτλος Βιβλίου Επισκεπτών <input type="text" name="txt_pagename" size=50 maxlength=100 value="<?php echo $gbtitle ?>"><br><br><br>
        Εμφάνιση αριθμού επισκέψεων <input type="checkbox" name="showhits" <?php if ($showhits == 1) {echo " checked";} ?>><br><br><br>
        Χρώμα Φόντου Σελίδας <input type="text" name="txt_bgcolor" size=7 maxlength=7 value="<?php echo $bgcolor ?>"><br>
        Χρώμα Πίνακα Σχολίων 1 <input type="text" name="txt_tcolor1" size=7 maxlength=7 value="<?php echo $tcolor1 ?>"><br>
        Χρώμα Πίνακα Σχολίων 2 <input type="text" name="txt_tcolor2" size=7 maxlength=7 value="<?php echo $tcolor2 ?>"><br>
        Χρώμα Πλαισίου Πίνακα Σχολίων <input type="text" name="txt_tcolorb" size=7 maxlength=7 value="<?php echo $tcolorb ?>"><br><br><br>
        Κωδικός διαχειριστή <input type="password" name="txt_pass" size=30 maxlength=30>
        <!-- Με το κουμπί υποβολής η φόρμα τελειώνει. Μαζί της και η σελίδα. -->
        <input type="submit" name="submit" value="Αλλαγή ρυθμίσεων"><br><br><br>
      </font>
    </form></center>
  </body>
</html>
Χαρακτηριστικά CMS

Όπως είδατε ο κώδικας της gb.php δεν έχει στατικό περιεχόμενο. Το ουσιαστικό περιεχόμενο, το οποίο εμφανίζεται στον browser σας όταν ζητάτε την σελίδα, βρίσκεται αποθηκευμένο στην βάση guestbook. Όπως ακριβώς η ίδια πλατφόρμα forum χρησιμοποιείται από χιλιάδες forum admins εμφανίζοντας φυσικά διαφορετικό περιεχόμενο σε κάθε forum, έτσι και το gb.php, με τον ίδιο κώδικα, θα εμφανίσει εντελώς διαφορετικό περιεχόμενο στον καθένα σας εφόσον οι επισκέπτες της σελίδας αρχίσουν να καταχωρούν σχόλια. Και φυσικά, αλλαγές στην εμφάνιση της σελίδας, όπως π.χ. η αλλαγή χρωμάτων, δεν απαιτούν ενημέρωση του κώδικα της όπως θα χρειαζόταν σε μια στατική HTML σελίδα. Ζητώντας την ίδια σελίδα στον browser σας αμέσως μετά την αλλαγή της ρύθμισης χρώματος η σελίδα θα είναι ενημερωμένη.

The End

Στο σημείο αυτό, με το βιβλίο επισκεπτών έτοιμο, ολοκληρώνεται η τριλογία αυτού του tutorial. Παίξτε με τις σελίδες, εισάγετε σχόλια και αλλάξτε τις ρυθμίσεις. Παρακολουθήστε άμεσα τις αλλαγές στους πίνακες της βάσης με το MySQL Monitor ανοικτό. Βελτιώστε το και δοκιμάστε να το δημοσιεύσετε online χρησιμοποιώντας κάποιο δωρεάν πακέτο hosting (θα βρείτε αρκετά free hosting plans με μια ανάλογη έρευνα στο Google. Μην ξεχνάτε ότι ο host σας εκτός από χώρο θα πρέπει να σας παρέχει δικαιώματα εκτέλεσης κώδικα PHP και πρόσβαση σε MySQL server.). Και αφού αποκτήσετε και την real world εμπειρία, αφού μελετήσετε τις PHP/MySQL λίγο ακόμα, αφού δημιουργήσετε 2-3 άλλα μικρά projects, υλοποιήστε επιτέλους εκείνη την σπουδαία ιδέα που (είμαστε σίγουροι) γυροφέρνει στο μυαλό σας τόσο καιρό…

2 Responses to “PHP & MySQL Tutorial – Η Επιστροφή του Βασιλιά”

  1. mike_j | 14/09/2011 at 10:01

    Πολύ χρήσιμο και καλογραμμένο tutorial.Από τα καλύτερα-αν όχι το καλύτερο- που έχω διαβάσει στα Ελληνικά. Συνεχίστε να ανεβάζετε και άλλα tutorials και για άλλα ενδιαφέροντα θέματα(π.χ Linux command tutorial ή Joomla tutorial ). Έχω απλώς 2 ερωτήσεις να κάνω(όποιος μπορεί και έχει την ορεξη να μου απαντήσει είναι ευπρόσδεκτος):
    1) Αν η φόρμα του gb.php καλούσε ένα άλλο αρχείο(και όχι τον εαυατό της),π.χ action=”gb_1.php”, το οποίο φυσικά θα περιείχε τον κώδικα των γραμμων 13-32 θα πέρναμε το ίδιο αποτέλεσμα;
    2)Αν θέλαμε να ενσωματώσουμε CSS στον κώδικα του gb.php, θα έπρεπε να γίνει κάποια αλλαγή ή ακολουθείται η ίδια διαδικασία όπως με τις απλές HTML σελίδες;

    • praeto | 14/09/2011 at 11:28

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

      2. Δεν καταλαβαίνω ακριβώς την ερώτηση. Σαφώς, αφού θα πρόσθετες CSS θα έπρεπε να γίνουν κάποιες αλλαγές (προσθήκη ή κάλεσμα του κώδικα CSS στο head της σελίδας και σήμανση id, κλάσεων κ.λπ. στα διάφορα components της σελίδας). Η βασική φιλοσοφία, ωστόσο, δεν θα άλλαζε στο παραμικρό.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

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