Σελίδα 2 από 2 Πρώτη 12
Εμφάνιση αποτελεσμάτων : 16 έως 20 από 20

PHP και MySQL

Αυτή είναι μια συζήτηση με θέμα: PHP και MySQL στο forums PHP και MySQL, μέρος της κατηγορίας Supa Wikipedia (Βοηθήματα) : Εισαγωγή Δεδομένων στη Βάση Δεδομένων Θα δούμε τώρα πώς μπορούμε να δώσουμε τη δυνατότητα στους επισκέπτες (χρήστες) του site μας .....

  1. #16

    Εγγραφή
    Jun 2008
    Περιοχή
    Athens
    Μηνύματα
    8.313
    Liked
    567 times
    Τα Στατιστικά μου στο Arcade
    Blog Entries
    3

    Re: PHP και MySQL

    Εισαγωγή Δεδομένων στη Βάση Δεδομένων

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

    <FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD=POST>



    Γράψτε το joke εδώ :


    <TEXTAREA NAME="joketext" ROWS=10 COLS=40 WRAP>

    </TEXTAREA>


    <INPUT TYPE=SUBMIT NAME="submitjoke" VALUE="SUBMIT">

    </FORM>

    Όταν υποβληθεί αυτή η φόρμα, θα φορτώσει την ίδια ακριβώς σελίδα, λόγω της χρήσης της μεταβλητής $PHP_SELF στην ιδιότητα ACTION της φόρμας, αλλά με δύο μεταβλητές συνδεδεμένες με την αίτηση (request).

    Η πρώτη, η $joketext, θα περιέχει το κείμενο του joke όπως καταχωρήθηκε στην περιοχή κειμένου (text area). Η δεύτερη, η $submitjoke, θα περιέχει πάντα την τιμή "SUBMIT", η οποία μπορεί να χρησιμοποιηθεί σαν μια ένδειξη ότι έχει υποβληθεί ένα joke. Για να καταχωρηθεί το υποβαλλόμενο joke στη βάση δεδομένων, πρέπει να χρησιμοποιήσουμε τη συνάρτηση mysql_query() για να εκτελέσουμε ένα ερώτημα INSERT, χρησιμοποιώντας τη μεταβλητή $joketext για την τιμή που θα υποβληθεί, ως εξής :

    if ("SUBMIT" == $submitjoke) {

    $sql = "INSERT INTO Jokes SET " .

    "JokeText='$joketext', " .

    "JokeDate=CURDATE()";

    if (mysql_query($sql)) {

    echo("

    Το joke έχει προστεθεί. </P>");

    } else {

    echo("

    Λάθος κατά την προσθήκη του joke : " .

    mysql_error() . "</P>");

    }

    }

    Χρησιμοποιήσαμε τη συνάρτηση CURDATE() της MySQL για να εκχωρήσουμε την τρέχουσα ημερομηνία στην τιμή της στήλης JokeDate. Έχουμε τώρα τον κώδικα που δίνει τη δυνατότητα σ’ έναν χρήστη να καταχωρήσει ένα joke και να το προσθέσει στη βάση δεδομένων. Θα πρέπει τώρα να τον ενσωματώσουμε στην ήδη υπάρχουσα σελίδα εμφάνισης των jokes. Ακολουθεί ο κώδικας.

    <HTML>

    ...

    <BODY>

    <?php

    // Αν ο χρήστης θελήσει να προσθέσει ένα joke

    if (isset($addjoke)):

    ?>

    <FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD=POST>



    Γράψτε εδώ το joke :


    <TEXTAREA NAME="joketext" ROWS=10 COLS=40 WRAP>

    </TEXTAREA>


    <INPUT TYPE=SUBMIT NAME="submitjoke" VALUE="SUBMIT">

    </FORM>

    <?php

    else:

    // Σύνδεση με τον database server

    $dbcnx = @mysql_connect("localhost", "root", "mypasswd");

    if (!$dbcnx) {

    echo( "

    Αδύνατη η σύνδεση με τον " .

    "database server αυτή τη στιγμή. </P>" );

    exit();

    }

    // Επιλογή της βάσης δεδομένων jokes

    if (! @mysql_select_db("jokes") ) {

    echo( "

    Αδύνατος ο εντοπισμός της βάσης δεδομένων " .

    " joke αυτή τη στιγμή.</P>" );

    exit();

    }

    // Αν έχει υποβληθεί ένα joke, το προσθέτουμε στη βάση δεδομένων

    if ("SUBMIT" == $submitjoke) {

    $sql = "INSERT INTO Jokes SET " .

    "JokeText='$joketext', " .

    "JokeDate=CURDATE()";

    if (mysql_query($sql)) {

    echo("

    Το joke έχει προστεθεί. </P>");

    } else {

    echo("

    Λάθος στην προσθήκη του joke : " .

    mysql_error() . "</P>");

    }

    }

    echo("

    Αυτά είναι όλα τα jokes " .

    "που υπάρχουν στη βάση δεδομένων : </P>");

    // Επιλογή του κειμένου όλων των jokes

    $result = mysql_query(

    "SELECT JokeText FROM Jokes");

    if (!$result) {

    echo("

    Λάθος στην εκτέλεση του query : " .

    mysql_error() . "</P>");

    exit();

    }

    // Εμφάνιση του κειμένου του κάθε joke σε μια παράγραφο

    while ( $row = mysql_fetch_array($result) ) {

    echo("

    " . $row["JokeText"] . "</P>");

    }

    // Όταν γίνει κλικ, αυτός ο σύνδεσμος (link) θα φορτώσει αυτή τη

    // σελίδα με εμφανισμένη τη φόρμα υποβολής joke

    echo("

    <A HREF='$PHP_SELF?addjoke=1'>" .

    "Πρόσθεσε ένα Joke!</A></P>");

    endif;

    ?>

    </BODY>

    </HTML>

    Oι χρήστες του Supa.gr χρησιμοποιούν το "Like" για να εκτιμήσουν τις δημοσιεύσεις

  2. #17

    Εγγραφή
    Jun 2008
    Περιοχή
    Athens
    Μηνύματα
    8.313
    Liked
    567 times
    Τα Στατιστικά μου στο Arcade
    Blog Entries
    3

    Re: PHP και MySQL

    Διαγραφή Δεδομένων από τη Βάση Δεδομένων

    Θα δούμε τώρα πώς μπορούμε να τοποθετήσουμε ένα link με ετικέτα "Delete this Joke" δίπλα σε κάθε joke στη σελίδα, το οποίο όταν θα γίνεται κλικ, θα αφαιρεί αυτό το joke από τη βάση δεδομένων και θα εμφανίζει την ενημερωμένη λίστα των jokes.

    Ακολουθούν μερικές οδηγίες πριν δούμε τη λύση :

    Θα πρέπει να χρησιμοποιήσουμε την εντολή DELETE της SQL.

    Για να μπορέσουμε να διαγράψουμε ένα συγκεκριμένο joke, θα πρέπει να το αναγνωρίσουμε μοναδικά. Γι’ αυτόν ακριβώς τον λόγο σχεδιάστηκε η στήλη ID στον πίνακα Jokes. Θα πρέπει να περάσουμε το ID του joke που θέλουμε να διαγράψουμε μαζί με την αίτηση (request) για τη διαγραφή του joke.

    Οι ακόλουθες αλλαγές έπρεπε να γίνουν για να προσθέσουμε το link "Delete this Joke" δίπλα σε κάθε joke :

    Προηγουμένως, μεταβιβάσαμε μια μεταβλητή $addjoke με το link "Add a Joke!" στο κάτω μέρος της σελίδας για να επισημάνουμε ότι το script θα πρέπει να εμφανίσει τη φόρμα καταχώρησης ενός joke αντί για τη συνηθισμένη λίστα των jokes. Παρόμοια, μεταβιβάζουμε μια μεταβλητή $deletejoke με το link "Delete this Joke" για να δείξουμε ότι θέλουμε να διαγραφεί ένα joke.

    Παίρνουμε τη στήλη ID από τη βάση δεδομένων για το κάθε joke μαζί με τη στήλη JokeText, έτσι ώστε να γνωρίζουμε το ID που συσχετίζεται με το κάθε joke στη βάση δεδομένων.

    Θέτουμε την τιμή της μεταβλητής $deletejoke ίση με το ID του joke που διαγράφεται. Αυτό γίνεται εισάγοντας την ID τιμή που διαβάζεται από τη βάση δεδομένων μέσα στον HTML κώδικα για το link "Delete this Joke" του κάθε joke.

    Χρησιμοποιώντας μια εντολή if, θέλουμε να δούμε αν η μεταβλητή $deletejoke έχει κάποια τιμή (χρησιμοποιώντας τη συνάρτηση isset()) όταν φορτώνεται η σελίδα. Αν ναι, χρησιμοποιούμε την τιμή αυτή, δηλ. το ID του joke που θα διαγραφεί, σε μια εντολή DELETE της SQL για να διαγράψουμε το joke αυτό.

    Ακολουθεί ο πλήρης κώδικας :

    <HTML>

    ...
    <BODY>

    <?php

    // Αν ο χρήστης θελήσει να προσθέσει ένα joke

    if (isset($addjoke)):

    ?>

    <FORM ACTION="<?php echo($PHP_SELF); ?>" METHOD=POST>



    Γράψτε εδώ το joke :


    <TEXTAREA NAME="joketext" ROWS=10 COLS=40 WRAP>

    </TEXTAREA>


    <INPUT TYPE=SUBMIT NAME="submitjoke" VALUE="SUBMIT">

    </FORM>

    <?php

    else:

    // Σύνδεση με τον database server

    $dbcnx = @mysql_connect("localhost", "root", "mypasswd");

    if (!$dbcnx) {

    echo( "

    Αδύνατη η σύνδεση με τον " .

    "database server αυτή τη στιγμή. </P>" );

    exit();

    }

    // Επιλογή της βάσης δεδομένων jokes

    if (! @mysql_select_db("jokes") ) {

    echo( "

    Αδύνατος ο εντοπισμός της βάσης δεδομένων " .

    "joke αυτή τη στιγμή. </P>" );

    exit();

    }

    // Αν έχει υποβληθεί ένα joke, το προσθέτουμε στη βάση δεδομένων

    if ("SUBMIT" == $submitjoke) {

    $sql = "INSERT INTO Jokes SET " .

    "JokeText='$joketext', " .

    "JokeDate=CURDATE()";

    if (mysql_query($sql)) {

    echo("

    Το joke έχει προστεθεί. </P>");

    } else {

    echo("

    Λάθος στην προσθήκη του joke : " .

    mysql_error() . "</P>");

    }

    }

    // Αν έχει διαγραφεί ένα joke, το αφαιρούμε από τη βάση δεδομένων

    if (isset($deletejoke)) {

    $sql = "DELETE FROM Jokes " .

    "WHERE ID=$deletejoke";

    if (mysql_query($sql)) {

    echo("

    Το joke έχει διαγραφεί. </P>");

    } else {

    echo("

    Λάθος στη διαγραφή του joke : " .

    mysql_error() . "</P>");

    }

    }

    echo("

    Ακολουθεί μια λίστα μ’ όλα τα jokes " .

    "της βάσης δεδομένων : </P>");

    // Αναζήτηση (request) του ID και του κειμένου όλων των jokes

    $result = mysql_query("SELECT ID, JokeText FROM Jokes");

    if (!$result) {

    echo("

    Λάθος στην εκτέλεση του query : " .

    mysql_error() . "</P>");

    exit();

    }

    // Εμφάνιση του κειμένου του κάθε joke σε μια παράγραφο

    // μ’ ένα link "Delete this Joke" δίπλα στο καθένα

    while ( $row = mysql_fetch_array($result) ) {

    $jokeid = $row["ID"];

    $joketext = $row["JokeText"];

    echo("

    $joketext " .

    "<A HREF='$PHP_SELF?deletejoke=$jokeid'>" .

    "Delete this Joke</A></P>");

    }

    // Όταν γίνει κλικ, αυτό το link θα φορτώσει αυτή τη σελίδα

    // με εμφανισμένη τη φόρμα υποβολής joke

    echo("

    <A HREF='$PHP_SELF?addjoke=1'>" .

    "Add a Joke!</A></P>");

    endif;
    ?>

    </BODY>

    </HTML>

  3. #18

    Εγγραφή
    Jun 2008
    Περιοχή
    Athens
    Μηνύματα
    8.313
    Liked
    567 times
    Τα Στατιστικά μου στο Arcade
    Blog Entries
    3

    Re: PHP και MySQL

    Σχεδίαση Σχεσιακών Βάσεων Δεδομένων

    Ας ξαναδούμε τη δομή του πίνακα Jokes που έχουμε χρησιμοποιήσει μέχρι τώρα. Περιέχει τις εξής τρεις στήλες : ID, JokeText και JokeDate, με τις οποίες μπορούμε να αναγνωρίσουμε τα jokes (ID) και να παρακολουθούμε το κείμενό τους (JokeText) καθώς και την ημερομηνία καταχώρησής τους (JokeDate).

    Ας υποθέσουμε τώρα ότι θέλουμε να έχουμε κι άλλη μια πληροφορία για τα jokes, όπως είναι τα ονόματα των ανθρώπων που τα καταχωρούν (υποβάλλουν). Φαίνεται φυσικό να θελήσουμε να προσθέσουμε μια καινούργια στήλη στον πίνακα Jokes προς τον σκοπό αυτόν, και αυτό θα το κάνουμε με τη βοήθεια της εντολής ALTER της SQL.

    Συνδεόμαστε στον MySQL server με το πρόγραμμα mysql από τη γραμμή εντολών, επιλέγουμε τη βάση δεδομένων με την οποία θέλουμε να δουλέψουμε, προφανώς την jokes, και δίνουμε την εξής εντολή :

    mysql> ALTER TABLE Jokes ADD COLUMN

    -> AuthorName VARCHAR(100);

    Η παραπάνω εντολή προσθέτει μια στήλη με όνομα AuthorName στον πίνακα Jokes. Ο τύπος δεδομένων είναι ένα string μεταβλητού μήκους χαρακτήρων μέχρι 100 χαρακτήρες σε μήκος. Θα προσθέσουμε επίσης μια στήλη για την ηλεκτρονική διεύθυνση (e-mail) του συγγραφέα, ως εξής :

    mysql> ALTER TABLE Jokes ADD COLUMN

    -> AuthorEMail VARCHAR(100);

    Χρησιμοποιώντας ερωτήματα με την εντολή UPDATE, θα μπορούμε τώρα να προσθέσουμε στοιχεία για τους συγγραφείς σ’ όλα τα jokes του πίνακα. Πριν, όμως, γίνει αυτό, πρέπει να σταματήσουμε και να δούμε αν πήραμε τη σωστή απόφαση. Στην περίπτωση αυτή, αποδεικνύεται ότι όχι.

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

    Τι θα συμβεί αν κάποια που κάνει συχνά καταχωρήσεις στο site, με όνομα π.χ. Joan Smith, αλλάξει τη διεύθυνση του email της; Μπορεί να αρχίσει να υποβάλλει νέα jokes χρησιμοποιώντας την καινούργια διεύθυνση e-mail, αλλά όλα τα παλιά jokes θα έχουν ακόμη την παλιά διεύθυνση. Αν ρίξουμε μια ματιά στη βάση δεδομένων, θα νομίζουμε ότι υπάρχουν δύο διαφορετικοί χρήστες με το ίδιο όνομα Joan Smith, που έχουν κάνει καταχωρήσεις στη βάση δεδομένων. Οι ειδήμονες στη σχεδίαση των βάσεων δεδομένων αναφέρονται σ’ αυτό το είδος προβλήματος σαν ανωμαλία ενημέρωσης (update anomaly).

    Είναι φυσικό να βασιζόμαστε στη βάση δεδομένων για να έχουμε μια λίστα όλων των ατόμων που έχουν υποβάλλει jokes στο site. Θα μπορούμε εύκολα να αποκτήσουμε μια mailing list χρησιμοποιώντας το εξής ερώτημα (query) :

    mysql> SELECT DISTINCT AuthorName, AuthorEMail

    -> FROM Jokes;

    Η λέξη κλειδί DISTINCT στο παραπάνω query λέει στην MySQL να μην εμφανίσει τις διπλότυπες γραμμές. Για παράδειγμα, αν η Joan Smith υπέβαλλε 20 jokes στο site, το όνομα και η διεύθυνση του e-mail της θα εμφανισθούν 20 φορές στη λίστα αντί για μία μόνο αν δεν χρησιμοποιήσουμε την επιλογή DISTINCT.

    · Αν για κάποιο λόγο αποφασίσουμε να διαγράψουμε όλα τα jokes που έχει υποβάλλει στο site ένας συγκεκριμένος συγγραφέας, θα αφαιρε-θούν επίσης και όλα τα στοιχεία αυτού του ατόμου από τη βάση δεδομένων. Οι ειδήμονες στη σχεδίαση των βάσεων δεδομένων αναφέρονται σ’ αυτό το είδος προβλήματος σαν ανωμαλία διαγραφής (delete anomaly).

    · Δεν υπάρχει καμία εγγύηση ότι η Joan Smith δεν θα καταχωρήσει το όνομά της σαν Joan Smith την μια μέρα ή σαν J. Smith την επομένη και σαν Smith, Joan σε μια άλλη περίπτωση. Αυτό θα κάνει την παρακολούθηση ενός συγκεκριμένου συγγραφέα πάρα πολύ δύσκολη.

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

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

    Μπορούμε μετά να χρησιμοποιήσουμε τα ID’s των συγγραφέων στον πίνακα Jokes για να συσχετίσουμε τους συγγραφείς με τα jokes που έχουν υποβάλλει. Η πλήρης διάταξη της βάσης δεδομένων (database layout) είναι ως εξής :

    Jokes

    ID JokeText JokeDate AID
    1 Τι έκανε ο ... 2004-06-01 1
    2 Κάποιος μια μέρα ... 2004-05-10 1
    3 Μια φορά κι έναν ... 2003-12-10 2



    Authors

    ID Name Email
    1 Nick Nikolaidis nick@something.com
    2 John Papadopoulos john@greek.gr

    Αυτό που δείχνουν οι δύο παραπάνω πίνακες είναι τρία jokes και δύο συγγραφείς (authors). Η στήλη AID (Author ID) του πίνακα Jokes παρέχει μια σχέση (relationship) ανάμεσα στους δύο πίνακες, που δείχνει ότι ο Nick Nikolaidis υπέβαλλε τα jokes 1 και 2 και o John Papadopoulos υπέβαλλε το joke 3.

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

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

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

    Η δημιουργία της παραπάνω βάσης δεδομένων από το μηδέν είναι απλή υπόθεση : εκτελούμε δύο ερωτήματα CREATE TABLE, αλλά εφόσον θέλουμε να κάνουμε αυτές τις αλλαγές χωρίς να απωλέσουμε δεδομένα, θα πρέπει να χρησιμοποιήσουμε την εντολή ALTER. Πρώτα, θα διαγράψουμε από τον πίνακα Jokes τις στήλες που αναφέρονται στον συγγραφέα (author) :

    mysql> ALTER TABLE Jokes DROP COLUMN AuthorName;

    Query OK, 0 rows affected (0.00 sec)

    Records: 0 Duplicates: 0 Warnings: 0

    mysql> ALTER TABLE Jokes DROP COLUMN AuthorEMail;

    Query OK, 0 rows affected (0.00 sec)

    Records: 0 Duplicates: 0 Warnings: 0

    Τώρα δημιουργούμε τον καινούργιο πίνακα :

    mysql> CREATE TABLE Authors (

    -> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

    -> Name VARCHAR(100),

    -> EMail VARCHAR(100)

    -> );

    Τέλος, προσθέτουμε τη στήλη AID στον πίνακα Jokes :

    mysql> ALTER TABLE Jokes ADD COLUMN AID INT;

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

  4. #19

    Εγγραφή
    Jun 2008
    Περιοχή
    Athens
    Μηνύματα
    8.313
    Liked
    567 times
    Τα Στατιστικά μου στο Arcade
    Blog Entries
    3

    Re: PHP και MySQL

    Χειρισμός Πολλών Πινάκων

    Με τα δεδομένα μας να βρίσκονται τώρα σε δύο πίνακες, φαίνεται σαν να κάνουμε πιο περίπλοκη τη διαδικασία ανάκτησης αυτών των δεδομένων. Ας δούμε, για παράδειγμα, τον αρχικό μας στόχο : να εμφανίσουμε μια λίστα των jokes με το όνομα και τη διεύθυνση e-mail του συγγραφέα δίπλα σε κάθε joke. Στη λύση μ’ έναν πίνακα, θα μπορούμε να εμφανίσουμε όλα αυτά τα στοιχεία με μια μόνο εντολή SELECT μέσα στον κώδικα της PHP :

    $jokelist = mysql_query(

    "SELECT JokeText, AuthorName, AuthorEMail ".

    "FROM Jokes");

    while ($joke = mysql_fetch_array($jokelist)) {

    $joketext = $joke["JokeText"];

    $name = $joke["AuthorName"];

    $email = $joke["AuthorEMail"];

    // Εμφάνιση του joke με τα στοιχεία του συγγραφέα

    echo( "

    $joketext
    " .

    "(by $name)</P>" );

    }

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

    // Εμφάνιση της λίστας των jokes

    $jokelist = mysql_query(

    "SELECT JokeText, AID FROM Jokes");

    while ($joke = mysql_fetch_array($jokelist)) {

    // Εμφάνιση του κειμένου και του ID του συγγραφέα για το joke

    $joketext = $joke["JokeText"];

    $aid = $joke["AID"];

    // Εμφάνιση των στοιχείων του συγγραφέα για το joke

    $authordetails = mysql_query(

    "SELECT Name, Email FROM Authors WHERE ID=$aid");

    $author = mysql_fetch_array($authordetails);

    $name = $author["Name"];

    $email = $author["EMail"];

    // Εμφάνιση του joke με τα στοιχεία του συγγραφέα

    echo( "

    $joketext
    " .

    "(by $name)</P>" );

    }

    Αρκετά μπερδεμένο και περιέχει ένα ερώτημα (query) στη βάση δεδομένων για το κάθε joke που θέλουμε να εμφανίσουμε, κάτι που μπορεί να επιβραδύνει σημαντικά την εμφάνιση της σελίδας.

    Ευτυχώς, οι σχεσιακές βάσεις δεδομένων (relational databases) είναι σχεδιασμένες για να κάνουν εύκολη την εργασία με δεδομένα που είναι αποθηκευμένα σε πολλούς πίνακες. Χρησιμοποιώντας μια νέα μορφή της εντολής SELECT, που αποκαλείται join (ένωση), μπορούμε να πάρουμε στοιχεία και από τους δύο πίνακες.

    Με τα joins μπορούμε να αντιμετωπίσουμε τα συσχετισμένα δεδομένα που βρίσκονται σε πολλούς πίνακες σαν να ήταν αποθηκευμένα σ’ έναν μόνο πίνακα. Η σύνταξη ενός join είναι ως εξής :

    mysql> SELECT <columns> FROM <tables>

    -> WHERE <συνθήκη(ες) για τα δεδομένα>;

    Στην περίπτωσή μας, οι στήλες που μας ενδιαφέρουν είναι η JokeText στον πίνακα Jokes και οι Name και Email στον πίνακα Authors. Η συνθήκη για να συσχετίζεται μια καταχώρηση του πίνακα Jokes με μια καταχώρηση του πίνακα Authors, είναι η τιμή της στήλης AID στον πίνακα Jokes να είναι ίση με την τιμή της στήλης ID στον πίνακα Authors.

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

    mysql> SELECT LEFT(JokeText,20), AID FROM Jokes;

    +----------------------+------+
    | LEFT(JokeText,20) | AID |

    +----------------------+------+
    | Τι έκανε ο ... | 1 |

    | Κάποιος μια μέρα ... | 1 |

    | Μια φορά κι έναν ... | 2 |

    +----------------------+------+
    3 rows in set (0.00 sec)

    mysql> SELECT * FROM Authors;

    +----+------------+---------------------+
    | ID | Name | EMail |

    +----+------------+---------------------+

    | 1 | Nick Nikolaidis | nick@something.com |

    | 2 | John Papadopoulos | john@greek.gr |

    +----+------------+---------------------+

    2 rows in set (0.00 sec)



    mysql> SELECT LEFT(JokeText,15), Name, Email

    -> FROM Jokes, Authors WHERE AID = Authors.ID;

    +-------------------+------------+--------- -- -

    | LEFT(JokeText,15) | Name | Email

    +-------------------+------------+--------- -- -

    | Τι έκανε ο ... | Nick Nikolaidis| nick@something.com

    | Κάποιος μια μέρα ... | Nick Nikolaidis| nick@something.com

    | Μια φορά κι έναν ... | John Papadopoulos | john@greek.gr |

    +-------------------+------------+--------- -- -

    3 rows in set (0.00 sec)

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

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

    mysql> SELECT LEFT(JokeText,20), Name, Email

    -> FROM Jokes, Authors WHERE AID = ID;

    ERROR 1052: Column: 'ID' in where clause is ambiguous

    Τώρα που γνωρίζουμε πώς να φθάσουμε στα δεδομένα που είναι αποθηκευμένα στους δύο πίνακες, μπορούμε να ξαναγράψουμε τον κώδικα για τη λίστα με τα jokes, για να εκμεταλλευτούμε τα joins :

    $jokelist = mysql_query(

    "SELECT JokeText, Name, EMail " .

    "FROM Jokes, Authors WHERE AID=Authors.ID");

    while ($joke = mysql_fetch_array($jokelist)) {

    $joketext = $joke["JokeText"];

    $name = $joke["Name"];

    $email = $joke["EMail"];

    // Εμφάνιση του joke με τα στοιχεία του συγγραφέα

    echo( "

    $joketext
    " .

    "(by $name)</P>" );

    }

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

    Ας δούμε, για παράδειγμα, το παρακάτω ερώτημα, το οποίο εμφανίζει μια λίστα όλων των jokes που έχουν γραφεί από την Joan Smith :

    mysql> SELECT JokeText FROM Jokes, Authors WHERE

    -> Name="Joan Smith" AND AID=Authors.ID;

    Τα αποτελέσματα που δημιουργούνται από το παραπάνω ερώτημα προέρχονται μόνο από τον πίνακα Jokes, αλλά χρησιμοποιούμε ένα join για να μπορούμε να αναζητήσουμε jokes που βασίζονται σε μια τιμή που είναι αποθηκευμένη στον πίνακα Authors.

  5. #20

    Εγγραφή
    Jun 2008
    Περιοχή
    Athens
    Μηνύματα
    8.313
    Liked
    567 times
    Τα Στατιστικά μου στο Arcade
    Blog Entries
    3

    Re: PHP και MySQL

    Απλές Σχέσεις Δεδομένων (Ένα-Προς-Ένα και Ένα-Προς-Πολλά)

    Το καλύτερο είδος διάταξης βάσης δεδομένων (database layout) για μια δεδομένη κατάσταση καθορίζεται συνήθως από τον τύπο της σχέσης που υπάρχει ανάμεσα στα δεδομένα με τα οποία δουλεύουμε. Θα δούμε τους συνηθέστερους τύπους σχέσεων και πώς μπορούμε να τους παραστήσουμε σε μια σχεσιακή βάση δεδομένων (relational database).

    Στην περίπτωση μιας απλής ένα-προς-ένα σχέσης, αυτό που χρειάζεται είναι ένας μόνον πίνακας. Ένα παράδειγμα μιας σχέσης ένα-προς-ένα είναι η e-mail διεύθυνση του κάθε συγγραφέα στη βάση δεδομένων joke. Εφόσον υπάρχει μια διεύθυνση e-mail για τον κάθε συγγραφέα και ένας συγγραφέας για την κάθε e-mail διεύθυνση, δεν υπάρχει κανένας λόγος να καταχωρήσουμε τις διευθύνσεις σ’ έναν ξεχωριστό πίνακα.

    Μια σχέση ένα-προς-πολλά είναι λίγο περισσότερο πολύπλοκη, αλλά έχουμε ήδη συναντήσει μια τέτοια περίπτωση. Το κάθε joke στη βάση δεδομένων συσχετίζεται μ’ έναν μόνον συγγραφέα, αλλά πολλά jokes μπορεί να έχουν γραφεί από τον ίδιο συγγραφέα. Αυτή η σχέση joke-συγγραφέα είναι ένα-προς-πολλά (many-to-one).

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

    Χωρίζοντας τα δεδομένα σε δύο πίνακες και χρησιμοποιώντας μια στήλη ID για να τα συνδέσουμε, αντιμετωπίζονται όλα τα παραπάνω προβλήματα. Στην περίπτωση που μερικοί συγγραφείς διαθέτουν περισσότερα από ένα e-mail, μπορούμε να δημιουργήσουμε έναν πίνακα EMails και να τον συσχετίσουμε με τον πίνακα Authors με τη στήλη ID.

    Authors

    ID Name
    1 Nick Nikolaidis
    2 John Ioannidis



    EMails

    ID EMail AID
    1 nick100@florina.gr 1
    2 nick@in.gr 1
    3 john200@florina.gr 2
    4 johngr@in.gr 2

    Χρησιμοποιώντας ένα join, μπορούμε εύκολα να εμφανίσουμε τις διευθύνσεις e-mail που ανήκουν σ’ έναν συγκεκριμένο συγγραφέα :

    mysql> SELECT EMail FROM Authors, EMails WHERE

    -> Name="Nick Nikolaidis" AND AID=Authors.ID;

    +---------------------+

    | EMail |

    +---------------------+

    | nick100@florina.gr |

    | nick@in.gr |

    +---------------------+

    2 rows in set (0.00 sec)

 

 

Πληροφορίες Θέματος

Users Browsing this Thread

Υπάρχουν 1 χρήστης/ες που πλοηγούνται σ' αυτό το θέμα. (0 μέλος/η και 1 επισκέπτης/ες)

Παρόμοια Θέματα

  1. (TUTORIALS) MySQL σε απλά μαθήματα
    By Dr.Overflow in forum PHP και MySQL
    Απαντήσεις: 9
    Τελευταίο Μήνυμα: 13-10-2008, 17:43
  2. Απαντήσεις: 8
    Τελευταίο Μήνυμα: 09-08-2008, 07:36

Δικαιώματα - Επιλογές

  • Δεν μπορείτε να δημοσιεύετε νέα θέματα
  • Δεν μπορείτε να απαντάτε σε θέματα
  • Δεν μπορείτε να δημοσιεύετε συνημμένα
  • Δεν μπορείτε να επεξεργάζεστε τις δημοσιεύσεις σας
  •