Php λάβετε όλες τις παραμέτρους λήψης. Εξωτερικές μεταβλητές (μεταβλητές εκτός PHP). Μεταβίβαση μεταβλητών στην PHP χρησιμοποιώντας τη μέθοδο POST

Η πρώτη μέθοδος για να εκτελέσετε ένα αίτημα PHP POST είναι να χρησιμοποιήσετε το file_get_contents. Η δεύτερη μέθοδος θα χρησιμοποιήσει το fread σε συνδυασμό με μερικές άλλες λειτουργίες. Και οι δύο επιλογές χρησιμοποιούν τη συνάρτηση stream_context_create για να συμπληρώσουν τα απαιτούμενα πεδία κεφαλίδας αιτήματος.

Επεξήγηση κώδικα

Η μεταβλητή $sPD περιέχει τα δεδομένα που πρόκειται να μεταφερθούν. Πρέπει να είναι σε μορφή συμβολοσειράς αιτήματος HTTP, επομένως ορισμένοι ειδικοί χαρακτήρες πρέπει να κωδικοποιηθούν.

Τόσο στη συνάρτηση file_get_contents όσο και στη συνάρτηση fread έχουμε δύο νέες παραμέτρους. Το πρώτο είναι use_include_path . Εφόσον κάνουμε ένα αίτημα HTTP, θα είναι ψευδές και στα δύο παραδείγματα. Όταν οριστεί σε true για την ανάγνωση ενός τοπικού πόρου, η συνάρτηση θα αναζητήσει το αρχείο στο include_path .

Η δεύτερη παράμετρος είναι το περιβάλλον, το οποίο συμπληρώνεται με την επιστρεφόμενη τιμή του stream_context_create, που παίρνει την τιμή του πίνακα $aHTTP.

Χρήση file_get_contents για την υποβολή αιτημάτων POST

Για να στείλετε ένα αίτημα POST χρησιμοποιώντας file_get_contents στην PHP, πρέπει να χρησιμοποιήσετε το stream_context_create για να συμπληρώσετε με μη αυτόματο τρόπο τα πεδία κεφαλίδας και να καθορίσετε ποιο "περιτύλιγμα" θα χρησιμοποιήσετε - σε αυτήν την περίπτωση HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // Δεδομένα POST $aHTTP = array("http" => // Περιτύλιγμα που θα χρησιμοποιηθεί array("method" => "POST", // Μέθοδος αιτήματος // Οι κεφαλίδες αιτήματος ορίζονται κάτω από "header" => "Περιεχόμενο - τύπος: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $contents = file_get_contents($sURL, false, $context); echo $περιεχόμενα;

Χρήση του fread για την εκτέλεση αιτημάτων POST

Μπορείτε να χρησιμοποιήσετε τη συνάρτηση fread για να κάνετε αιτήματα POST. Το παρακάτω παράδειγμα χρησιμοποιεί το stream_context_create για να συνθέσει τις απαραίτητες κεφαλίδες αιτημάτων HTTP:

$sURL = "http://brugbart.com/Examples/http-post.php"; // POST URL $sPD = "name=Jacob&bench=150"; // Δεδομένα POST $aHTTP = array("http" => // Περιτύλιγμα που θα χρησιμοποιηθεί array("method" => "POST", // Μέθοδος αιτήματος // Οι κεφαλίδες αιτημάτων ορίζονται κάτω από "header" => "Περιεχόμενο - τύπος: application/x-www-form-urlencoded", "content" => $sPD)); $context = stream_context_create($aHTTP); $handle = fopen($sURL, "r", false, $context); $contents = ""; ενώ (!feof($handle)) ( $contents .= fread($handle, 8192); ) fclose($handle); echo $περιεχόμενα;

Δημιουργία αιτημάτων GET με την PHP

Τώρα θα επικεντρωθούμε στη χρήση των fread και file_get_contents για τη λήψη περιεχομένου από το διαδίκτυο μέσω HTTP και HTTPS. Για να χρησιμοποιήσετε τις μεθόδους που περιγράφονται σε αυτό το άρθρο, πρέπει να ενεργοποιήσετε την επιλογή fopen wrappers. Για να το κάνετε αυτό, πρέπει να ορίσετε την παράμετρο allow_url_fopen σε On στο αρχείο php.ini.

Η εκτέλεση αιτημάτων POST και GET στην PHP χρησιμοποιείται για τη σύνδεση σε ιστότοπους, την ανάκτηση περιεχομένου ιστοσελίδας ή τον έλεγχο για νέες εκδόσεις εφαρμογών. Θα καλύψουμε πώς να κάνετε απλά αιτήματα HTTP.

Χρήση του fread για λήψη ή λήψη αρχείων μέσω Διαδικτύου

Να θυμάστε ότι η ανάγνωση της ιστοσελίδας περιορίζεται στο προσβάσιμο τμήμα του πακέτου. Επομένως, πρέπει να χρησιμοποιήσετε τη συνάρτηση stream_get_contents (παρόμοια με το file_get_contents ) ή έναν βρόχο while για να διαβάσετε το περιεχόμενο σε μικρότερα κομμάτια μέχρι να φτάσετε στο τέλος του αρχείου:

Σε αυτήν την περίπτωση επεξεργασίας ενός αιτήματος PHP POST, το τελευταίο όρισμα της συνάρτησης fread είναι ίσο με το μέγεθος του τμήματος. Κατά κανόνα, δεν πρέπει να είναι μεγαλύτερο από 8192 (8*1024).

από get(9)

Ποιος είναι ένας τρόπος "λιγότερου κώδικα" για τη λήψη παραμέτρων από μια συμβολοσειρά ερωτήματος διεύθυνσης URL που έχει μορφοποιηθεί έτσι;

www.mysite.com/category/subcategory?myqueryhash

Η έξοδος θα πρέπει να είναι: myqueryhash

Ξέρω για αυτό:

www.mysite.com/category/subcategory?q=myquery

Απαντήσεις

Αυτός ο κωδικός και η σημείωση δεν είναι δικές μου. Ο Evan K επιλύει μια εργασία πολλών τιμών με το ίδιο όνομα με μια συνάρτηση που ορίζεται από το χρήστη.) από:

Τα παραπάνω παραδείγματα εξάγουν:

Γεια σου Χάνες!

Εάν θέλετε να λάβετε ολόκληρη τη συμβολοσειρά ερωτήματος:

$_SERVER["QUERY_STRING"]

Επίσης, εάν αναζητάτε το τρέχον όνομα αρχείου μαζί με τη συμβολοσειρά ερωτήματος, χρειάζεστε απλώς τα εξής

Όνομα βάσης($_SERVER["REQUEST_URI"])

Αυτό θα σας δώσει πληροφορίες όπως το παρακάτω παράδειγμα

file.php; arg1 = αξία & arg2 = αξία

Και αν χρειάζεστε επίσης την πλήρη διαδρομή προς το αρχείο ξεκινώντας από το root όπως /folder/folder2/file.php?arg1=val&arg2=val, τότε απλώς αφαιρέστε τη συνάρτηση basename() και απλώς χρησιμοποιήστε την επικάλυψη

$_SERVER["REQUEST_URI"]

Ευχαριστώ @K. Shahzad Αυτό βοηθάει όταν θέλετε να ξαναγράψετε τη συμβολοσειρά ερωτήματος χωρίς καμία προσθήκη επανεγγραφής. Ας πούμε ότι ξαναγράψατε το /test/; X = y στο index.php; Q = δοκιμή & x = y και θέλετε να λάβετε τη συμβολοσειρά ερωτήματος.

Συνάρτηση get_query_string())( $arr = explode("?",$_SERVER["REQUEST_URI"]); if (count($arr) == 2)( return ""; )else( return "?".end( $ arr)."
"; ) ) $query_string = get_query_string();

Ο τρόπος PHP για να γίνει αυτό είναι να χρησιμοποιήσετε τη συνάρτηση parse_url, η οποία αναλύει μια διεύθυνση URL και επιστρέφει τα στοιχεία της. Συμπεριλαμβανομένης της συμβολοσειράς ερωτήματος.

$url = "www.mysite.com/category/subcategory?myqueryhash"; echo parse_url($url, PHP_URL_QUERY); # έξοδος "myqueryhash"

Εδώ είναι η λειτουργία μου για την ανάκτηση τμημάτων της συμβολοσειράς ερωτήματος REFERRER.

Εάν η καλούσα σελίδα είχε ήδη μια συμβολοσειρά ερωτήματος από μόνη της , και πρέπει να επιστρέψετε σε αυτήν τη σελίδα και θέλετε να στείλετε μερικά, όχι όλα, από αυτά τα $_GET vars (π.χ. τον αριθμό σελίδας).

Παράδειγμα: η συμβολοσειρά ερωτήματος Referrer ήταν?foo=1&bar=2&baz=3 καλώντας refererQueryString("foo" , "baz") επιστρέφει foo=1&baz=3" :

Συνάρτηση refererQueryString(/* var args */) ( //Επιστρέφει κενή συμβολοσειρά εάν δεν υπάρχει παραπομπή ή δεν υπάρχουν διαθέσιμα $_GET vars στον παραπομπή: if (!isset($_SERVER["HTTP_REFERER"]) || κενό($_SERVER["HTTP_REFERER " "]) || κενό(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_QUERY))) (επιστροφή ""; ) //Λήψη ερωτήματος διεύθυνσης URL αναφοράς (κάτι σαν "threadID=7&page=8") $refererQueryString = parse_url ( urldcode($_SERVER["HTTP_REFERER"]), PHP_URL_QUERY); //Ποιες τιμές θέλετε να εξαγάγετε; (Μεταβιβάσατε τα ονόματά τους ως μεταβλητές.) $args = func_get_args(); //Λήψη συμβολοσειρών "" της διεύθυνσης URL του referer" s: $pairs = explode("&",$refererQueryString); //String που θα επιστρέψετε αργότερα: $return = ""; //Ανάλυση ανακτημένων συμβολοσειρών και αναζητήστε αυτές που σας ενδιαφέρουν: foreach ($pairs ως $pair ) ( $keyVal = explode("=",$pair); $key = &$keyVal; $val = urlencode($keyVal); //Εάν μεταβιβάσατε το όνομα ως arg, επισυνάψτε το τρέχον ζεύγος στη συμβολοσειρά επιστροφής : if( in_array($key,$args)) ( $return .= "&". $key . "=" .$val; ) ) //Εδώ είναι τα επιστρεφόμενα ζεύγη "key=value" κολλημένα μεταξύ τους με "& ": return ltrim($return,"&"); ) //Εάν το σημείο αναφοράς σας ήταν "page.php?foo=1&bar=2&baz=3" //και θέλετε να επιστρέψετε την κεφαλίδα() στο "page.php?foo=1&baz=3" //(χωρίς "bar", μόνο foo και baz), στη συνέχεια εφαρμόστε: header("Location: page.php?".refererQueryString("foo","baz"));

Η Υποστήριξη της Microsoft αναφέρει: "Το μέγιστο μήκος διεύθυνσης URL είναι 2083 χαρακτήρες στον Internet Explorer."

Ο IE έχει προβλήματα με τις διευθύνσεις URL εδώ και περισσότερο. Ο Firefox φαίνεται να λειτουργεί καλά με >4k χαρακτήρες.

Ο προγραμματισμός Ιστού ως επί το πλείστον είναι απλώς η επεξεργασία διαφόρων δεδομένων που εισάγει ο χρήστης - δηλαδή η επεξεργασία φορμών HTML.
Πιθανώς δεν υπάρχει άλλη γλώσσα όπως η PHP που θα έκανε τόσο πιο εύκολη την εργασία της επεξεργασίας και της ανάλυσης, π.χ. μεταβλητές που προέρχονται από (από το πρόγραμμα περιήγησης του χρήστη). Το γεγονός είναι ότι όλες οι απαραίτητες δυνατότητες είναι ενσωματωμένες στη γλώσσα PHP, επομένως δεν χρειάζεται καν να σκέφτεστε τις δυνατότητες του πρωτοκόλλου HTTP και να σκέφτεστε πώς να στέλνετε και να λαμβάνετε φόρμες POST ή ακόμα και να κάνετε λήψη αρχείων. Οι προγραμματιστές της PHP έχουν προβλέπεται για τα πάντα.

Εδώ δεν θα σταθούμε λεπτομερώς στον μηχανισμό του πρωτοκόλλου HTTP, το οποίο είναι υπεύθυνο για την παράδοση δεδομένων από το πρόγραμμα περιήγησης στον διακομιστή και πίσω· μια ειδική ενότητα είναι αφιερωμένη σε αυτό το PHP και το HTTP. Οι αρχές της εργασίας με φόρμες HTML συζητούνται επίσης σε βάθος.

Τώρα θα εξετάσουμε αυτούς τους μηχανισμούς μόνο από εφαρμοσμένη σκοπιά, χωρίς να εμβαθύνουμε στη θεωρία.

Για να λαμβάνουμε δεδομένα από τους χρήστες, χρειαζόμαστε διαδραστική αλληλεπίδραση μαζί τους.

Τώρα ας προσπαθήσουμε να γράψουμε ένα σενάριο που να παίρνει ένα όνομα χρήστη ως παραμέτρους και εξόδους:

"Γειά σου, !".

Αρχικά, ας δούμε τον απλούστερο τρόπο για να μεταβιβάσετε ένα όνομα σε ένα σενάριο - πληκτρολογώντας το απευθείας στη διεύθυνση URL μετά το ? - για παράδειγμα, στη μορφή name=name . Εδώ είναι ένα παράδειγμα:

http://localhost/script.php?name=name

Το σενάριό μας πρέπει να αναγνωρίζει την παράμετρο ονόματος. Δηλαδή, για να το θέσω απλά, το σενάριο (script) πρέπει να δέχεται την παράμετρο ονόματος με τη μορφή της μεταβλητής ονόματος και στη συνέχεια να εμφανίζει τη συμβολοσειρά "Hello, !" στο πρόγραμμα περιήγησης του χρήστη. Μπορείτε να το κάνετε με αυτόν τον τρόπο:

Γράφουμε ένα σενάριο που λαμβάνει την παράμετρο ονόματος και εμφανίζει το αποτέλεσμα στο πρόγραμμα περιήγησης του χρήστη και, στη συνέχεια, το αποθηκεύει κάτω από το όνομα script.php:

Στο παράδειγμά μας, χρησιμοποιήσαμε την προκαθορισμένη μεταβλητή $_GET["name"] για να "λάβουμε" την παράμετρο ονόματος. Τώρα, περνώντας την παράμετρο name=Sasha μέσω ενός αιτήματος GET, θα έχουμε το ακόλουθο αποτέλεσμα:

Γεια σου Σάσα!

Τώρα ας προσπαθήσουμε να περάσουμε την παράμετρο ονόματος όχι από τη συμβολοσειρά ερωτήματος του προγράμματος περιήγησης, αλλά μέσω μιας φόρμας HTML. Δημιουργούμε ένα έγγραφο HTML με το ακόλουθο περιεχόμενο:


Ονομα:

Τώρα ας αποθηκεύσουμε αυτό το έγγραφο HTML στον δοκιμαστικό διακομιστή μας (localhost) με το όνομα send.html στον ίδιο κατάλογο όπου έχουμε ήδη αποθηκεύσει το σενάριο script.php.

Τώρα ξεκινάμε το έγγραφο HTML στο πρόγραμμα περιήγησης:

http://localhost/send.html

Εισαγάγετε το όνομα στο πεδίο και πατήστε το κουμπί "GO!". Η φόρμα θα περάσει την παράμετρο ονόματος στο script.php μας μέσω ενός αιτήματος GET. Εάν τα κάνατε όλα σωστά και ο διακομιστής ιστού σας λειτουργεί κανονικά, θα δείτε το όνομα που πληκτρολογήσατε στο πεδίο της φόρμας! Στη γραμμή διευθύνσεων του προγράμματος περιήγησης θα δείτε τη διαδρομή και την παράμετρο ονόματος που περάσατε.

Τώρα πρέπει να καταλάβουμε πώς μπορούμε να περάσουμε πολλές παραμέτρους, τουλάχιστον δύο για αρχή.

Άρα, χρειαζόμαστε το σενάριο για να βγει τα εξής:

"Γεια σου! Είσαι γέρος!"

Δηλαδή, πρέπει να περάσουμε 2 παραμέτρους στο σενάριο: όνομα και ηλικία.

Τώρα θα γράψουμε ένα script.php που παίρνει δύο παραμέτρους: όνομα και ηλικία, καθώς και ένα έγγραφο HTML με μια φόρμα που θα μεταβιβάσει αυτές τις δύο παραμέτρους στο νέο μας σενάριο:

Και εδώ είναι το έγγραφο HTML send.html, με το οποίο θα περάσουμε τις παραμέτρους ονόματος και ηλικίας στο σενάριό μας:



Εισάγετε το όνομά σας:

Εισαγάγετε την ηλικία:



Τώρα το σενάριό μας παίρνει δύο παραμέτρους όνομα και ηλικία και εμφανίζει το αποτέλεσμα στο πρόγραμμα περιήγησης με τη μορφή: "Γεια, είσαι μεγάλος!"

Δώστε προσοχή στη γραμμή διευθύνσεων του προγράμματος περιήγησης αφού περάσετε τις παραμέτρους στο σενάριο, θα μοιάζει κάπως έτσι (χωρίς κυριλλική κωδικοποίηση URL):

http://localhost/script.php?name=Sasha&age=23

Ανάλογα με τις ρυθμίσεις του διερμηνέα σας, υπάρχουν διάφοροι τρόποι πρόσβασης σε δεδομένα από τις φόρμες HTML. Να μερικά παραδείγματα:

//Στη φόρμα, χρησιμοποιώντας τη μέθοδο get, στέλνουμε την τιμή 1 μέσω ενός κρυφού πεδίου Αποστολή αιτήματος

αρχείο get.php

Ανάρτηση αιτήματος Php

Το αίτημα ανάρτησης Php αποστέλλεται επίσης μέσω μιας φόρμας, μόνο το χαρακτηριστικό στην ετικέτα φόρμας θα είναι μέθοδος = "post" . Και θα λάβουμε τα δεδομένα στο καθορισμένο αρχείο από τον πίνακα ανάρτησης $_POST["αναζήτηση"] και θα δώσουμε αμέσως ένα παράδειγμα.

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

Ερώτημα αναζήτησης

Συμπληρώστε το πεδίο αίτησης

Εισαγάγετε ερώτημα:

Στείλε αίτημα

αρχείο get.php

Πέρασμα συστοιχίας AJAX

Ας ολοκληρώσουμε την ίδια εργασία χρησιμοποιώντας ajax. Στην πραγματικότητα, το ajax είναι μια τεχνολογία που σχετίζεται με το javascript, αλλά ως μέρος της σημείωσης για τη μεταφορά δεδομένων στον διακομιστή, θα αγγίξουμε επίσης αυτήν την τεχνολογία. Φυσικά, το ajax είναι ένα θέμα για ξεχωριστό άρθρο. Κατά τη διαδικασία αιτήματος, θα εμφανίσουμε επίσης ένα gif της ένδειξης φόρτωσης. Έχουμε επίσης δύο αρχεία index.php και get.php. Αρχείο Index.php. Μην ξεχάσετε να συνδέσετε το jquery. Λάβετε υπόψη ότι για να αποκρύψετε το gif κατά την πρώτη φόρτωση της σελίδας, αντιστοιχίστε την εμφάνιση στυλ: κανένα στο μπλοκ πλαισίου

$(document).ready(function())( //επισυνάπτουμε ένα συμβάν στο κουμπί υποβολής $(".submit").click(function())( $.ajax(( //πώς θα μεταφέρουμε τον τύπο δεδομένων : "GET", / /όπου περνάμε url: "get.php", //τι δεδομένα περνάμε δεδομένα: (σημαία: 1), //συμβάν πριν από την αποστολή του ajax πριν την αποστολή: function())( //εμφάνιση gif $(".box").show(); ), //συμβάν μετά τη λήψη μιας απάντησης, //λήψη πίνακα σε επιτυχία δεδομένων: function(data)( //απόκρυψη του gif $(".box").απόκρυψη (); var html = ""; //f- i JSON.parse μεταφράζει τα δεδομένα json σε ένα αντικείμενο var dt=JSON.parse(data); for (var i = 0; i

Το αρχείο get.php. Λαμβάνουμε δεδομένα από τον πίνακα get στο αρχείο και περνάμε τον πίνακα από την php στη javascript. Για να περάσετε έναν πίνακα από php σε js, πρέπει να μετατραπεί σε μορφή json. Για να το κάνουμε αυτό, χρησιμοποιούμε τη συνάρτηση php json_encode. Μετά την επανακωδικοποίηση, το json αποστέλλεται μέσω php, καλώντας συγκεκριμένα το echo.

Έχω μια δομή URL με μια συμβολοσειρά ερωτήματος και μια παράμετρο που ονομάζεται θέση.

Http://computerhelpwanted.com/jobs/?occupation=administrator&position=network+administrator

Έχω επίσης ένα αναπτυσσόμενο μενού επιλογής φόρμας με τη θέση επιλογής ονόματος φόρμας.

Επιλέξτε Επάγγελμα Διαχειριστής Επιλέξτε Θέση διαχειριστή δικτύου

Όταν ο χρήστης κάνει μια επιλογή, στέλνει τις τιμές των παραμέτρων στο χαρακτηριστικό action με το select name="position" ως παράμετρο που θα χρησιμοποιηθεί στη συμβολοσειρά ερωτήματος.

Η ερώτησή μου είναι πώς μπορώ να αποκτήσω πρόσβαση στις τιμές επιλογής φόρμας ξεχωριστά από τις τιμές συμβολοσειράς ερωτήματος;

Χρησιμοποιώ τη μέθοδο _GET για να καλέσω μια τιμή από μια παράμετρο συμβολοσειράς ερωτήματος.

$position = isset($_GET["position"]) ? ($_GET["position"]) : "";

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

Πώς μπορώ να αποκτήσω πρόσβαση στην τιμή επιλογής της φόρμας κατά τη σύγκριση στην PHP μου;

Εκσυγχρονίζω

Έχω ένα πρόβλημα με την κανονική διεύθυνση URL που καθορίζεται στην κεφαλίδα.

Έτσι πρέπει να είναι

η μόνη διαφορά είναι το - και + στη συμβολοσειρά ερωτήματος.

Δεν έχουν όλες οι συμβολοσειρές ερωτήματός μου +. Μερικοί έχουν -. Αλλά εμφανίζω περιεχόμενο και στις δύο διευθύνσεις URL, ανεξάρτητα από το αν έχει - ή +. Είτε έτσι είτε αλλιώς, και οι δύο διευθύνσεις URL λαμβάνουν το ίδιο περιεχόμενο σελίδας.

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

Χρησιμοποιώντας το _Get('value') ανακτά την τιμή από τη συμβολοσειρά ερωτήματος αντί για το στοιχείο φόρμας. Το γνωρίζω αυτό επειδή η τιμή του στοιχείου φόρμας έχει ένα κενό μεταξύ του διαχειριστή δικτύου το οποίο λαμβάνει κωδικοποίηση urlen όταν η φόρμα υποβάλλεται ως δίκτυο+διαχειριστής. Έτσι, αν μπορώ να συγκρίνω με την τιμή του στοιχείου φόρμας, μπορώ να ορίσω τη σωστή κανονική.