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

Προχωρημένα Θέματα στην PHP

Αυτή είναι μια συζήτηση με θέμα: Προχωρημένα Θέματα στην PHP στο forums PHP και MySQL, μέρος της κατηγορίας Supa Wikipedia (Βοηθήματα) : Server-Side Includes με την PHP Αν έχετε δουλέψει για λίγο στο Internet, θα έχετε ίσως συναντήσει τον όρο Server-Side Includes .....

  1. #16

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

    Re: Προχωρημένα Θέματα στην PHP

    Server-Side Includes με την PHP

    Αν έχετε δουλέψει για λίγο στο Internet, θα έχετε ίσως συναντήσει τον όρο Server-Side Includes (SSI's). Στην ουσία, τα SSI's μάς δίνουν τη δυνατότητα να καταχωρήσουμε το περιεχόμενο ενός αρχείου που είναι αποθηκευμένο στον Web server μας, στη μέση ενός άλλου. Η πιο κοινή χρήση αυτής της δυνατότητας είναι για να ενθυλακώσουμε (encapsulate) τα στοιχεία κοινής σχεδίασης ενός Web site σε μικρά HTML αρχεία που θα μπορούν έτσι να συμπεριληφθούν στις Web pages on the fly (στον αέρα).

    Οποιαδήποτε αλλαγή σ’ αυτά τα μικρά αρχεία επηρεάζει αμέσως όλα τα αρχεία που τα συμπεριλαμβάνουν. Και όπως ακριβώς ένα PHP script, ο Web browser δεν χρειάζεται να γνωρίζει ποια είναι αυτά εφόσον ο Web server είναι αυτός που κάνει όλη τη δουλειά πριν στείλει την ζητούμενη σελίδα στον browser. Η PHP έχει μια συνάρτηση που παρέχει παρόμοιες δυνατότητες. Αλλά εκτός από το να περιλαμβάνει κανονική HTML και άλλα στατικά στοιχεία στα συμπεριλαμβανόμενα αρχεία, μπορούμε επίσης να συμπεριλάβουμε κοινά στοιχεία script. Ας δούμε ένα παράδειγμα :



    <?php

    echo( "

    Hallo from Florina!\n" );

    ?>

    Το παραπάνω αρχείο, include-me.inc, περιέχει κάποιον απλό κώδικα PHP. Το όνομα του αρχείου έχει κατάληξη .inc και όχι .php. Η ιδέα εδώ είναι να ονομάσουμε το αρχείο με κάτι διαφορετικό απ’ αυτό που θα περίμενε ο Web server για ένα PHP script. Αυτό εξασφαλίζει ότι το αρχείο θα μπορεί να εκτελεσθεί μόνο αν συμπεριληφθεί σ’ ένα από τα .php αρχεία και επίσης μας βοηθάει να διαχωρίσουμε τις ιστοσελίδες της PHP από τα include αρχεία της PHP.

    Θα χρειαστούμε επίσης και το εξής αρχείο :



    <HTML>

    <HEAD>

    <TITLE> Test of PHP Includes </TITLE>

    </HEAD>

    <BODY>

    <?php

    include("include-me.inc");

    ?>

    </BODY>

    </HTML>

    Αυτό το αρχείο μοιάζει περισσότερο με τα PHP scripts που γνωρίζουμε καθώς έχει επέκταση .php ή .php3 αν το απαιτεί ο server. Στην κλήση της συνάρτησης include() καθορίζουμε το όνομα του αρχείου που θέλουμε να συμπεριλάβουμε (include-me.inc) και η PHP θα προσπαθήσει να πάρει το αρχείο αυτό και να το ενσωματώσει. Κάνουμε upload και τα δύο παραπάνω αρχεία στον Web server και φορτώνουμε το testinclude.php στον browser. Θα δούμε μια Web page που θα περιέχει το μήνυμα από το include αρχείο, όπως αναμενόταν.

    Αν αυτό το παράδειγμα δεν δουλέψει, θα χρειασθεί να κάνουμε configure την επιλογή include_path στο αρχείο php.ini. Ανοίγουμε το αρχείο μ’ έναν text editor και ψάχνουμε μια γραμμή που ξεκινά με το include_path. Αυτή η ρύθμιση δουλεύει όπως ακριβώς η γνωστή μας μεταβλητή περιβάλλοντος PATH και περιέχει μια λίστα των καταλόγων όπου θα πρέπει να ψάξει η PHP για τα αρχεία που της ζητάμε να κάνει include. Τη ρυθμίζουμε ώστε να περιέχει το "." (το τρέχον directory).

    Ανάλογα με το αν ο server μας τρέχει κάτω από τα Windows ή το UNIX, θα χρειασθεί να περιβάλλουμε τη ρύθμιση με εισαγωγικά :

    Στο UNIX :

    include_path=.:/another/directory

    Στα Windows :

    include_path=".;c:\another\directory"

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

  2. #17

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

    Re: Προχωρημένα Θέματα στην PHP

    Αυξημένη Ασφάλεια με τα Includes

    Τα scripts της PHP θα περιέχουν μερικές φορές ευαίσθητες πληροφορίες όπως usernames, passwords και άλλα για τα οποία δεν θέλουμε να υπάρχει πρόσβαση από τρίτους. Μέχρι τώρα έχουμε χρησιμοποιήσει τη συνάρτηση mysql_connect(), η οποία ζητάει από μας να καταχωρήσουμε το username και password που έχουμε στην MySQL σ’ ένα script της PHP που χρειάζεται πρόσβαση σε μια βάση δεδομένων.

    Ενώ μπορούμε να ρυθμίσουμε την MySQL έτσι ώστε το username και το password που χρησιμοποιούνται από την PHP να μην μπορούν να χρησιμοποιηθούν από ενδεχόμενους hackers, ορίζοντας το πεδίο Host στον πίνακα user, θα είμαστε ήσυχοι γνωρίζοντας ότι το username και το password που έχουμε, προστατεύονται από ένα αυξημένο επίπεδο ασφάλειας.

    Αλλά εφόσον η PHP επεξεργάζεται στον server, δεν υπάρχει περίπτωση να δει κάποιος το δικό μου password; Σωστά, αλλά ας δούμε τι θα συμβεί αν η PHP σταματήσει να εργάζεται στον server. Τότε οι σελίδες της PHP θα αντιμετωπισθούν σαν απλά αρχεία κειμένου (text files) μαζί μ’ όλο τον κώδικα της PHP, καθώς και το password, και θα είναι ορατές σ’ όλους.

    Για να προστατευτούμε απ’ αυτήν την παράβαση ασφάλειας, θα πρέπει να τοποθετήσουμε όλο τον κώδικα τον σχετικό με την ασφάλεια σ’ ένα αρχείο include και να τοποθετήσουμε αυτό το αρχείο σ’ ένα directory που δεν αποτελεί μέρος της δομής καταλόγων του Web server. Προσθέτοντας αυτό το directory στη ρύθμιση include_path της PHP (στο php.ini), θα μπορούμε να αναφερόμαστε απευθείας στα αρχεία με τη συνάρτηση include() της PHP αλλά θα πρέπει να τα στριμώξουμε κάπου μακριά όπου ο Web server δεν μπορεί να τα εμφανίσει σαν Web pages.

    Για παράδειγμα, αν ο Web server περιμένει όλες οι Web pages να βρίσκονται στον κατάλογο και στους υποκαταλόγους του /home/httpd/, θα μπορούμε να δημιουργήσουμε έναν κατάλογο με όνομα /home/phplib/ για να τοποθετήσουμε εκεί όλα τα αρχεία include. Προσθέτουμε αυτόν τον κατάλογο στο include_path και είμαστε έτοιμοι.

    Το παρακάτω παράδειγμα δείχνει πώς μπορούμε να τοποθετήσουμε τον κώδικα σύνδεσης της βάσης δεδομένων σ’ ένα αρχείο include :



    <?php

    $cnx = mysql_connect("localhost", "root", "rootpassword");

    ?>

    Και ένα αρχείο που χρησιμοποιεί αυτό το include :



    <?php

    // Σύνδεση με την MySQL

    include("dbConnect.inc");

    mysql_select_db("myDatabase",$cnx);

    ...

    Όπως μπορούμε να δούμε, αν η PHP σταματήσει να δουλεύει στον server, αυτό που θα φανεί ελεύθερα θα είναι μια κλήση της συνάρτησης include(). Το username και το password είναι αποθηκευμένα με ασφάλεια στο αρχείο dbConnect.inc, για το οποίο δεν υπάρχει απευθείας πρόσβαση από το Web.

  3. #18

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

    Re: Προχωρημένα Θέματα στην PHP

    Ημι-Δυναμικές Σελίδες

    Θα πρέπει να έχουμε υπόψη μας ότι οι δυναμικά παραγόμενες database-driven σελίδες απαιτούν πολύ μεγαλύτερη υπολογιστική ισχύ από τον υπολογιστή που τρέχει το λογισμικό του Web server σε σχέση με τα απλά αρχεία HTML, επειδή η αίτηση (request) για κάθε σελίδα είναι σαν ένα μικρό πρόγραμμα που εκτελείται σ’ αυτόν τον υπολογιστή. Ενώ μερικές σελίδες ενός database-driven site πρέπει πάντα να εμφανίζουν δεδομένα της τελευταίας στιγμής που τα επιλέγουν από τη βάση δεδομένων, για άλλες δεν υπάρχει τέτοια απαίτηση.

    Μετατρέποντας τις δυναμικές σελίδες σε ημι-δυναμικές (semi-dynamic), οι οποίες είναι στατικές σελίδες που αναδημιουργούνται δυναμικά σε τακτικά χρονικά διαστήματα για να ανανεώσουν το περιεχόμενό τους, θα μειώσουμε κατά πολύ το φορτίο που επιβάλλουν τα database-driven συστατικά του site στην επίδοση του Web server.

    Ας υποθέσουμε ότι έχουμε το αρχείο index.php σαν την πρώτη μας σελίδα (front page), που περιέχει μια σύνοψη (summary) του νέου περιεχομένου στο site. Κάνοντας μια εξέταση στα server logs, ίσως ανακαλύψουμε ότι είναι μια από τις πιο δημοφιλείς σελίδες του site. Αντιλαμβανόμαστε λοιπόν ότι αυτή η σελίδα δεν είναι απαραίτητο να δημιουργείται δυναμικά για κάθε αίτηση (request).

    Καθώς ενημερώνεται κάθε φορά που προστίθεται νέο περιεχόμενο στο site, θα είναι τόσο δυναμική όσο χρειάζεται. Χρησιμοποιώντας ένας script της PHP, μπορούμε να δημιουργήσουμε ένα στατικό στιγμιότυπο (snap-shot) της εξόδου της δυναμικής σελίδας και να το τοποθετήσουμε online στη θέση της δυναμικής έκδοσης, με το όνομα index.html.

    Οι συναρτήσεις της PHP που θα χρειασθούμε είναι οι εξής :

    fopen(), Ανοίγει ένα αρχείο για διάβασμα ή/και γράψιμο. Αυτό το αρχείο μπορεί να αποθηκευθεί στον σκληρό δίσκο του server ή μπορεί να φορτωθεί από ένα URL.

    fclose(), Λέει στην PHP ότι έχουμε τελειώσει με το διάβασμα/γράψιμο ενός συγκεκριμένου αρχείου και το απελευθερώνουμε για να μπορέσει να χρησιμοποιηθεί από άλλα προγράμματα ή scripts.

    fread(), Διαβάζει δεδομένα από ένα αρχείο σε μια μεταβλητή της PHP.

    fwrite(), Γράφει δεδομένα από μια μεταβλητή της PHP σ’ ένα αρχείο.

    copy(), Κάνει αντιγραφή αρχείου.

    unlink(), Διαγράφει ένα αρχείο από τον σκληρό δίσκο.

    Δημιουργούμε ένα αρχείο με όνομα generateindex.php, το οποίο θα αναλάβει να φορτώσει το αρχείο index.php, τη δυναμική έκδοση της πρώτης σελίδας, όπως θα έκανε ένας Web browser, και μετά δημιουργεί τη στατική έκδοση αυτού του αρχείου σαν μια ενημερωμένη έκδοση του αρχείου index. html.

    Αν πάει κάτι στραβά στην όλη διαδικασία, θα θέλουμε να αποφύγουμε την καταστροφή του καλού αντιγράφου του αρχείου index.html, έτσι θα πρέπει αυτό το script να δημιουργήσει την καινούργια στατική έκδοση σ’ ένα προσωρινό αρχείο (tempindex.html) και μετά να την αντιγράψει πάνω στο αρχείο index.html αν όλα είναι εντάξει.

    Ακολουθεί ο κώδικας για το αρχείο generateindex.php, με επαρκή σχολιασμό :



    <?php

    // Ορίζουμε τα αρχεία που θα χρησιμοποιήσουμε

    $srcurl = "http://localhost/index.php";

    $tempfilename = "tempindex.html";

    $targetfilename = "index.html";

    ?>

    <HTML>

    <HEAD>

    <TITLE> Δημιουργία του <?php echo("$targetfilename"); ?>

    </TITLE>

    </HEAD>

    <BODY>



    Δημιουργία του <?php echo("$targetfilename"); ?> ... </P>

    <?php

    // Ξεκινάμε διαγράφοντας το προσωρινό αρχείο. Για να μην εμφανισθεί

    // κάποιο μήνυμα λάθους, χρησιμοποιούμε το @.

    @unlink($tempfilename);

    // Φορτώνουμε τη δυναμική σελίδα ζητώντας την μ’ ένα URL. Η PHP

    // θα επεξεργαστεί από τον Web server πριν την λάβουμε, έτσι αυτό που

    // θα λάβουμε θα είναι μια στατική HTML σελίδα. Το 'r' δείχνει ότι

    // θέλουμε μόνο να διαβάσουμε απ’ αυτό το αρχείο.

    $dynpage = fopen($srcurl, 'r');

    // Έλεγχος για λάθη

    if (!$dynpage) {

    echo("

    Δεν μπορεί να φορτωθεί το $srcurl. Στατική σελίδα ".

    "η ενημέρωση διακόπηκε!</P>");

    exit();

    }

    // Διαβάζουμε τα περιεχόμενα του URL σε μια μεταβλητή της PHP

    // variable. Ξεκαθαρίζουμε ότι θέλουμε να διαβάσουμε μέχρι 1 MB

    // δεδομένων.

    $htmldata = fread($dynpage, 1024*1024);

    // Κλείνουμε τη σύνδεση με το πηγαίο αρχείο.

    fclose($dynpage);

    // Ανοίγουμε το προσωρινό αρχείο για να γράψουμε σ’ αυτό ('w').

    $tempfile = fopen($tempfilename, 'w');

    // Έλεγχος για λάθη

    if (!$tempfile) {

    echo("

    Δεν μπορεί να ανοίξει το προσωρινό αρχείο ".

    "($tempfilename) για γράψιμο. Στατική σελίδα ".

    "η ενημέρωση διακόπηκε!</P>");

    exit();

    }

    // Γράφουμε τα δεδομένα για τη στατική σελίδα στο προσωρινό αρχείο.

    fwrite($tempfile, $htmldata);

    // Κλείνουμε το προσωρινό αρχείο.

    fclose($tempfile);

    // Αν έχουμε φθάσει μέχρι εδώ, τότε το προσωρινό αρχείο γράφτηκε με

    // επιτυχία και μπορούμε τώρα να το αντιγράψουμε στην κορυφή της

    // στατικής σελίδας.

    $ok = copy($tempfilename, $targetfilename);

    // Τέλος, διαγράφουμε το προσωρινό αρχείο.

    unlink($tempfilename);

    ?>



    Η στατική σελίδα ενημερώθηκε με επιτυχία! </P>

    </BODY>

    </HTML>

    Τώρα, κάθε φορά που εκτελείται το generateindex.php, όπως όταν το ζητάμε μ’ έναν browser, δημιουργείται ένα πρόσφατο αντίγραφο του αρχείου index.html από το αρχείο index.php. Μετακινώντας τα αρχεία index.php και generateindex.php σ’ έναν κατάλογο όπου υπάρχει περιορισμένη πρόσβαση, μπορούμε να βεβαιωθούμε ότι μόνο οι site administrators θα μπορούν να ενημερώσουν την πρώτη σελίδα του site.

    Αν θέλουμε να ενημερώνεται αυτόματα η πρώτη μας σελίδα, θα πρέπει να ορίσουμε τον server να εκτελεί το αρχείο generateindex.php σε τακτά χρονικά διαστήματα, όπως κάθε ώρα.

  4. #19

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

    Re: Προχωρημένα Θέματα στην PHP

    Χειρισμός των File Uploads

    Όλα τα παραδείγματα των database-driven Web sites που έχουμε δει μέχρι τώρα είχαν να κάνουν με sites που βασίζονταν σε δεδομένα κειμένου. Για να μπορέσουν οι χρήστες να φορτώσουν (upload) κι άλλα δεδομένα, όπως αρχεία εικόνων, θα πρέπει να τους δώσουμε αυτή τη δυνατότητα και θα πρέπει να μπορούμε να παρακολουθούμε την όλη διαδικασία.

    Θα ξεκινήσουμε με τα βασικά : θα δημιουργήσουμε μια φόρμα στην HTML που θα δίνει τη δυνατότητα στους χρήστες να κάνουν upload αρχείων. Στην HTML αυτό γίνεται εύκολα με το tag <INPUT TYPE=FILE>. Όμως, εξ ορισμού, στέλνεται μόνο το όνομα του αρχείου που έχει επιλεγεί από τον χρήστη.

    Για να μπορέσει να υποβληθεί και το ίδιο το αρχείο μαζί με τα δεδομένα της φόρμας, θα πρέπει να προσθέσουμε το ENCTYPE="multipart/form-data" στο tag <FORM>, ως εξής :

    <FORM ACTION="fileupload.php" METHOD=POST

    ENCTYPE="multipart/form-data">



    Επιλέξτε αρχείο για upload :

    <INPUT TYPE=FILE NAME="uploadedfile"></P>



    <INPUT TYPE=SUBMIT NAME="submit"

    VALUE="Submit"></P>

    </FORM>

    Όπως μπορούμε να δούμε, ένα script της PHP (fileupload.php) θα χειρισθεί τα δεδομένα που υποβάλλονται με τη φόρμα παραπάνω. Όπως θα περιμέναμε, θα δημιουργηθεί αυτόματα μια μεταβλητή της PHP με όνομα $uploadedfile (από το χαρακτηριστικό NAME του tag <INPUT> tag).

    Όμως, αντί να αποθηκεύει τα περιεχόμενα του αρχείου που γίνεται upload, η $uploadedfile περιέχει το όνομα του αρχείου που είναι αποθηκευμένο στον σκληρό δίσκο του Web server, στον κατάλογο που έχει ορισθεί από τη μεταβλητή περιβάλλοντος TEMP. Αυτός ο κατάλογος είναι ο C:\Windows\TEMP\ στα περισσότερα συστήματα των Windows 9x.

    Αυτό το αρχείο κρατείται μόνο για όσο χρόνο εκτελείται το script της PHP που είναι υπεύθυνο για τον χειρισμό της υποβολής της φόρμας, έτσι αν θελήσουμε να το χρησιμοποιήσουμε για κάτι, θα πρέπει να κάνουμε ένα αντίγραφό του κάπου αλλού με την συνάρτηση copy() που είδαμε προηγούμενα.

    Εκτός από τη $uploadedfile, τρεις άλλες μεταβλητές δημιουργούνται αυτόματα επίσης. Η $uploadedfile_name περιέχει το όνομα του αρχείου πριν από την υποβολή του (τα υποβαλλόμενα αρχεία αποθηκεύονται σαν phpx, όπου το x είναι ένας αριθμός, στον κατάλογο TEMP), η $uploadedfile_size περιέχει το μέγεθος (σε bytes) του αρχείου και η $uploadedfile_type περιέχει τον τύπο MIME, δηλ. text/plain, image/gif κοκ, του αρχείου.

    Δεν πρέπει να ξεχνάμε ότι το "uploadedfile" είναι απλά το NAME του INPUT tag που υπέβαλλε το αρχείο, έτσι τα πραγματικά ονόματα αυτών των μεταβλητών θα εξαρτώνται απ’ αυτό το χαρακτηριστικό (attribute). Μπορούμε να χρησιμοποιήσουμε αυτές τις μεταβλητές για να αποφασίσουμε αν θα αποδεχθούμε ή θα απορρίψουμε ένα αρχείο που γίνεται upload. Για παράδειγμα, από τα αρχεία γραφικών που διαθέτουμε θα μας ενδιαφέρουν μόνο τα JPEG και τα GIF αρχεία.

    Αυτά τα αρχεία έχουν τύπους MIME image/pjpeg και image/gif αντίστοιχα, έτσι ο κώδικας για την επικύρωση των αρχείων που γίνονται uploaded μπορεί να είναι ως εξής :

    if ("image/pjpeg" == $uploadedfile_type or "image/gif" ==

    $uploadedfile_type) {

    // Χειρισμός του αρχείου …

    } else {

    echo("

    Παρακαλώ στείλτε (submit) ένα JPEG ή GIF αρχείο εικόνας (image file).\n");

    }

    Ενώ μπορούμε να χρησιμοποιήσουμε μια παρόμοια τεχνική για να απορρίψουμε τα αρχεία που είναι πάρα πολύ μεγάλα (ελέγχοντας τη μεταβλητή $uploadedfile_size), αυτό δεν αποτελεί συνήθως μια καλή ιδέα. Πριν μπορέσει να ελεγχθεί αυτή η τιμή, το αρχείο έχει ήδη γίνει upload και είναι απoθηκευμένο στον κατάλογο TEMP. Αν προσπαθήσουμε να απορρίψουμε αρχεία εξαιτίας του περιορισμένου χώρου στον δίσκο ή/και του εύρους ζώνης, το γεγονός ότι τα μεγάλα αρχεία μπορούν ακόμη να γίνουν uploaded, ίσως να είναι ένα πρόβλημα για μας.

    Αντί γι’ αυτό, μπορούμε να ενημερώσουμε νωρίτερα την PHP για το μεγαλύτερο μέγεθος αρχείου που θέλουμε να κάνουμε αποδεκτό. Υπάρχουν δύο τρόποι για να το κάνουμε αυτό. Ο πρώτος είναι αλλάζοντας τη ρύθμιση upload_max_filesize στο αρχείο php.ini. Η προκαθορισμένη τιμή είναι 2MB, έτσι αν θελήσουμε να αποδεχθούμε uploads μεγαλύτερα απ’ αυτά θα πρέπει να αλλάξουμε αυτήν την τιμή.

    Η δεύτερη μέθοδος είναι να συμπεριλάβουμε ένα κρυμμένο πεδίο INPUT στη φόρμα μας με το όνομα MAX_FILE_SIZE και το μέγιστο μέγεθος αρχείου που θέλουμε να κάνουμε αποδεκτό μ’ αυτή τη φόρμα. Για λόγους ασφαλείας, αυτή η τιμή δεν μπορεί να υπερβεί τη ρύθμιση upload_max_ filesize στο αρχείο php.ini, αλλά παρέχει έναν τρόπο αποδοχής διαφορετικών μέγιστων μεγεθών σε διαφορετικές σελίδες.

    Η ακόλουθη φόρμα, για παράδειγμα, θα επιτρέπει uploads έως και 1 kilobyte (1.024 bytes) :

    <FORM ACTION="fileupload.php" METHOD=POST

    ENCTYPE="multipart/form-data">



    Επιλέξτε αρχείο για upload :

    <INPUT TYPE=FILE NAME="uploadedfile"></P>



    <INPUT TYPE=SUBMIT NAME="submit"

    VALUE="Submit"></P>

    <INPUT TYPE=HIDDEN NAME=MAX_FILE_SIZE

    VALUE=1024>

    </FORM>

  5. #20

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

    Re: Προχωρημένα Θέματα στην PHP

    Εκχώρηση Μοναδικών Ονομάτων Αρχείων

    Όπως είπαμε παραπάνω, για να διατηρήσουμε ένα αρχείο που γίνεται upload, πρέπει να το αντιγράψουμε σ’ έναν άλλον κατάλογο για σιγουριά. Και ενώ έχουμε πρόσβαση με τη μεταβλητή $uploadedfile_name στο όνομα του κάθε αρχείου που γίνεται upload, δεν υπάρχει καμία εγγύηση ότι δεν θα γίνουν upload δύο αρχεία με το ίδιο όνομα. Σε μια τέτοια περίπτωση, η αποθήκευση του αρχείου με το αρχικό του όνομα μπορεί να έχει σαν αποτέλεσμα τα νεότερα uploads να καλύπτουν τα παλαιότερα.

    Γι’ αυτόν τον λόγο, θα θελήσουμε συχνά να υιοθετήσουμε ένα σχήμα για να μπορούμε να εκχωρούμε ένα μοναδικό όνομα αρχείου σ’ όλα τα αρχεία που γίνονται upload. Χρησιμοποιώντας την ώρα του συστήματος, την οποία μπορούμε να πάρουμε με τη συνάρτηση time() της PHP, μπορούμε εύκολα να έχουμε ένα όνομα που να βασίζεται στον αριθμό των δευτερολέπτων μετά την 1/1/1970. Τι θα συμβεί, όμως, αν δύο αρχεία τύχει να γίνουν upload μέσα σε λιγότερο από ένα δευτερόλεπτο;

    Για να το αποφύγουμε αυτό, θα χρησιμοποιήσουμε επίσης και τη διεύθυνση ΙΡ του πελάτη, η οποία αποθηκεύεται αυτόματα στη μεταβλητή $REMOTE_HOST από την PHP, για το όνομα του αρχείου. Εφόσον είναι απίθανο να λάβουμε δύο αρχεία από την ίδια ΙΡ διεύθυνση μέσα σε λιγότερο από ένα δευτερόλεπτο, αυτό αποτελεί μια αποδεκτή λύση για τους σκοπούς μας.

    // Επιλέγουμε μια επέκταση αρχείου (file extension)

    if ( "image/pjpeg" == $uploadedfile_type )

    $extension = ".jpg";

    else

    $extension = ".gif";

    // Το πλήρες path/filename

    $filename = "C:\\Uploads\\" . time() .

    $REMOTE_HOST . $extension;

    // Αντιγράφουμε το αρχείο

    if (copy($uploadedfile, $filename)) {

    echo("

    Το αρχείο αποθηκεύθηκε επιτυχώς ως $filename.");

    } else {

    echo("

    Δεν μπόρεσε να αποθηκευθεί το αρχείο ως $filename!");

    }

    Πρέπει να χρησιμοποιήσουμε τους δύο χαρακτήρες \\ για τη διαδρομή (path) στα Windows εφόσον ο χαρακτήρας \ χρησιμοποιείται για να δηλώσει ειδικούς χαρακτήρες στα strings κειμένου της PHP. Σε περιβάλλον UNIX, μπορούμε να χρησιμοποιήσουμε τους χαρακτήρες / όπως συνήθως.

  6. #21

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

    Re: Προχωρημένα Θέματα στην PHP

    Το e-mail στην PHP

    Το email είναι ένα ισχυρό εργαλείο στο Internet. Είτε θέλουμε να παρέχουμε ένα εβδομαδιαίο "what's new" newsletter στους χρήστες μας ή έναν τρόπο να ανακτήσουν ένα ξεχασμένο password, το e-mail είναι η λύση. Η PHP κάνει την εργασία με το e-mail εξαιρετικά εύκολη επιτρέποντάς μας να στέλνουμε μηνύματα κάνοντας μια απλή κλήση στην συνάρτηση mail().

    Πριν μπορέσουμε να στείλουμε e-mail χρησιμοποιώντας τη συνάρτηση mail(), θα πρέπει πρώτα να ορίσουμε τις επιλογές της PHP σχετικά με το e-mail. Ακολουθούν οι σχετικές γραμμές ενός ασυνήθιστου αρχείου php.ini στα Windows :

    [mail function]

    SMTP = localhost ;μόνο για win32

    sendmail_from = me@localhost.com ;μόνο για win32

    ;sendmail_path = ;μόνο για unix

    Ανάλογα με το αν χρησιμοποιούμε την έκδοση για τα Windows ή το UNIX, η PHP θα στείλει mail μέσω ενός SMTP server ή με το τοπικό σύστημα sendmail, αντίστοιχα. Αν εργαζόμαστε με τα Windows, όμως, είναι πολύ πιθανό ο ISP να μας έχει ήδη προμηθεύσει έναν SMTP για να τον χρησιμοποιήσουμε. Είναι ο ίδιος server που ορίσαμε για να στέλνουμε μηνύματα. Θέτουμε τη ρύθμιση SMTP στη διεύθυνση του hostname/IP αυτού του server.

    Το sendmail_from θα πρέπει να τεθεί ίσο με την προκαθορισμένη διεύθυνση e-mail από την οποία θα θέλαμε να προέρχονται τα e-mails που στέλνονται από την PHP. Τέλος, το sendmail_path στο UNIX δεν θα πρέπει να έχει σχόλια και πρέπει να τεθεί ίσο με τη διαδρομή και το όνομα αρχείου του προγράμματος sendmail στο σύστημά μας. Στο Linux, αυτή είναι συνήθως η /usr/sbin/ sendmail.

    Αφού τεθεί αυτή η ρύθμιση και επανεκκινήσει ο Web server, η PHP θα πρέπει να είναι εφοδιασμένη με πλήρεις δυνατότητες για e-mail. Η αποστολή ενός e-mail στην PHP δεν μπορεί να είναι τώρα ευκολότερη :

    mail("to-address@somewhere.com", "Message Subject",

    "Αυτό είναι το σώμα (body) του μηνύματος.");

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

    mail("to1@mail.net, to2@mail.net, ...", "Message Subject",

    "Message body");

    Η προσθήκη επιπλέον επικεφαλίδων (headers), για τον καθορισμό των διευθύνσεων From: ή Reply-To:, για παράδειγμα, είναι επίσης πολύ εύκολη. Τις προσθέτουμε απλά σαν μια τέταρτη παράμετρο, χωρισμένες με τα ζευγάρια των χαρακτήρων carriage return-newline, ως εξής :

    mail("to@mail.net", "Message Subject", "Message body",

    "From: webmaster@host.com\r\nReply-to:admin@host.com");

    Σε συνδυασμό με μια βάση δεδομένων, είναι πολύ εύκολη η διαχείριση μιας mailing list. Απλά παίρνουμε τη λίστα των διευθύνσεων από τη βάση δεδομένων και χρησιμοποιούμε τη συνάρτηση mail() για να στείλουμε τα μηνύματα. Η εξατομίκευση των μηνυμάτων είναι επίσης πολύ εύκολη. Ας δούμε το ακόλουθο παράδειγμα :

    // Ανακτούμε τα $email και $password από τη βάση δεδομένων που

    // βασίζονται στο $username που παρέχεται από μια φόρμα

    mail($email, "Your Password",

    "Γεια σας!

    Μόλις συμπληρώσατε μια φόρμα στο Web site μας

    που φανερώνει ότι έχετε χάσει το password σας.

    Όπως το ζητήσατε, σας το στέλνουμε με email.

    username: $username

    password: $password

    Παρακαλώ καταγράψτε αυτά τα στοιχεία σ' ένα

    ασφαλές μέρος έτσι ώστε να τα έχετε διαθέσιμα

    αμέσως κατά την επόμενη επίσκεψή σας στο site μας!

    -Ο Webmaster.

    ");

    Αν εργαζόμαστε στο UNIX και δεν έχουμε διαθέσιμο ένα τοπικό σύστημα sendmail για να στείλουμε e-mail, η PHP είναι εφοδιασμένη με πλήρεις δυνατότητες δικτύωσης TCP/IP, οι οποίες της δίνουν τη δυνατότητα να συνδεθεί σ’ έναν SMTP για να στείλει μηνύματα όταν χρειασθεί. Παρόμοια, αν χρειασθεί να επισυνάψουμε αρχεία σε εξερχόμενα μηνύματα, η PHP μπορεί να το κάνει κι αυτό.

    Δυστυχώς, η ενσωματωμένη συνάρτηση mail() δεν υποστηρίζει κανένα απ’ αυτά τα χαρακτηριστικά και αν τα χρειασθούμε θα πρέπει να γράψουμε τη δική μας συνάρτηση emailing από την αρχή. Ο σχετικός κώδικας υπάρχει στο βιβλίο "Professional PHP Programming" της WROX Press, στο Κεφάλαιο 17. Ο πλήρης κώδικας υπάρχει και στο Web site της εταιρείας.

 

 

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

Users Browsing this Thread

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

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

  1. Συναφή θέματα
    By Dr.Overflow in forum Ανακοινώσεις Supas
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 18-05-2010, 20:36
  2. Βασικά καταναλωτικά θέματα
    By Μαρακι in forum Συμβουλές - TIPS
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 26-09-2009, 20:06
  3. ΠΡΟΤΑΣΕΙΣ..ΓΙΑ ΝΕΑ ΘΕΜΑΤΑ..
    By thiseas in forum Ερωτήσεις - Απαντήσεις - Σχόλια και Προτάσεις
    Απαντήσεις: 8
    Τελευταίο Μήνυμα: 22-09-2009, 16:30
  4. ΔΟΡΥΦΟΡΙΚΑ ΘΕΜΑΤΑ
    By Κατερίνα in forum ΧΡΗΣΙΜΑ LINK
    Απαντήσεις: 0
    Τελευταίο Μήνυμα: 09-10-2008, 16:11

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

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