Written by: Education PHP MySQL

Δημιουργία CMS (content management system)

Μοιραστείτε το άρθρο

Δημιουργία CMS (content management system)

Διαχείριση Περιεχομένου με PHP και MySQL

Ένα Σύστημα Διαχείρισης Περιεχομένου

Ο σκοπός ενός συστήματος διαχείρισης περιεχομένου (content management system) είναι να παρέχει ένα προσαρμοζόμενο, ασφαλές Web-based interface για να μπορούμε να χειριζόμαστε τα περιεχόμενα της βάσης δεδομένων αντί να πρέπει να γράφουμε τα πάντα από τη γραμμή εντολών της MySQL.

Μέχρι τώρα, έχουμε δει αρκετά παραδείγματα από database-driven Web pages, δηλ. σελίδες που εμφανίζουν πληροφορίες που επιλέγονται από μια βάση δεδομένων της MySQL όταν ζητείται η σελίδα. Όμως, δεν έχουμε δει ακόμη μια λύση που να είναι πολύ περισσότερο διαχειρίσιμη από τα καθαρά HTML αρχεία όταν μεγεθύνονται για να περικλείσουν ένα μεγάλο και περίπλοκο Web site.

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

Για να κάνουμε το άλμα από μια ιστοσελίδα που εμφανίζει πληροφορίες που είναι αποθηκευμένες σε μια βάση δεδομένων σ’ ένα ολοκληρωμένο database-driven Web site, πρέπει να προσθέσουμε ένα σύστημα διαχείρισης περιεχομένου CMS (content management system).

Ένα τέτοιο σύστημα έχει συνήθως τη μορφή μιας σειράς από ιστοσελίδες, η πρόσβαση στις οποίες είναι περιορισμένη σε χρήστες που έχουν εξουσιοδότηση να κάνουν αλλαγές στο Web site. Αυτές οι σελίδες παρέχουν ένα database administration interface, που δίνει τη δυνατότητα σ’ έναν χρήστη να δει και να τροποποιήσει τα στοιχεία που είναι αποθηκευμένα στη βάση δεδομένων χωρίς να μπερδεύεται με τις λεπτομέρειες της σύνταξης της SQL.

Είδαμε ένα παράδειγμα ενός συστήματος διαχείρισης περιεχομένου όταν επιτρέψαμε στους επισκέπτες του site να προσθέτουν και να διαγράφουν jokes στη βάση δεδομένων χρησιμοποιώντας μια Web-based φόρμα και ένα “delete this joke” link, αντίστοιχα.

Ενώ είναι εντυπωσιακά, αυτά δεν είναι χαρακτηριστικά που θα περιλαμβάναμε συνήθως στο interface που θα δημιουργήσουμε για τους επισκέπτες του site. Για παράδειγμα, δεν θα θέλαμε κάποιος να μπορεί να προσθέσει προσβλητικό υλικό στο Web site χωρίς να το γνωρίζουμε. Και σίγουρα δεν θα θέλαμε να μπορεί ο οποιοσδήποτε να διαγράφει jokes από το site.

Η Πρώτη Σελίδα

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

Η πρώτη σελίδα (front page) του συστήματος διαχείρισης περιεχομένου που θα δημιουργήσουμε, συνεπώς, θα περιέχει links σε σελίδες για να μπορούμε να διαχειριστούμε το καθένα από τα εξής τρία πράγματα :

<!-- admin.html -->
<HTML>
<HEAD>
<TITLE> JMS </TITLE>
</HEAD>
<BODY>
<H1> Σύστημα Διαχείρισης Jokes </H1>
<UL>
<LI><A HREF="jokes.php"> Διαχείριση Jokes </A>
<LI><A HREF="authors.php"> Διαχείριση Authors </A>
<LI><A HREF="cats.php"> Διαχείριση Κατηγοριών Joke </A>
</UL>
</BODY>
</HTML>

Διαχείριση των Συγγραφέων

Θα ξεκινήσουμε με το αρχείο authors.php, με το οποίο μπορούν οι διαχειριστές (administrators) να προσθέσουν νέους συγγραφείς καθώς και να διαγράψουν και να τροποποιήσουν ήδη υπάρχοντες. Αν είμαστε εξοικειωμένοι με την ιδέα των σελίδων πολλαπλών σκοπών (multipurpose pages), θα θελήσουμε πιθανώς να τοποθετήσουμε τον κώδικα γι’ όλα τα παραπάνω σ’ ένα μόνο αρχείο, το authors.php.

Εφόσον ο κώδικας αυτού του αρχείου θα είναι αρκετά μεγάλος, θα χρησιμοποιήσουμε ξεχωριστά αρχεία στα παραδείγματά μας για να διασπάσουμε τον κώδικα. Το πρώτο πράγμα που θέλουμε να παρουσιάσουμε σ’ έναν administrator ο οποίος θέλει να διαχειρίζεται τους συγγραφείς (authors) είναι μια λίστα όλων των συγγραφέων που βρίσκονται αποθηκευμένοι στη βάση δεδομένων.

Εφόσον θέλουμε να επιτρέψουμε τη διαγραφή και την επεξεργασία των ήδη υπαρχόντων συγγραφέων, θα συμπεριλάβουμε συνδέσμους (links) γι’ αυτές τις λειτουργίες δίπλα από το όνομα του κάθε συγγραφέα. Όπως ακριβώς και με τους συνδέσμους “Διαγραφή Joke” που είδαμε προηγουμένως, αυτοί οι σύνδεσμοι θα περιέχουν το ID του συγγραφέα πάνω τους έτσι ώστε το έγγραφο στόχος (target document) να γνωρίζει ποιον συγγραφέα θέλουμε να τροποποιήσουμε (edit) ή να διαγράψουμε (delete).

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

<!-- authors.php -->
<HTML>
<HEAD>
            <TITLE> Διαχείριση Authors </TITLE>
</HEAD>
<BODY>
            <H1> Διαχείριση Authors </H1>
            <P ALIGN=CENTER><A HREF="newauthor.php"> Δημιουργία Κανιούργιου Συγγραφέα </A></P>
<UL>
<?php
            $cnx = mysql_connect('localhost','user','password');
            mysql_select_db('jokes');
            $authors = mysql_query("SELECT ID, Name FROM Authors");
            if (!$authors) {
                        echo("<P> Error retrieving authors from database! <BR>".
                        "Error : " . mysql_error());
                        exit();
            }
            while ($author = mysql_fetch_array($authors)) {
                        $id   = $author["ID"];
                        $name = $author["Name"];
                        echo("<LI>$name ".
                        "[<A HREF='editauthor.php?id=$id'>Edit</A>|".
                        "<A HREF='deleteauthor.php?id=$id'>Delete</A>]");
            }
?>
            </UL>
            <P ALIGN=CENTER><A HREF="admin.HTML"> Επιστροφή στην Αρχική Σελίδα </A></P>
</BODY>
</HTML>

Διαγραφή Συγγραφέων

Το αρχείο deleteauthor.php είναι αρμόδιο για τη διαγραφή ενός συγγραφέα από τη βάση δεδομένων όταν δοθεί το ID του. Όπως είδαμε και πριν, κάτι τέτοιο είναι εξαιρετικά εύκολο να γίνει μ’ ένα ερώτημα DELETE, αλλά εδώ είναι πιο περίπλοκο. Ο πίνακας Jokes έχει μια στήλη AID η οποία δείχνει τον συγγραφέα που είναι υπεύθυνος για ένα δεδομένο joke.

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

Έχουμε τις εξής δύο επιλογές για να μπορέσουμε να χειριστούμε αυτήν την κατάσταση :

  • Όταν διαγράφουμε έναν συγγραφέα, διαγράφουμε επίσης όλα τα jokes που έχουν αποδοθεί σ’ αυτόν τον συγγραφέα.
  • Όταν διαγράφουμε έναν συγγραφέα, θέτουμε το AID όλων των jokes που έχουν αποδοθεί σ’ αυτόν τον συγγραφέα σε NULL, δείχνοντας έτσι ότι δεν αντιστοιχούν σε κανέναν συγγραφέα.

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

<!-- deleteauthor.php -->
<HTML>
<HEAD>
<TITLE> Διαγραφή Author </TITLE>
</HEAD>
<BODY>
<?php
$cnx = mysql_connect('localhost','user','password');
mysql_select_db('jokes');
// Διαγραφή όλων των jokes που ανήκουν στον συγγραφέα
// μαζί με την καταχώρηση του συγγραφέα
$ok1 = mysql_query("DELETE FROM Jokes WHERE AID=$id");
$ok2 = mysql_query("DELETE FROM Authors WHERE ID=$id");
if ($ok1 and $ok2) {
echo("<P> Ο συγγραφέας διαγράφηκε με επιτυχία! </P>");
} else {
echo("<P> Λάθος στη διαγραφή του συγγραφέα! <BR>".
"Error : " . mysql_error());
}
?>
<P><A HREF="authors.php"> Επιστροφή στη Λίστα Συγγραφέων </A></P>
</BODY>
</HTML>

Προσθήκη Συγγραφέων

Ακολουθεί το αρχείο newauthor.php, το οποίο δίνει τη δυνατότητα στους administrators να προσθέσουν νέους συγγραφείς στη βάση δεδομένων. Είναι παρόμοιο με την προσθήκη νέων jokes, που είδαμε προηγουμένως.

<!-- newauthor.php -->
<HTML>
<HEAD>
<TITLE> Προσθήκη Καινούργιου Συγγραφέα </TITLE>
</HEAD>
<BODY>
<?php
            if ($submit):   // Εισάγεται ένας νέος συγγραφέας χρησιμοποιώντας την
// παρακάτω φόρμα
                        $dbcnx = @mysql_connect("localhost", "root", "mypasswd");
                        mysql_select_db("jokes");
                        $sql = "INSERT INTO Authors SET " .
                        "Name='$name', " .
                                    "EMail='$email'";
                        if (mysql_query($sql)) {
                                    echo("<P> Προστέθηκε καινούργιος συγγραφέας </P>");
                        } else {
                                    echo("<P> Λάθος στην προσθήκη του καινούργιου συγγραφέα : " .
                                    mysql_error() . "</P>");
                        }
?>
            <P><A HREF="<?php echo($PHP_SELF); ?>"> Προσθήκη κι άλλου συγγραφέα </A></P>
            <P><A HREF="authors.php"> Επιστροφή στη Λίστα Συγγραφέων </A></P>
<?php
            else: // Ο χρήστης προσθέτει έναν νέο συγγραφέα
?>
            <FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD=POST>
                <P> Εισάγετε τον καινούργιο συγγραφέα : <BR>
                Όνομα : <INPUT TYPE=TEXT NAME="name" SIZE=20 MAXLENGTH=100><BR>
                eMail : <INPUT TYPE=TEXT NAME="email" SIZE=20 MAXLENGTH=100><BR>
                <INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"></P>
            </FORM>
<?php endif; ?>
</BODY>
</HTML>

Επεξεργασία Συγγραφέων

Αυτό που απέμεινε είναι το αρχείο editauthor.php, το οποίο πρέπει να παρέχει ένα interface για να μπορούμε να τροποποιήσουμε (edit) τα στοιχεία ενός υπάρχοντος συγγραφέα. Αυτή η σελίδα είναι πολύ παρόμοια με την newauthor.php, εκτός από το ότι τα πεδία της φόρμας (form fields) θα περιέχουν αρχικά τις τιμές που είναι αποθηκευμένες στη βάση δεδομένων και θα χρησιμοποιηθεί ένα ερώτημα UPDATE αντί για ένα ερώτημα INSERT όταν υποβάλλεται η φόρμα.

Ένα μικρό μπλέξιμο συμβαίνει εδώ. Για να αρχικοποιηθούν τα πεδία της φόρμας με τις τιμές που είναι αποθηκευμένες στη βάση δεδομένων, η σελίδα θα χρησιμοποιήσει προφανώς τη μεταβλητή $id που μεταβιβάζεται από το authors.php για να ανακτηθούν οι τιμές και να αποθηκευθούν σαν μεταβλητές της PHP, όπως για παράδειγμα $name και $email. Ο κώδικας της φόρμας πρέπει να είναι ως εξής :

<FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD=POST>
<P> Επεξεργασία του συγγραφέα : <BR>
Όνομα : <INPUT TYPE=TEXT NAME="name"
VALUE="<?php echo($name); ?>" SIZE=20 MAXLENGTH=100><BR>
eMail : <INPUT TYPE=TEXT NAME="email" VALUE="<?php echo($email); ?>" SIZE=20 MAXLENGTH=100><BR>
<INPUT TYPE=HIDDEN NAME="id" VALUE="<?php echo($id); ?>">
<INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"></P>
</FORM>

Χρησιμοποιούμε το πεδίο φόρμας hidden για να μεταβιβάσουμε το ID του συγγραφέα μαζί με τις ενημερωμένες τιμές όταν υποβάλλεται η φόρμα. Αλλά ας δούμε τι θα συμβεί αν το όνομα του συγγραφέα είναι το “The Jokester” (μαζί με τα εισαγωγικά). Το input tag που θα δημιουργήσει το script της PHP θα είναι ως εξής :

<INPUT TYPE=TEXT NAME="name" VALUE=""The Jokester"" SIZE=20 MAXLENGTH=100>

Αυτή προφανώς είναι λάθος HTML. Θα πρέπει να αντικαταστήσουμε τα εισαγωγικά στο όνομα με τον χαρακτήρα \ (backslash) έτσι ώστε οι Web browsers να γνωρίζουν ότι τα εισαγωγικά αποτελούν μέρος της τιμής και δεν παριστάνουν την αρχή ή το τέλος της τιμής μιας ιδιότητας, ως εξής :

<INPUT TYPE=TEXT NAME="name" VALUE="\"The Jokester\"" SIZE=20 MAXLENGTH=100>

Η PHP παρέχει τη συνάρτηση addslashes() που προσθέτει αυτόματα backslashes εκεί όπου χρειάζονται και ειδικότερα μπροστά από ειδικούς χαρακτήρες όπως τα εισαγωγικά και οι απόστροφοι. Αν χρησιμοποιήσουμε αυτή τη συνάρτηση στις τιμές όλων των μεταβλητών που ανακτούμε από μια βάση δεδομένων καθώς και στην τιμή μιας ιδιότητας (attribute) της HTML, θα αποφύγουμε προβλήματα που δημιουργούνται με τα εισαγωγικά στα text strings.

$name = addslashes($name);

Μπορεί να έχουμε ήδη χρησιμοποιήσει τιμές μεταβλητών σε ερωτήματα της SQL. Ας δούμε την ακόλουθη εντολή INSERT της SQL :

Mysql> INSERT INTO Authors SET
-> Name='Jennifer O'Reilly',
-> eMail='[email protected]';

Προφανώς, η απόστροφος στο επώνυμο του συγγραφέα θα δημιουργήσει προβλήματα εδώ. Δεν μας έχει απασχολήσει αυτό νωρίτερα γιατί η PHP διαθέτει ένα πολύ καλό χαρακτηριστικό που αποκαλείται “magic quotes”, το οποίο έχει ενεργοποιηθεί με την εξής ρύθμιση στο αρχείο php.ini (ή php3.ini) :

magic_quotes_gpc = On

Αυτή η ρύθμιση λέει βασικά στην PHP να χρησιμοποιήσει αυτόματα τη συνάρτηση addslashes() σ’ όλες τις μεταβλητές που μεταβιβάζονται μαζί με την αίτηση (request) για τη σελίδα. Το gpc σημαίνει “get, post, cookies”, οι οποίες είναι οι τρεις μέθοδοι με τις οποίες μπορούν να μεταβιβασθούν πληροφορίες μαζί με μια αίτηση (request) για μια ιστοσελίδα (Web page).

Τώρα, εφόσον όλες οι τιμές που έχουμε καταχωρήσει στη βάση δεδομένων μέχρι τώρα έχουν μεταβιβασθεί σαν μέρος της υποβολής μιας φόρμας, το χαρακτηριστικό Magic Quotes της PHP έχει προσθέσει αυτόματα τα slashes.

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

Υπάρχουν κι άλλοι χαρακτήρες που μπορούν να προκαλέσουν προβλήματα. Πιο συγκεκριμένα, οι οριοθέτες των tags της HTML, όπως οι < και >, μπορούν να δημιουργήσουν μεγάλη αναστάτωση όταν εμφανισθούν σ’ ένα κομμάτι κειμένου που θα εμφανισθεί σε μια ιστοσελίδα (Web page).

Υπάρχει κι εδώ μια συνάρτηση για να τα μετατρέψει σε μια ασφαλή μορφή, η οποία καλείται htmlspecialchars() και χρησιμοποιείται όπως ακριβώς και η addslashes() :

$text = htmlspecialchars("<HTML> can be dangerous!");
echo($text);   // output: <HTML> can be dangerous!

Διαχείριση των Κατηγοριών

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

Όταν διαγράφεται μια κατηγορία, δεν μπορούμε να διαγράψουμε επίσης και τα jokes που ανήκουν σ’ αυτήν την κατηγορία, εφόσον αυτά μπορούν να ανήκουν και σ’ άλλες κατηγορίες.

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

Αυτά τα jokes θα είναι αόρατα στους επισκέπτες του site μας, αλλά θα παραμένουν στη βάση δεδομένων στην περίπτωση που θελήσουμε να τα εκχωρήσουμε σε μια κατηγορία αργότερα. Έτσι, για να διαγράψουμε μια κατηγορία, πρέπει επίσης να διαγράψουμε όλες τις καταχωρήσεις στον πίνακα JokeLookup που αναφέρονται σ’ αυτήν την κατηγορία, ως εξής :

<!-- deletecat.php -->
…
// Διαγραφή όλων των καταχωρήσεων αναζήτησης joke για την κατηγορία
// μαζί με την καταχώρηση για την κατηγορία
$ok1 = mysql_query("DELETE FROM JokeLookup WHERE CID=$id");
$ok2 = mysql_query("DELETE FROM Categories WHERE ID=$id");
...

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

Διαχείριση των Jokes

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

Εφόσον κατά καιρούς μπορεί να γνωρίζουμε την κατηγορία, τον συγγραφέα ή ένα μέρος του κειμένου ενός joke με το οποίο θέλουμε να δουλέψουμε, θα υποστηρίξουμε και τις τρεις παραπάνω μεθόδους για να μπορούμε να εντοπίζουμε jokes στη βάση δεδομένων. Η φόρμα που θα ζητάει από τον administrator πληροφορίες για το επιθυμητό joke πρέπει να παρουσιάζει λίστες από κατηγορίες και συγγραφείς. Ο κώδικας γι’ αυτό είναι ως εξής :

<!-- jokes.php -->
<HTML>
<HEAD>
<TITLE> Διαχείριση των Jokes </TITLE>
</HEAD>
<BODY>
<H1>Διαχείριση των Jokes</H1>
<P><A HREF="newjoke.php"> Δημιουργία Καινούργιου Joke </A></P>
<?php
$dbcnx = @mysql_connect("localhost", "root", "mypasswd");
mysql_select_db("jokes");
$authors = mysql_query("SELECT ID, Name FROM Authors");
$cats    = mysql_query("SELECT ID, Name FROM Categories");
?>
<FORM ACTION="jokelist.php" METHOD=POST>
            <P> Δείτε τα jokes που ικανοποιούν τα εξής κριτήρια : <BR>
            Κατά Συγγραφέα :
            <SELECT NAME="aid" SIZE=1>
            <OPTION SELECTED VALUE=""> Οποιοσδήποτε Συγγραφέας
<?php
            while ($author = mysql_fetch_array($authors)) {
                        $aid = $author["ID"];
                        $aname = $author["Name"];
                        echo("<OPTION VALUE='$aid'>$aname\n");
            }
?>
            </SELECT><BR>
            Κατά Κατηγορία :
            <SELECT NAME="cid" SIZE=1>
<OPTION SELECTED VALUE=""> Οποιαδήποτε Κατηγορία
<?php
            while ($cat = mysql_fetch_array($cats)) {
                        $cid = $cat["ID"];
                        $cname = $cat["Name"];
                        echo("<OPTION VALUE='$cid'>$cname\n");
            }
?>
            </SELECT><BR>
            Που να περιέχουν το κείμενο :
            <INPUT TYPE=TEXT NAME="searchtext"><BR>
            <INPUT TYPE=SUBMIT NAME="submit" VALUE="Search">
</FORM>
<P ALIGN=CENTER><A HREF="admin.HTML">
Επιστροφή στην Αρχική Σελίδα </A></P>
</BODY>
</HTML>

Εξαρτάται από το jokelist.php το να χρησιμοποιήσει τις τιμές που υποβάλλονται στη φόρμα για να δημιουργηθεί μια λίστα από jokes που ικανοποιούν τα κριτήρια που έχουν καθορισθεί. Προφανώς, αυτό θα γίνει μ’ ένα ερώτημα SELECT, αλλά η ακριβής μορφή αυτού του query θα εξαρτηθεί από το τι καταχωρήθηκε με τη φόρμα που μόλις ορίσαμε. Εφόσον η δημιουργία αυτής της εντολής SELECT είναι μια σχετικά πολύπλοκη διαδικασία, θα δουλέψουμε για λίγο με το jokelist.php.

Πρώτα, τα βασικά :

<!-- jokelist.php -->
<HTML>
<HEAD>
            <TITLE> Διαχείριση των Jokes </TITLE>
</HEAD>
<BODY>
            <H1> Διαχείριση τωνJokes </H1>
            <P><A HREF="jokes.php"> Καινούργια Αναζήτηση </A></P>
<?php
            $dbcnx = @mysql_connect("localhost", "root", "mypasswd");
            mysql_select_db("jokes");

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

// Η βασική εντολή SELECT
$select = "SELECT DISTINCT ID, JokeText";
$from   = " FROM Jokes";
$where  = " WHERE ID > 0";

Το clause WHERE παραπάνω ίσως να μας μπερδέψει λίγο. Η βασική ιδέα είναι εδώ να μπορούμε να δημιουργήσουμε με βάση αυτή τη θεμελιώδη εντολή SELECT ανάλογα με το τι περιορισμοί επιλέχθηκαν στη φόρμα. Τέτοιοι περιορισμοί θα απαιτούν από εμάς να κάνουμε προσθήκες στα τμήματα FROM και WHERE της εντολής SELECT.

Αλλά αν δεν είχαν καθορισθεί καθόλου περιορισμοί, δηλ. ο administrator ήθελε μια λίστα όλων των jokes της βάσης δεδομένων, δεν θα υπήρχε καθόλου ανάγκη για ένα WHERE clause. Εφόσον είναι δύσκολο να κάνουμε προσθήκη σ’ ένα WHERE clause που δεν υπάρχει, πρέπει να ξεκινήσουμε μ’ ένα WHERE clause που δεν κάνει τίποτα.

Το να ορίσουμε το Jokes.ID να είναι μεγαλύτερο από το 0, ταιριάζει καλά, εφόσον το χαρακτηριστικό AUTO_INCREMENT της MySQL θα επιλέγει πάντα ακεραίους μεγαλύτερους από το 0.

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

Η επιλογή “Any Author” στη φόρμα πήρε την τιμή “” (το κενό string), έτσι αν η τιμή αυτού του πεδίου φόρμας (που είναι αποθηκευμένο στο $aid) δεν είναι ίσο με “”, τότε έχει καθορισθεί ένας συγγραφέας και τροποποιούμε ανάλογα το ερώτημά μας (query) :

if ($aid != "") {          // Έχει επιλεγεί ένας συγγραφέας
            $where .= " AND AID=$aid";
}

Ο τελεστής .= χρησιμοποιείται για να ενώσουμε ένα νέο string στο τέλος ενός άλλου. Σ’ αυτήν την περίπτωση, προσθέτουμε στο WHERE τη συνθήκη ότι το AID στον πίνακα Jokes πρέπει να ταιριάζει με το ID του συγγραφέα που έχει επιλεγεί στη φόρμα ($aid).

Μετά, χρειαζόμαστε μια καθορισμένη κατηγορία joke :

if ($cid != "") { // Επιλέγεται μια κατηγορία
$from  .= ", JokeLookup";
$where .= " AND ID=JID AND CID=$cid";
}

Εφόσον οι κατηγορίες που είναι συσχετισμένες μ’ ένα συγκεκριμένο joke είναι αποθηκευμένες στον πίνακα JokeLookup, πρέπει να προσθέσουμε αυτόν τον πίνακα στο ερώτημα για να δημιουργήσουμε μια ένωση (join) προσθέτοντας το όνομα του πίνακα στο τέλος της μεταβλητής $from.

Για να ολοκληρωθεί η ένωση (join), καθορίζουμε επίσης ότι η στήλη ID (στον πίνακα Jokes) πρέπει να ταιριάζει με τη στήλη JID (στον πίνακα JokeLookup), προσθέτοντας αυτή τη συνθήκη στη μεταβλητή $where. Τέλος, θα πρέπει η στήλη CID (στον JokeLookup) να ταιριάζει με το ID της κατηγορίας που έχει επιλεγεί στη φόρμα ($cid).

Ο χειρισμός του κειμένου αναζήτησης (search text) είναι αρκετά απλός. Χρησιμοποιούμε απλά τον τελεστή LIKE της SQL, ως εξής :

if ($searchtext != "") {         // Κείμενο αναζήτησης
$where .= " AND JokeText LIKE '%$searchtext%'";
}

Εφόσον έχει δημιουργηθεί το ερώτημα της SQL, μπορούμε να το χρησιμοποιήσουμε για να ανακτήσουμε τα jokes και να τα εμφανίσουμε μαζί με τους συνδέσμους (links) για την τροποποίηση και τη διαγραφή τους, όπως ακριβώς κάναμε για τους συγγραφείς και τις κατηγορίες των jokes. Για να είναι πιο ευανάγνωστα, εμφανίζουμε τα jokes σ’ έναν πίνακα της HTML :

?>
            <TABLE BORDER=1>
            <TR><TH> Κείμενο του Joke </TH><TH> Επιλογές </TH></TR>
<?php
            $jokes = mysql_query($select . $from . $where);
            if (!$jokes) {
                        echo("</TABLE>");
                        echo("<P> Λάθος στην ανάκτηση των jokes από τη βάση δεδομένων <BR>".
                        "Error : " . mysql_error());
                        exit();
            }
            while ($joke = mysql_fetch_array($jokes)) {
                        echo("<TR>\n");
                        $id       = $joke["ID"];
                        $joketext = $joke["JokeText"];
                        echo("<TD>$joketext</TD>\n");
                        echo("<TD>[<A HREF='editjoke.php?id=$id'>".
                        "Edit</A>|".
                        "<A HREF='deletejoke.php?id=$id'>".
                        "Delete</A>]</TD>\n");
                        echo("</TR>\n");
            }
?>
            </TABLE>
</BODY>
</HTML>

Με το jokelist.php να είναι εντάξει, θα δούμε τώρα το newjoke.php, για το οποίο υπάρχει μια σύνδεση (link) στην κορυφή του jokes.php. Η σελίδα αυτή θα είναι πολύ παρόμοια με τις newauthor.php και newcat.php. Όμως, εκτός από τον καθορισμό του κειμένου του joke, αυτή η σελίδα πρέπει να δίνει τη δυνατότητα σ’ έναν administrator να μπορεί να εκχωρήσει έναν συγγραφέα καθώς και κατηγορίες σ’ ένα joke.

Γνωρίζουμε βλέποντας τον κώδικα του newauthor.php ότι ο PHP κώδικας για την επεξεργασία της υποβολής της φόρμας έρχεται πριν από τον κώδικα της ίδιας της φόρμας. Θα αρχίσουμε βλέποντας τον κώδικα της φόρμας. Ξεκινάμε εμφανίζοντας λίστες απ’ όλους τους συγγραφείς και τις κατηγορίες που υπάρχουν στη βάση δεδομένων :

<?php
else:
            $dbcnx = @mysql_connect("localhost", "root", "mypasswd");
            mysql_select_db("jokes");
            $authors = mysql_query("SELECT ID, Name FROM Authors");
            $cats    = mysql_query("SELECT ID, Name FROM Categories");
?>

Μετά, δημιουργούμε τη φόρμα. Αρχίζουμε με μια τυπική περιοχή κειμένου (text area) όπου θα καταχωρήσουμε το κείμενο του joke :

<FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD=POST>
<P> Καταχωρείστε το νέο joke : <BR>
<TEXTAREA NAME="joketext" ROWS=15 COLS=45 WRAP>
</TEXTAREA>

Θα ζητήσουμε από τον administrator να επιλέξει έναν συγγραφέα χρησιμοποιώντας μια πτυσσόμενη λίστα (drop-down list) με τους συγγραφείς που υπάρχουν στη βάση δεδομένων :

<P> Author :
<SELECT NAME="aid" SIZE=1>
<OPTION SELECTED VALUE=""> Select One
<OPTION VALUE="">---------
<?php
while ($author = mysql_fetch_array($authors)) {
$aid = $author["ID"];
$aname = $author["Name"];
echo("<OPTION VALUE='$aid'>$aname\n");
}
?>
</SELECT></P>

Μια πτυσσόμενη λίστα (drop-down list) δεν θα επαρκεί για την επιλογή των κατηγοριών εφόσον θέλουμε να μπορεί ο administrator να επιλέγει πολλές κατηγορίες. Έτσι, θα χρησιμοποιήσουμε μια σειρά από πλαίσια ελέγχου (checkboxes), από ένα για κάθε κατηγορία.

Τα πλαίσια ελέγχου έχουν τα ονόματα cat1, cat2, cat3 κοκ χρησιμοποιώντας το ID της κατηγορίας στο οποίο αναφέρεται το κάθε πλαίσιο ελέγχου. Τα πλαίσια ελέγχου έχουν ετικέτες (labels) με τα ονόματα των κατηγοριών.

<P> Place in categories : <BR>
<?php
while ($cat = mysql_fetch_array($cats)) {
$cid = $cat["ID"];
$cname = $cat["Name"];
echo("<INPUT TYPE=CHECKBOX NAME='cat$cid'>".
"$cname<BR>\n");
}
?>
</P>

Και ολοκληρώνουμε τη φόρμα κατά τα γνωστά :

<P><INPUT TYPE=SUBMIT NAME="submit" VALUE="SUBMIT"></P>
</FORM>
<?php endif; ?>

Στην αρχή του κώδικα προσθέτουμε το joke στον πίνακα Jokes. Εφόσον χρειάζεται ένας συγγραφέας, πρέπει να σιγουρευτούμε ότι η μεταβλητή $aid περιέχει μια τιμή. Αυτό αποτρέπει τον administrator από το να επιλέξει την επιλογή “Select One” από τη λίστα επιλογής συγγραφέων, εφόσον αυτή η επιλογή έχει την τιμή “” (το κενό string).

<?php
            if ($submit):               // Ένα καινούργιο joke έχει καταχωρηθεί με την φόρμα
            if ($aid == "") {
                        echo("<P> Πρέπει να επιλέξετε έναν συγγραφέα " .
                        "γι' αυτό το joke. Κάντε κλικ στο 'Back' " .
                        "και προσπαθήστε ξανά.</P>");
                        exit();
            } 
            $dbcnx = @mysql_connect("localhost", "root", "mypasswd");
            mysql_select_db("jokes");
            $sql = "INSERT INTO Jokes SET " .
                        "JokeText='$joketext', " .
                        "AID='$aid'";
            if (mysql_query($sql)) {
                        echo("<P> Προστέθηκε καινούργιο joke </P>");
            } else {
                        echo("<P> Λάθος προσθήκης καινούργιου joke : " .
                                    mysql_error() . "</P>");
            }
            $jid = mysql_insert_id();

Η συνάρτηση mysql_insert_id() επιστρέφει τον αριθμό που έχει εκχωρηθεί στην τελευταία καταχώρηση από το χαρακτηριστικό AUTO_INCREMENT της MySQL. Μ’ άλλα λόγια, ανακτά το ID  του καινούργιου joke, που θα χρειασθούμε αργότερα. Ο κώδικας για να προσθέσουμε τις καταχωρήσεις στον JokeLookup ανάλογα με το ποια πλαίσια ελέγχου επιλέγησαν δεν είναι και τόσο απλός. Πρώτα απ’ όλα, δεν έχουμε δει ακόμη πώς ένα πλαίσιο ελέγχου περνάει την τιμή του σε μια μεταβλητή της PHP.

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

Τα πλαίσια ελέγχου χωρίς εκχωρημένες τιμές μεταβιβάζουν το on σαν την τιμή των αντίστοιχων μεταβλητών τους όταν επιλέγονται. Εφόσον η PHP θεωρεί μια τιμή string σαν true όταν χρησιμοποιείται σαν μια συνθήκη σε μια εντολή if και μια κενή μεταβλητή σαν false, μπορούμε να χρησιμοποιήσουμε τις μεταβλητές των πλαισίων ελέγχου σαν να κάναμε έλεγχο αν τα πλαίσια ελέγχου ήταν επιλεγμένα ή όχι.

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

$cats = mysql_query(
"SELECT ID, Name FROM Categories");

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

while ($cat = mysql_fetch_array($cats)) {
$cid = $cat["ID"];
$cname = $cat["Name"];

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

Πρέπει συνεπώς να δημιουργήσουμε το όνομα της μεταβλητής χρησιμοποιώντας το ID της κατηγορίας που μας ενδιαφέρει ($cid). Ακολουθεί ο κώδικας :

$var = "cat$cid";     // Το όνομα της μεταβλητής
if ($$var) {          // Αν είναι επιλεγμένο το πλαίσιο ελέγχου

Το σύμβολο με τα δύο $ δεν είναι τυπογραφικό λάθος. Η μεταβλητή με όνομα $var θα έχει μια τιμή ίση με “cat#”, όπου το # είναι το ID της τρέχουσας κατηγορίας. Η τιμή του $$var, συνεπώς, θα είναι η τιμή της μεταβλητής με όνομα $cat#.

Αυτό είναι ένα σκοτεινό χαρακτηριστικό της PHP που αποκαλείται «μεταβλητές μεταβλητές» (“variable variables”) και που είναι πολύ χρήσιμο σε περιπτώσεις όπως η παραπάνω. Χρησιμοποιούμε το $$var στην παραπάνω εντολή if για να εισάγουμε μια καταχώρηση στον πίνακα JokeLookup όταν έχει επιλεγεί το πλαίσιο ελέγχου :

            $sql = "INSERT IGNORE INTO JokeLookup " .
                        "SET JID=$jid, CID=$cid";
            $ok = mysql_query($sql);
            if ($ok) {
                        echo("<P> Προστέθηκε ένα joke στην κατηγορία : $cname</P>");
            } else {
                        echo("<P> Λάθος προσθήκης του joke ".
                        "στην κατηγορία $cname:" .
                        mysql_error() . "</P>");
            }
} // end of if ($$var)
} // end of while loop
?>
<P><A HREF="<?php echo($PHP_SELF); ?>">
            Προσθήκη άλλου Joke</A></P>
<P><A HREF="jokes.php"> Επιστροφή στην Αναζήτηση Joke </A></P>

Η λέξη IGNORE που χρησιμοποιείται εδώ στο ερώτημα INSERT αποτελεί απλά και μόνο μια προφύλαξη. Όταν ορίσαμε τον πίνακα JokeLookup θέσαμε τις στήλες JID και CID σαν το πρωτεύον κλειδί (primary key) του πίνακα. Έτσι, αν ένα ζευγάρι τιμών JID/CID υπάρχει ήδη στον πίνακα, οποιαδήποτε προσπάθεια να το καταχωρήσουμε ξανά θα προκαλέσει ένα λάθος.

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

Τα υπόλοιπα δύο αρχεία, editjoke.php και deletejoke.php είναι τα αντίστοιχα για τον συγγραφέα και την κατηγορία, με πολύ μικρές αλλαγές. Το editjoke.php πρέπει να παρέχει το ίδιο πλαίσιο επιλογής συγγραφέα και πλαίσια ελέγχου κατηγορίας όπως το addjoke.php, με τη διαφορά ότι αυτή τη φορά πρέπει να είναι αρχικοποιημένα για να εμφανίζουν τις τιμές που είναι αποθηκευμένες στη βάση δεδομένων για το επιλεγμένο joke.

Το deletejoke.php δεν πρέπει μόνο να διαγράψει το επιλεγμένο joke από τον πίνακα Jokes, αλλά πρέπει επίσης να αφαιρέσει όλες τις καταχωρήσεις που υπάρχουν στον πίνακα JokeLookup γι’ αυτό το joke.

Μορφοποίηση και Υποβολή Περιεχομένου

Έχουμε σχεδιάσει μια βάση δεδομένων για να αποθηκεύσουμε jokes, τα έχουμε οργανώσει σε κατηγορίες και παρακολουθούμε τους συγγραφείς τους. Έχουμε μάθει πώς να δημιουργούμε μια ιστοσελίδα (Web page) που να εμφανίζει αυτή τη βιβλιοθήκη των jokes στους επισκέπτες του site. Έχουμε αναπτύξει ακόμη ένα σύνολο ιστοσελίδων που μπορεί να χρησιμοποιήσει ένας site administrator για να διαχειρισθεί τη βιβλιοθήκη των jokes χωρίς να είναι ανάγκη να γνωρίζει ο,τιδήποτε για τις βάσεις δεδομένων.

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

Μια αλλαγή σ’ ένα αρχείο, όπως για παράδειγμα η αλλαγή μιας γραμματοσειράς (font) φαίνεται αμέσως στις σελίδες όλων των jokes, επειδή όλα τα jokes εμφανίζονται χρησιμοποιώντας αυτό το αρχείο της PHP και μόνο. Απομένει μια μόνο εργασία που χρειάζεται την HTML για τη διαχείριση του περιεχομένου του Web site : μορφοποίηση περιεχομένου (content formatting).

Σ’ όλα, εκτός από τα απλούστατα Web sites, θα είναι απαραίτητο να μπορεί το περιεχόμενο, σ’ αυτήν την περίπτωση τα jokes, να έχει τη δική του μορφοποίηση (formatting). Σε μια απλή περίπτωση, αυτό μπορεί να σημαίνει τη δυνατότητα να διασπάσουμε το κείμενο σε παραγράφους. Αλλά συχνά, θα αναμένουμε δυνατότητες όπως έντονο ή πλάγιο κείμενο, υπερδεσμούς (hyperlinks) κ.ά.

Η τρέχουσα βάση δεδομένων και η σχεδίαση του site τα υποστηρίζουν όλα αυτά, εφόσον ένας site administrator μπορεί να συμπεριλάβει HTML tags στο κείμενο ενός joke και αυτά θα έχουν τα συνηθισμένα αποτελέσματα όταν καταχωρηθεί το κείμενο του joke στη σελίδα που έχει ζητήσει ο φυλλομετρητής ενός επισκέπτη του site. Όμως, για να πετύχουμε τον στόχο μας της ολοκληρωτικής εξάλειψης της HTML από το σύστημα, πρέπει να παρέχουμε έναν άλλον τρόπο μορφοποίησης κειμένου.

Πριν δώσουμε μια νέα μέθοδο μορφοποίησης κειμένου, πρέπει πρώτα να εξουδετερώσουμε την παλιά. Κάποιος που δεν γνωρίζει από HTML μπορεί άθελά του να συμπεριλάβει σύνταξη της HTML σ’ ένα απλό έγγραφο κειμένου που θα μπορεί να δημιουργήσει μη αναμενόμενα αποτελέσματα. Ας δούμε την ακόλουθη πρόταση :

The gunman drew his weapon. <BANG!>

Κάποιος που θα καταχωρήσει το παραπάνω κείμενο στη βάση δεδομένων ίσως να βρεθεί προ εκπλήξεως αν δει την τελευταία λέξη (<BANG!>) να λείπει από την ιστοσελίδα (Web page) που εμφανίζει το περιεχόμενο. Κάποιος που έχει μια βασική γνώση της HTML θα γνωρίζει ότι ο Web browser έχει απορρίψει αυτό το κομμάτι του κειμένου σαν ένα μη έγκυρο (invalid) HTML tag.

Είχαμε δει νωρίτερα μια συνάρτηση της PHP που έλυνε αυτό το πρόβλημα, την htmlspecialchars(). Αυτή η συνάρτηση, αν εφαρμοσθεί στο κείμενο του joke πριν αυτό καταχωρηθεί σε μια ιστοσελίδα, θα μετατρέψει το παραπάνω string στην εξής «HTML ασφαλή» παραλλαγή :

The gunman drew his weapon. &lt;BANG!&gt;

Όταν διερμηνευθεί από τον Web browser του επισκέπτη του site, θα παράγει το επιθυμητό αποτέλεσμα. Σαν ένα πρώτο βήμα, συνεπώς, πρέπει να τροποποιήσουμε το αρχείο της PHP στο Web site που είναι υπεύθυνο για την εμφάνιση του κειμένου των jokes έτσι ώστε να χρησιμοποιεί τη συνάρτηση htmlspecialchars() σ’ αυτό το κείμενο πριν το εμφανίσει (εξάγει) στο Web :

<!-- joke.php -->
...
// Πάρε το κείμενο του joke από τη βάση δεδομένων
$joke = mysql_query("SELECT JokeText FROM Jokes ".
"WHERE ID=$id");
$joke = mysql_fetch_array($joke);
$joketext = $joke["JokeText"];
// Φιλτράρισμα του HTML κώδικα
$joketext = htmlspecialchars($joketext);
echo( $joketext );
...

Πηγή:

ΠΛΗ.ΝΕ.Τ

Αν βρήκατε το άρθρο μας χρήσιμο, θέλετε να μείνετε ενημερωμένοι για όλα τα νέα στο τομέα της τεχνολογίας καθώς και σε χρηστικά άρθρα, βοηθήστε μας κάνοντας like στην σελίδα μας στο Facebook πατώντας εδώ

(Visited 585 times, 1 visits today)

Μοιραστείτε το άρθρο

Ετικέτες: Last modified: 09/12/2019