Forum und email

Μεταβλητές έξω από την PHP

Φόρμες της HTML (GET και POST)

Όταν μια φόρμα εισάγεται σε ένα PHP script, η πληροφορία από τη φόρμα γίνεται αυτόματα διαθέσιμη στο script. Υπάρχουν πολλοί τρόποι για να προσπελάσετε την πληροφορία, για παράδειγμα:

Example#1 Μια απλή φόρμα σε HTML

<form action="foo.php" method="POST">
    Name:  <input type="text" name="username"><br>
    Email: <input type="text" name="email"><br>
    <input type="submit" name="submit" value="Submit me!">
</form>

Ανάλογα με το ιδιαίτερο setup και τις προσωπικές προτιμήσεις, υπάρχουν πολλοί τρόποι για να προσπελάσετε τα δεδομένα από τις HTML φόρμες σας. Μερικά παραδείγματα είναι:

Example#2 Προσπελαύνοντας δεδομένα από μια απλή POST HTML φόρμα

<?php 
// Available since PHP 4.1.0

   print $_POST['username'];
   print $_REQUEST['username'];

   import_request_variables('p', 'p_');
   print $p_username;

// Available since PHP 3.  As of PHP 5.0.0, these long predefined
// variables can be disabled with the register_long_arrays directive.

   print $HTTP_POST_VARS['username'];

// Available if the PHP directive register_globals = on.  As of 
// PHP 4.2.0 the default value of register_globals = off.
// Using/relying on this method is not preferred.

   print $username;
?>

Η χρήση μιας GET φόρμας είναι παρόμοια εκτός από το ότι πρέπει να χρησιμοποιήσετε την κατάλληλη προκαθορισμένη μεταβλητή GET. Η GET επίσης χρησιμοποιείται στο QUERY_STRING (η πληροφορία μετά το '?' σε ένα URL). Συνεπώς, για παράδειγμα η https://www.example.com/test.php?id=3 περιέχει GET δεδομένα τα οποία είναι προσπελάσιμα με την $_GET['id']. Δείτε επίσης την $_REQUEST και την import_request_variables().

Note: Οι superglobal arrays, όπως ο $_POST και ο $_GET, έγιναν διαθέσιμοι στην PHP 4.1.0

Όπως δείξαμε, πριν την PHP 4.2.0 η προκαθορισμένη τιμή για τη register_globals ήταν on. Και στην PHP 3 ήταν πάντα on. Η κοινότητα της PHP ενθαρρύνει όλους να μην βασίζονται σ'αυτή την ντιρεκτίβα καθώς προτιμάται να υποθέτουμε ότι είναι off και να γράφουμε κώδικα σύμφωνα με αυτή την υπόθεση.

Note: Η magic_quotes_gpc configuration ντιρεκτίβα επηρεάζει τις τιμές της Get, της Post και της Cookie. Αν γίνει on, η τιμή (It's "PHP!") θα γίνει αυτόματα (It\'s \"PHP!\"). Χρειάζεται να γίνει escape για εισαγωγή εισαγωγικών. Δείτε επίσης τις addslashes(), stripslashes() και magic_quotes_sybase.

Η PHP επίσης καταλαβαίνει arrays σχετικά με το περιεχόμενο από τις μεταβλητές φορμών (δείτε το σχετικό faq). Ίσως, για παράδειγμα ομαδοποιήσετε σχετικές μεταβλητές μαζί, ή χρησιμοποιήσετε αυτό το χαρακτηριστικό για να πάρετε τιμές από ένα multiple select input. Για παράδειγμα, ας στείλουμε μια φόρμα στον εαυτό της και μετά την υποβολή εμφανιστούν τα δεδομένα:

Example#3 Περισσότερες σύνθετες μεταβλητές φορμών

<?php
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
    print 
'<pre>';
    
print_r($_POST);
    print 
'<a href="'$_SERVER['PHP_SELF'] .'">Please try again</a>';

    print 
'</pre>';
} else {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
    Name:  <input type="text" name="personal[name]"><br>
    Email: <input type="text" name="personal[email]"><br>
    Beer: <br>
    <select multiple name="beer[]">
        <option value="warthog">Warthog</option>
        <option value="guinness">Guinness</option>
        <option value="stuttgarter">Stuttgarter Schwabenbrδu</option>
    </select><br>
    <input type="hidden" name="action" value="submitted">
    <input type="submit" name="submit" value="submit me!">
</form>
<?php
}
?>

Στην PHP 3, η χρήση της μεταβλητής array της φόρμας είναι περιορισμένη σε μονοδιάστατους arrays. Στην PHP 4, δεν εφαρμόζονται τέτοιοι περιορισμοί.

IMAGE SUBMIT ονόματα μεταβλητής

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

<input type="image" src="image.gif" name="sub">

Όταν ο χρήστης κάνει κλίκ κάπου στην εικόνα, η ακόλουθη φόρμα θα μεταφερθεί στον server με δυο επιπρόσθετες μεταβλητές, την sub_x και την sub_y. Αυτές περιέχουν τις συντεταγμένες του σημείου που έκανε κλικ ο χρήστης μέσα στην εικόνα. Ο έμπειρος χρήστης ίσως παρατηρήσει ότι τα πραγματικά ονόματα μεταβλητών που στάλθηκαν από τον browser περιέχουν μια period παρά ένα underscore, αλλά η PHP μετατρέπει αυτή την period σε ένα underscore αυτόματα.

HTTP Cookies

Η PHP με διαφάνεια υποστηρίζει τα HTTP cookies όπως έχουν οριστεί στο » Netscape's Spec. Τα cookies είναι ένας μηχανισμός αποθήκευσης δεδομένων σε έναν απομακρυσμένο browser για τον εντοπισμό και αναγνώριση χρηστών που ξαναεπισκέπτονται στο site. Μπορείτε να ορίσετε cookies χρησιμοποιώντας τη συνάρτηση setcookie() . Τα cookies είναι μέρος του HTTP header, συνεπώς η συνάρτηση SetCookie πρέπει να καλείται πριν το αποτέλεσμα σταλεί στον browser. Αυτό έχει τους ίδιους περιορισμούς όπως και στη συνάρτηση header(). Τα δεδομένα των cookies είναι εν συνεχεία διαθέσιμα στους κατάλληλους cookie data arrays, όπως ο $_COOKIE, ο $HTTP_COOKIE_VARS καθωε επίσης και ο $_REQUEST. Δείτε την setcookie() στη σελίδα του manual για περισσότερες πληροφορίες και παραδείγματα.

Αν επιθυμείτε να αναθέσετε πολλαπλές τιμές σε μια μόνο μεταβλητή cookie, μπορείτε να κάνετε την ανάθεση αυτή όπως και σε έναν array. Για παράδειγμα:

<?php
  setcookie
("MyCookie[foo]""Testing 1"time()+3600);
  
setcookie("MyCookie[bar]""Testing 2"time()+3600);
?>

Αυτό θα δημιουργήσει δυο διαφορετικά cookies παρόλου που το MyCookie θα είναι τώρα ένα απλό array στο script σας. Αν θέλετε να ορίσετε ακόμη ένα cookie με πολλαπλές τιμές, χρησιμοποιείστε την serialize() ή την explode() πρώτα στην τιμή.

Σημειώστε ότι ένα cookie θα αντικαταστήσει ένα προηγούμενο cookie με το ίδιο όνομα στον browser σας εκτός και αν το path ή το domain είναι διαφορετικό. Συνεπώς, για μια εφαρμογή ενός shopping cart ίσως χρειαστεί να κρατήσετε έναν μετρητή και να τον περάσετε. π.χ.

Example#4 Ένα παράδειγμα με την setcookie()

<?php
if (isset($_COOKIE['count'])) {
    
$count $_COOKIE['count'] + 1;
} else {
    
$count 1;
}
setcookie("count"$counttime()+3600);
setcookie("Cart[$count]"$itemtime()+3600);
?>

Τελείες σε εσωτερικά ονόματα μεταβλητών

Τυπικά, η PHP δεν αλλάζει τα ονόματα των μεταβλητών όταν αυτά περνιούνται σε ένα script. Πάντως, πρέπει να σημειωθεί ότι η τελεία dot (period, full stop) δεν είναι ένας έγκυρος χαρακτήρας στην PHP για ονόματα μεταβλητών. Γι'αυτό το λόγο, δείτε αυτό:

<?php
$varname
.ext;  /* invalid variable name */
?>
Τώρα, όταν ο parser βλέπει μια μεταβλητή με το όνομα $varname, ακολουθούμενη από τον τελεστή συννένωσης string, ακολουθούμενο από ένα barestring (π.χ. ένα string χωρίς εισαγωγικά το οποίο δεν ταιριάζει με κανένα γνωστό κλειδί ή κάποια δεσμευμένη λέξη) 'ext'. Προφανώς, αυτό δεν έχει το αναμενόμενο αποτέλεσμα.

Γι'αυτό το λόγο, είναι σημαντικό να σημειώσουμε ότι η PHP θα αντικαταστήσει αυτόματα όλες τις τελείες σε εσωτερικά ονόματα μεταβλητών, με underscores.

Ορίζοντας τύπους μεταβλητών

Επειδή η PHP καθορίζει τους τύπους των μεταβλητών και τους μετατρέπει (γενικά) όπως χρειάζεται, δεν είναι πάντα προφανές τι τύπου είναι μια δεδομένη μεταβλητή οποιαδήποτε στιγμή. Η PHP περιέχει διάφορες συναρτήσεις οι οποίες βρίσκουν τι τύπο έχει κάθε μεταβλητή, όπως οι: gettype(), is_array(), is_float(), is_int(), is_object(), και η is_string(). Δείτε επίσης το κεφάλαιο σχετικά με τους Τύπους.