Μια απλή υπηρεσία RESTful σε εγγενή PHP. $_SERVER - Πληροφορίες σχετικά με τον διακομιστή και το περιβάλλον εκτέλεσης Τι πρέπει να μπορεί να κάνει η υπηρεσία RESTful

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

Η αναζήτηση μοτίβων σάς επιτρέπει όχι μόνο να βρείτε συγκεκριμένα τμήματα κειμένου, αλλά και να τα αντικαταστήσετε με άλλα τμήματα. Ένα τυπικό παράδειγμα αντιστοίχισης προτύπων είναι οι εντολές εύρεσης/αντικατάστασης σε προγράμματα επεξεργασίας κειμένου—για παράδειγμα, MS Word, Emacs και το αγαπημένο μου πρόγραμμα επεξεργασίας, vi. Όλοι οι χρήστες του UNIX είναι εξοικειωμένοι με προγράμματα όπως τα sed, awk και grep. Ο πλούτος των δυνατοτήτων αυτών των προγραμμάτων οφείλεται σε μεγάλο βαθμό στις δυνατότητες αναζήτησης προτύπων τους. Οι μηχανισμοί αναζήτησης προτύπων επιλύουν τέσσερα κύρια προβλήματα:

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

Η έλευση του Ιστού έχει δημιουργήσει την ανάγκη για ταχύτερα και πιο αποτελεσματικά εργαλεία αναζήτησης δεδομένων που επιτρέπουν στους χρήστες σε όλο τον κόσμο να βρίσκουν τις πληροφορίες που χρειάζονται σε δισεκατομμύρια ιστοσελίδες. Οι μηχανές αναζήτησης, οι διαδικτυακές χρηματοοικονομικές υπηρεσίες και οι ιστότοποι ηλεκτρονικού εμπορίου θα ήταν όλα εντελώς άχρηστα χωρίς τα μέσα ανάλυσης του τεράστιου όγκου δεδομένων σε αυτούς τους τομείς. Πράγματι, τα εργαλεία επεξεργασίας πληροφοριών συμβολοσειρών αποτελούν ζωτικό συστατικό σχεδόν οποιουδήποτε τομέα που συνδέεται με τον ένα ή τον άλλο τρόπο με τις σύγχρονες τεχνολογίες πληροφοριών. Αυτό το κεφάλαιο εστιάζει στις εγκαταστάσεις επεξεργασίας συμβολοσειρών στην PHP. Θα εξετάσουμε ορισμένες τυπικές συναρτήσεις συμβολοσειρών (υπάρχουν περισσότερες από 60 από αυτές στη γλώσσα!), και οι ορισμοί και τα παραδείγματα που παρέχονται θα σας δώσουν τις πληροφορίες που χρειάζεστε για τη δημιουργία εφαρμογών Ιστού. Πριν όμως μπούμε στις ιδιαιτερότητες της PHP, θέλω να σας παρουσιάσω τον βασικό μηχανισμό που καθιστά δυνατή την αναζήτηση προτύπων. Μιλάμε για κανονικές εκφράσεις.

Κανονικές εκφράσεις

Οι κανονικές εκφράσεις είναι η βάση όλων των σύγχρονων τεχνολογιών αντιστοίχισης προτύπων. Μια τυπική έκφραση είναι μια ακολουθία απλών και υπηρεσιακών χαρακτήρων που περιγράφουν το κείμενο που αναζητήθηκε. Μερικές φορές οι κανονικές εκφράσεις είναι απλές και σαφείς (για παράδειγμα, η λέξη σκύλος), αλλά συχνά περιέχουν ειδικούς χαρακτήρες που έχουν ειδική σημασία στη σύνταξη κανονικών εκφράσεων - για παράδειγμα,<(?)>.*<\/.?>.

Υπάρχουν δύο οικογένειες συναρτήσεων στην PHP, καθεμία από τις οποίες είναι διαφορετικός τύπος τυπικής έκφρασης: στυλ POSIX ή στυλ Perl. Κάθε τύπος κανονικής έκφρασης έχει τη δική του σύνταξη και συζητείται στο κατάλληλο μέρος του κεφαλαίου. Πολλά εγχειρίδια έχουν γραφτεί για αυτό το θέμα και μπορούν να βρεθούν τόσο στον Ιστό όσο και στα βιβλιοπωλεία. Ως εκ τούτου, θα παρέχω μόνο βασικές πληροφορίες για κάθε τύπο, και μπορείτε να βρείτε περαιτέρω πληροφορίες μόνοι σας εάν το επιθυμείτε. Εάν δεν είστε ήδη εξοικειωμένοι με τον τρόπο λειτουργίας των κανονικών εκφράσεων, φροντίστε να διαβάσετε το σύντομο εισαγωγικό σεμινάριο που καλύπτει το υπόλοιπο αυτής της ενότητας. Και αν είστε καλά γνώστες σε αυτόν τον τομέα, μη διστάσετε να προχωρήσετε στην επόμενη ενότητα.

Σύνταξη κανονικής έκφρασης (POSIX)

Η δομή των κανονικών εκφράσεων POSIX θυμίζει κάπως τη δομή των τυπικών μαθηματικών παραστάσεων - διαφορετικά στοιχεία (τελεστές) συνδυάζονται μεταξύ τους για να σχηματίσουν πιο σύνθετες εκφράσεις. Ωστόσο, η αίσθηση του συνδυασμού στοιχείων είναι που κάνει τις κανονικές εκφράσεις ένα τόσο ισχυρό και εκφραστικό εργαλείο. Οι δυνατότητες δεν περιορίζονται στην αναζήτηση κυριολεκτικού κειμένου (όπως μια συγκεκριμένη λέξη ή αριθμό). μπορείτε να αναζητήσετε συμβολοσειρές με διαφορετική σημασιολογία αλλά παρόμοια σύνταξη -- για παράδειγμα, όλες τις ετικέτες HTML σε ένα αρχείο.

Η απλούστερη κανονική έκφραση ταιριάζει με έναν μόνο κυριολεκτικό χαρακτήρα -- για παράδειγμα, η έκφραση g ταιριάζει με συμβολοσειρές όπως το g , παζαρεύω και τσάντα. Μια έκφραση που προκύπτει από τη σύνδεση πολλών κυριολεκτικών χαρακτήρων ταιριάζει σύμφωνα με τους ίδιους κανόνες -- για παράδειγμα, η ακολουθία gan ταιριάζει σε οποιαδήποτε συμβολοσειρά που περιέχει αυτούς τους χαρακτήρες (για παράδειγμα, συμμορία, οργάνωση ή Reagan).

Χειριστής | (κάθετη γραμμή) ελέγχει εάν ταιριάζει μία από τις πολλές εναλλακτικές. Για παράδειγμα, η κανονική έκφραση php | Το zend ελέγχει τη συμβολοσειρά για php ή zend.

Αγκύλες

Οι αγκύλες () έχουν ειδική σημασία στο πλαίσιο των κανονικών εκφράσεων -- σημαίνουν "οποιονδήποτε χαρακτήρα που παρατίθεται μέσα στις αγκύλες." Σε αντίθεση με μια κανονική έκφραση php, η οποία ταιριάζει σε όλες τις γραμμές που περιέχουν κυριολεκτικό κείμενο php, η έκφραση ταιριάζει σε οποιαδήποτε γραμμή που περιέχει τους χαρακτήρες p ή h. Οι αγκύλες παίζουν σημαντικό ρόλο όταν εργάζεστε με κανονικές εκφράσεις, καθώς η διαδικασία αναζήτησης συχνά περιλαμβάνει την εργασία εύρεσης χαρακτήρων από ένα δεδομένο διάστημα. Παρακάτω είναι μερικά διαστήματα που χρησιμοποιούνται συνήθως:

  • -- ταιριάζει με οποιοδήποτε δεκαδικό ψηφίο από το 0 έως το 9.
  • -- ταιριάζει με οποιονδήποτε πεζό χαρακτήρα από το a έως το z.
  • -- ταιριάζει με οποιονδήποτε κεφαλαίο χαρακτήρα από το Α έως το Ω.
  • -- ταιριάζει με οποιονδήποτε πεζό ή κεφαλαίο χαρακτήρα από το a έως το z.

Φυσικά, τα διαστήματα που αναφέρονται παραπάνω αποδεικνύουν απλώς τη γενική αρχή. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το διάστημα για να αναπαραστήσετε οποιοδήποτε δεκαδικό ψηφίο από το 0 έως το 3 ή το διάστημα για να αναπαραστήσετε οποιοδήποτε πεζό χαρακτήρα από το b έως το v. Με λίγα λόγια, τα διαστήματα καθορίζονται εντελώς αυθαίρετα.

Ποσοτικοί δείκτες

Υπάρχει μια ειδική κατηγορία χαρακτήρων υπηρεσιών που υποδεικνύουν τον αριθμό των επαναλήψεων ενός μεμονωμένου χαρακτήρα ή κατασκευής που περικλείεται σε αγκύλες. Αυτοί οι ειδικοί χαρακτήρες (+, * και (...)) καλούνται ποσοτικοποιητές.Η αρχή της λειτουργίας τους εξηγείται ευκολότερα με παραδείγματα:

  • p+ σημαίνει έναν ή περισσότερους χαρακτήρες p στη σειρά.
  • p* σημαίνει μηδέν ή περισσότερους p χαρακτήρες στη σειρά.
  • Ε; σημαίνει μηδέν ή έναν χαρακτήρα p.
  • p(2) σημαίνει δύο p χαρακτήρες στη σειρά.
  • Το p(2,3) σημαίνει δύο έως τρεις χαρακτήρες p στη σειρά.
  • Το p(2,) σημαίνει δύο ή περισσότερους χαρακτήρες p στη σειρά.

Άλλοι χαρακτήρες υπηρεσίας

Οι χαρακτήρες υπηρεσίας $ και ^ δεν ταιριάζουν με σύμβολα, αλλά συγκεκριμένες θέσεις στη συμβολοσειρά. Για παράδειγμα, η έκφραση p$ σημαίνει μια συμβολοσειρά που τελειώνει με τον χαρακτήρα p και η έκφραση ^p σημαίνει μια συμβολοσειρά που αρχίζει με τον χαρακτήρα p.

  • Η κατασκευή [^a-zA-Z] ταιριάζει με οποιονδήποτε χαρακτήρα Δεν περιλαμβάνονταιστα υποδεικνυόμενα διαστήματα (a-z και A-Z).
  • Σύμβολο υπηρεσίας. (dot) σημαίνει "οποιοσδήποτε χαρακτήρας". Για παράδειγμα, η έκφραση p.p ταιριάζει με τον χαρακτήρα p, ακολουθούμενο από έναν αυθαίρετο χαρακτήρα, ακολουθούμενο από τον χαρακτήρα p και πάλι.

Ο συνδυασμός συμβόλων υπηρεσίας οδηγεί σε πιο σύνθετες εκφράσεις. Ας δούμε μερικά παραδείγματα:

  • ^.(2)$ -- οποιαδήποτε συμβολοσειρά που περιέχει λείοςδύο χαρακτήρες?
  • (.*)-- μια αυθαίρετη ακολουθία χαρακτήρων μεταξύ<Ь>Και(πιθανώς ετικέτες HTML για εμφάνιση έντονου κειμένου).
  • p(hp)* -- ο χαρακτήρας p ακολουθούμενος από μηδέν ή περισσότερες παρουσίες της ακολουθίας hp (για παράδειγμα, phphphp).

Μερικές φορές χρειάζεται να βρείτε ειδικούς χαρακτήρες σε συμβολοσειρές αντί να τους χρησιμοποιείτε στο ειδικό πλαίσιο που περιγράφεται. Για να γίνει αυτό, οι χαρακτήρες υπηρεσίας διαφεύγουν με ανάστροφη κάθετο (\). Για παράδειγμα, για να αναζητήσετε ένα χρηματικό ποσό σε δολάρια, μπορείτε να χρησιμοποιήσετε την έκφραση \$+, δηλαδή "ένα σύμβολο δολαρίου ακολουθούμενο από ένα ή περισσότερα δεκαδικά ψηφία". Σημειώστε την ανάστροφη κάθετο πριν από το $. Οι πιθανές αντιστοιχίσεις για αυτήν την τυπική έκφραση είναι 42 $, 560 $ και 3 $.

Τυπικές εκφράσεις διαστήματος (τάξεις χαρακτήρων)

Για ευκολία προγραμματισμού, το πρότυπο POSIX έχει ορίσει ορισμένες τυπικές εκφράσεις διαστήματος, που ονομάζονται επίσης κατηγορίες χαρακτήρων(τάξεις χαρακτήρων). Μια κλάση χαρακτήρων ορίζει έναν χαρακτήρα από μια δεδομένη περιοχή -- για παράδειγμα, ένα γράμμα του αλφαβήτου ή έναν αριθμό:

  • [[:alpha:]] -- αλφαβητικός χαρακτήρας (aA-zZ);
  • [[:ψηφίο:]]-ψηφίο (0-9);
  • [[:alnum:]] -- αλφαβητικός χαρακτήρας (aA-zZ) ή αριθμός (0-9).
  • [[:space:]] -- κενό διάστημα (νέες γραμμές, καρτέλες, κ.λπ.).

Συναρτήσεις PHP για εργασία με κανονικές εκφράσεις (συμβατές με POSIX)

Η PHP υποστηρίζει επί του παρόντος επτά συναρτήσεις αναζήτησης χρησιμοποιώντας κανονικές εκφράσεις τύπου POSIX:

  • ereg();
  • ereg_replace();
  • eregi();
  • eregi_replace();
  • διαίρεση();
  • διαίρεση();
  • sql_regcase().

Περιγραφές αυτών των λειτουργιών παρέχονται στις ακόλουθες ενότητες.

Η συνάρτηση ereg() αναζητά μια δεδομένη συμβολοσειρά για μια αντιστοίχιση για ένα μοτίβο. Εάν βρεθεί αντιστοίχιση, επιστρέφεται TRUE, διαφορετικά επιστρέφεται FALSE. Η σύνταξη της συνάρτησης ereg() είναι:

int ereg (μοτίβο συμβολοσειράς, συμβολοσειρά [, αντιστοιχίσεις πίνακα])

Η αναζήτηση πραγματοποιείται λαμβάνοντας υπόψη την περίπτωση των αλφαβητικών χαρακτήρων. Ένα παράδειγμα χρήσης ereg() για αναζήτηση σε συμβολοσειρές domains.com:

$is_com - ereg("(\.)(com$)", $email):

// Η συνάρτηση επιστρέφει TRUE εάν το $email τελειώνει με χαρακτήρες ".com".

// Συγκεκριμένα, η αναζήτηση θα πετύχει για συμβολοσειρές

// "www.wjgilmore.com" και " [email προστατευμένο]"

Σημειώστε ότι λόγω της παρουσίας του συμβόλου $, η τυπική έκφραση ταιριάζει μόνο εάν η συμβολοσειρά τελειώνει με χαρακτήρες .com. Για παράδειγμα, θα ταιριάζει με τη συμβολοσειρά "www.apress.com", αλλά δεν θα ταιριάζειστη γραμμή "www.apress.com/catalog".

Η προαιρετική παράμετρος αντιστοίχισης περιέχει έναν πίνακα αντιστοιχιών για όλες τις υποεκφράσεις που περικλείονται σε παρενθέσεις στην κανονική έκφραση. Η λίστα 8.1 δείχνει πώς να χρησιμοποιήσετε αυτόν τον πίνακα για να χωρίσετε μια διεύθυνση URL σε πολλά τμήματα.

Καταχώριση 8.1. Εκτύπωση στοιχείων του πίνακα $regs

$url = "http://www.apress.com";

// Διαχωρίστε το $url σε τρία στοιχεία: "http://www". "apress" και "com"

$www_url = ereg("^(http://www)\.([[:alnum:]+\.([[:alnum:]]+)". $url, $regs);

if ($www_url) : // Εάν το $www_url περιέχει μια διεύθυνση URL

echo $regs; // Ολόκληρη η συμβολοσειρά "http://www.apress.com"

Τυπώνω "
";

echo $regs[l]; // "http://www"

Τυπώνω "
";

echo $regs; // "apress"

Τυπώνω "
";

echo $regs; // "com" endif;

Η εκτέλεση του σεναρίου στη Λίστα 8.1 παράγει την ακόλουθη έξοδο:

http://www.apress.com http://www apress com

Η συνάρτηση ereg_replace() αναζητά μια δεδομένη συμβολοσειρά για μια αντιστοίχιση για ένα μοτίβο και την αντικαθιστά με ένα νέο κομμάτι. Σύνταξη της συνάρτησης ereg_replace():

string ereg_replace (μοτίβο συμβολοσειράς, αντικατάσταση συμβολοσειράς, συμβολοσειρά)

Η συνάρτηση ereg_replace() λειτουργεί με την ίδια αρχή με την ereg(), αλλά οι δυνατότητές της επεκτείνονται από απλή αναζήτηση σε αναζήτηση με αντικατάσταση. Μετά την εκτέλεση της αντικατάστασης, η συνάρτηση επιστρέφει την τροποποιημένη συμβολοσειρά. Αν ταιριάζει

λείπουν, η γραμμή παραμένει στην ίδια κατάσταση. Η συνάρτηση ereg_replace(), όπως η ereg(), κάνει διάκριση πεζών-κεφαλαίων. Ακολουθεί ένα απλό παράδειγμα που δείχνει τη χρήση αυτής της συνάρτησης:

$copy_date = "Πνευματικά δικαιώματα 1999":

$copy_date = ereg_replace("(+)". "2000", $copy_date);

print $copy_date: // Εκτυπώνει τη συμβολοσειρά "Copyright 2000"

Ένα ενδιαφέρον χαρακτηριστικό των εργαλείων αναζήτησης και αντικατάστασης της PHP είναι η δυνατότητα χρήσης οπισθοαναφορών σε μέρη της κύριας έκφρασης που περικλείονται σε παρένθεση. Οι backreferences είναι παρόμοιες με τα στοιχεία της προαιρετικής παραμέτρου του πίνακα αντιστοίχισης του ereg(), με μία εξαίρεση: οι backreferences γράφονται ως \0, \1, \2, κ.λπ., όπου το \0 ταιριάζει με ολόκληρη τη συμβολοσειρά, \1 ταιριάζει με μια επιτυχημένη αντιστοίχιση πρώτης υποέκφρασης, κ.λπ. Η έκφραση μπορεί να περιέχει έως και 9 συνδέσμους επιστροφής. Το ακόλουθο παράδειγμα αντικαθιστά όλους τους συνδέσμους URL στο κείμενο με υπερσυνδέσμους που λειτουργούν:

$url = "Apress (http://www.apress.com");

$url = ereg_replace("http://(()*)", " \\0", $url);

// Εμφανίζεται η γραμμή:

// Apress (http://www.apress.com)

Η συνάρτηση eregi() αναζητά μια δεδομένη συμβολοσειρά για μια αντιστοίχιση για ένα μοτίβο. Σύνταξη της συνάρτησης eregi():

int eregi (μοτίβο συμβολοσειράς, συμβολοσειρά [, αντιστοιχίσεις πίνακα])

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

$password = "abc";

if (! eregi("[[:alnum:]](8.10), $password) :

εκτύπωση "Μη έγκυρος κωδικός πρόσβασης! Οι κωδικοί πρόσβασης πρέπει να είναι από 8 έως 10 χαρακτήρες.";

// Ως αποτέλεσμα της εκτέλεσης αυτού του τμήματος, εμφανίζεται ένα μήνυμα σφάλματος.

// επειδή το μήκος της συμβολοσειράς "abc" δεν είναι εντός του επιτρεπόμενου διαστήματος

// από 8 έως 10 χαρακτήρες.

Η συνάρτηση eregi_replace() λειτουργεί ακριβώς όπως η ereg_replace(), με μία εξαίρεση: η αναζήτηση δεν κάνει διάκριση πεζών-κεφαλαίων. Σύνταξη της συνάρτησης ereg_replace():

string eregi_replace (πρότυπο συμβολοσειράς, αντικατάσταση συμβολοσειράς, συμβολοσειρά)

Η συνάρτηση split() χωρίζει μια συμβολοσειρά σε στοιχεία των οποίων τα όρια καθορίζονται από ένα δεδομένο μοτίβο. Η σύνταξη της συνάρτησης split() είναι:

διαίρεση πίνακα (μοτίβο συμβολοσειράς, συμβολοσειρά [, όριο int])

Η προαιρετική παράμετρος κατωφλίου καθορίζει τον μέγιστο αριθμό στοιχείων στα οποία χωρίζεται η συμβολοσειρά από αριστερά προς τα δεξιά. Εάν το μοτίβο περιέχει αλφαβητικούς χαρακτήρες, η συνάρτηση spl it() κάνει διάκριση πεζών-κεφαλαίων. Το ακόλουθο παράδειγμα δείχνει τη χρήση της συνάρτησης split() για τον διαχωρισμό μιας κανονικής διεύθυνσης IP σε τρίδυμα:

$ip = "123.345.789.000"; // Κανονική διεύθυνση IP

$iparr = split ("\.", $ip) // Επειδή η τελεία είναι χαρακτήρας υπηρεσίας.

// πρέπει να διαφύγει.

εκτύπωση "$iparr
"; // Έξοδοι "123"

εκτύπωση "$iparr
"; // Έξοδοι "456"

εκτύπωση "$iparr
"; // Έξοδοι "789"

εκτύπωση "$iparr
"; // Έξοδοι "000"

Η συνάρτηση spliti() λειτουργεί ακριβώς όπως το πρωτότυπο split(), με μια εξαίρεση: αυτό δεν λαμβάνει υπόψημητρώο χαρακτήρων. Η σύνταξη της συνάρτησης spliti() είναι:

spliti πίνακα (μοτίβο συμβολοσειράς, συμβολοσειρά [, όριο int])

Φυσικά, τα πεζά και κεφαλαία είναι σημαντικά μόνο αν το μοτίβο περιέχει αλφαβητικούς χαρακτήρες. Για άλλους χαρακτήρες, η εκτέλεση της spliti() είναι ακριβώς η ίδια με την split().

Η βοηθητική συνάρτηση sql_regcase() περικλείει κάθε χαρακτήρα στη συμβολοσειρά εισόδου σε αγκύλες και προσαρτά τον αντίστοιχο χαρακτήρα σε αυτήν. Σύνταξη της συνάρτησης sql_regcase():

string sql_regcase (string string)

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

$version = "php 4.0";

εκτύπωση sql_regcase($version);

// Εμφανίζει τη συμβολοσειρά [..]

Σύνταξη κανονικής έκφρασης τύπου Perl

Μετατροπή συμβολοσειράς σε κεφαλαία και πεζά

Υπάρχουν τέσσερις συναρτήσεις στην PHP που έχουν σχεδιαστεί για να αλλάζουν τα πεζά μιας συμβολοσειράς:

  • strtolower();
  • strtoupper();
  • ucfirst();
  • ucwords().

Όλα αυτά τα χαρακτηριστικά περιγράφονται αναλυτικά παρακάτω.

strtolower()

Η συνάρτηση strtolower() μετατρέπει όλους τους αλφαβητικούς χαρακτήρες μιας συμβολοσειράς σε πεζούς. Η σύνταξη της συνάρτησης strtolower() είναι:

string sttolower (string string)

Οι μη αλφαβητικοί χαρακτήρες δεν αλλάζουν από τη συνάρτηση. Η μετατροπή μιας συμβολοσειράς σε πεζά χρησιμοποιώντας τη συνάρτηση strtolower() παρουσιάζεται στο ακόλουθο παράδειγμα:

$sentence = strtolower($sentence);

// "Το μαγείρεμα και ο προγραμματισμός php είναι οι δύο αγαπημένες μου ασχολίες!"

Οι συμβολοσειρές μπορούν να μετατραπούν όχι μόνο σε πεζά, αλλά και σε κεφαλαία. Η μετατροπή πραγματοποιείται από τη συνάρτηση strtoupper(), η οποία έχει την ακόλουθη σύνταξη:

χορδή strtoupper (χορδή χορδής)

Οι μη αλφαβητικοί χαρακτήρες δεν αλλάζουν από τη συνάρτηση. Η μετατροπή μιας συμβολοσειράς σε κεφαλαία χρησιμοποιώντας strtoupper() παρουσιάζεται στο ακόλουθο παράδειγμα:

$sentence = "Το μαγείρεμα και ο προγραμματισμός της PHP είναι οι δύο αγαπημένες μου ασχολίες!";

$sentence = strtoupper($sentence);

// Μετά την κλήση της συνάρτησης $sentence περιέχει τη συμβολοσειρά

// "Η ΜΑΓΕΙΡΙΚΗ ΚΑΙ Ο ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ PHP ΕΙΝΑΙ ΟΙ ΔΥΟ ΑΓΑΠΗΜΕΝΕΣ ΜΟΥ ΠΑΡΟΧΕΣ!"

Η συνάρτηση ucfirst() μετατρέπει τον πρώτο χαρακτήρα μιας συμβολοσειράς σε κεφαλαία, με την προϋπόθεση ότι είναι αλφαβητικός χαρακτήρας. Σύνταξη συνάρτησης ucfirst():

χορδή ucfirst (χορδή χορδής)

Οι μη αλφαβητικοί χαρακτήρες δεν αλλάζουν από τη συνάρτηση. Η μετατροπή του πρώτου χαρακτήρα μιας συμβολοσειράς από τη συνάρτηση ucfirst() παρουσιάζεται στο ακόλουθο παράδειγμα:

&sentence = "Το μαγείρεμα και ο προγραμματισμός της PHP είναι οι δύο αγαπημένες μου ασχολίες!";

$sentence = ucfirst($sentence);

// Μετά την κλήση της συνάρτησης $sentence περιέχει τη συμβολοσειρά

// "Η μαγειρική και ο προγραμματισμός PHP είναι οι δύο αγαπημένες μου ασχολίες!"

Η συνάρτηση ucwords() μετατρέπει το πρώτο γράμμα κάθε λέξης μιας συμβολοσειράς σε κεφαλαία. Σύνταξη της συνάρτησης ucwords():

συμβολοσειρά ucwords (string string")

Οι μη αλφαβητικοί χαρακτήρες δεν αλλάζουν από τη συνάρτηση. Μια "λέξη" ορίζεται ως μια ακολουθία χαρακτήρων που χωρίζονται από άλλα στοιχεία συμβολοσειράς με κενά. Το ακόλουθο παράδειγμα δείχνει πώς η συνάρτηση ucwords() μετατρέπει τους πρώτους χαρακτήρες των λέξεων:

$sentence = "Το μαγείρεμα και ο προγραμματισμός της PHP είναι οι δύο αγαπημένες μου ασχολίες!";

$sentence = ucwords($sentence);

// Μετά την κλήση της συνάρτησης $sentence περιέχει τη συμβολοσειρά

// "Το μαγείρεμα και ο προγραμματισμός PHP είναι οι δύο αγαπημένες μου ασχολίες!"

Έργο: Αναγνώριση προγράμματος περιήγησης

Κάθε προγραμματιστής που προσπαθεί να δημιουργήσει έναν φιλικό προς τον χρήστη ιστότοπο πρέπει να λαμβάνει υπόψη τις διαφορές στη μορφοποίηση της σελίδας κατά την προβολή του ιστότοπου σε διαφορετικά προγράμματα περιήγησης και λειτουργικά συστήματα. Αν και η κοινοπραξία W3 (http://www.w3.org) συνεχίζει να δημοσιεύει πρότυπα που πρέπει να τηρούν οι προγραμματιστές κατά τη δημιουργία εφαρμογών ιστού, οι προγραμματιστές του προγράμματος περιήγησης επιθυμούν να προσθέτουν τις δικές τους μικρές «βελτιώσεις» σε αυτά τα πρότυπα, γεγονός που προκαλεί τελικά χάος και σύγχυση . Οι προγραμματιστές συχνά επιλύουν αυτό το πρόβλημα δημιουργώντας διαφορετικές σελίδες για κάθε τύπο προγράμματος περιήγησης και λειτουργικό σύστημα - αυτό αυξάνει σημαντικά τον φόρτο εργασίας, αλλά ο ιστότοπος που προκύπτει είναι ιδανικός για κάθε χρήστη. Το αποτέλεσμα είναι καλή φήμη για τον ιστότοπο και σιγουριά ότι ο χρήστης θα τον επισκεφτεί ξανά.

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

Το παρακάτω έργο (sniffer.php) δείχνει πώς να χρησιμοποιείτε συναρτήσεις PHP για να εργαστείτε με κανονικές εκφράσεις για την ανάκτηση πληροφοριών από ερωτήματα. Το πρόγραμμα καθορίζει τον τύπο και την έκδοση του προγράμματος περιήγησης και του λειτουργικού συστήματος και, στη συνέχεια, εμφανίζει τις ληφθείσες πληροφορίες στο παράθυρο του προγράμματος περιήγησης. Αλλά πριν προχωρήσω στην πραγματική ανάλυση του προγράμματος, θέλω να εισαγάγω ένα από τα κύρια συστατικά του - την τυπική μεταβλητή PHP $HTTP_USER_AGENT. Αυτή η μεταβλητή αποθηκεύει διάφορες πληροφορίες σχετικά με το πρόγραμμα περιήγησης και το λειτουργικό σύστημα του χρήστη σε μορφή συμβολοσειράς—ακριβώς αυτό που μας ενδιαφέρει. Αυτές οι πληροφορίες μπορούν εύκολα να εμφανιστούν στην οθόνη με μία μόνο εντολή:

echo $HTTP USER_AGENT;

Όταν εκτελείτε τον Internet Explorer 5.0 σε υπολογιστή με Windows 98, το αποτέλεσμα θα μοιάζει με αυτό:

Mozilla/4.0 (συμβατό; MSIE 5.0; Windows 98; DigExt)

Για το Netscape Navigator 4.75 εμφανίζονται τα ακόλουθα δεδομένα:

Mozilla/4.75 (Win98; U)

Το Sniffer.php εξάγει τα απαραίτητα δεδομένα από το $HTTP_USER_AGENT χρησιμοποιώντας συναρτήσεις επεξεργασίας συμβολοσειρών και κανονικής έκφρασης. Αλγόριθμος προγράμματος σε ψευδοκώδικα:

  • Ορίστε δύο λειτουργίες για τον προσδιορισμό του προγράμματος περιήγησης και του λειτουργικού συστήματος: browser_info() και opsys_info(). Ας ξεκινήσουμε με τον ψευδοκώδικα της συνάρτησης browser_info().
  • Προσδιορίστε τον τύπο του προγράμματος περιήγησης χρησιμοποιώντας τη συνάρτηση eged(). Αν και αυτή η συνάρτηση είναι πιο αργή από τις απλοποιημένες συναρτήσεις συμβολοσειράς όπως η strstr(), είναι πιο βολική σε αυτήν την περίπτωση επειδή η τυπική έκφραση σάς επιτρέπει να προσδιορίσετε την έκδοση του προγράμματος περιήγησης.
  • Χρησιμοποιήστε την κατασκευή if/elseif για να αναγνωρίσετε τα ακόλουθα προγράμματα περιήγησης και τις εκδόσεις τους: Internet Explorer, Opera, Netscape και ένα πρόγραμμα περιήγησης αγνώστου τύπου.
  • Επιστρέψτε τις πληροφορίες τύπου προγράμματος περιήγησης και έκδοσης ως πίνακα.
  • Η συνάρτηση opsys_info() καθορίζει τον τύπο του λειτουργικού συστήματος. Αυτή τη φορά χρησιμοποιείται η συνάρτηση strstr(), καθώς ο τύπος του λειτουργικού συστήματος καθορίζεται χωρίς τη χρήση κανονικών εκφράσεων.
  • Χρησιμοποιήστε την κατασκευή if/elseif για να αναγνωρίσετε τα ακόλουθα συστήματα: Windows, Linux, UNIX, Macintosh και άγνωστο λειτουργικό σύστημα.
  • Επιστρέψτε πληροφορίες σχετικά με το λειτουργικό σύστημα.

Καταχώριση 8.3. Προσδιορισμός του τύπου προγράμματος περιήγησης και του λειτουργικού συστήματος πελάτη

Αρχείο: sniffer.php

Σκοπός: Προσδιορισμός τύπου/έκδοσης προγράμματος περιήγησης και πλατφόρμας

// Λειτουργία: browser_info

// Σκοπός: Επιστρέφει τον τύπο και την έκδοση του προγράμματος περιήγησης

λειτουργία browser_info ($agent) (

// Προσδιορισμός τύπου προγράμματος περιήγησης

// Αναζήτηση για την υπογραφή του Internet Explorer

if (ereg("MSIE (.(1,2))", $agent, $έκδοση))

$browse_type = "IE";

$browse version = $version;

// Αναζήτηση για την υπογραφή Opera

elseif (ereg("Opera (.(1,2))". $agent, $version)):

$browse_type = "Όπερα":

$browse_version = $version:

// Αναζήτηση για υπογραφή Netscape. Έλεγχος του προγράμματος περιήγησης Netscape

// *πρέπει* να γίνει αφού ελέγξετε τον Internet Explorer και τον Opera,

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

// Mozilla μαζί με το πραγματικό όνομα.

elseif (ereg("Mozilla/(.(1,2))". $agent, $version)) :

$browse_type = "Netscape";

$browse_version = $version;

// Εκτός αν είναι Internet Explorer, Opera ή Netscape.

// σημαίνει ότι εντοπίσαμε ένα άγνωστο πρόγραμμα περιήγησης,

$browse_type = "Άγνωστο";

$browse_version = "Άγνωστο";

// Επιστροφή τύπου και έκδοσης προγράμματος περιήγησης ως πίνακα

πίνακας επιστροφής ($browse_type, $browse_version);

) // Τέλος της συνάρτησης browser_info

// Συνάρτηση: opsys_info

// Σκοπός: Επιστρέφει πληροφορίες σχετικά με το λειτουργικό σύστημα του χρήστη

συνάρτηση opsys_info($agent) (

// Προσδιορίστε το λειτουργικό σύστημα

// Αναζήτηση για την υπογραφή των Windows

if (strstr($agent. "win")) :

$opsys = "παράθυρα";

// Αναζήτηση για υπογραφή Linux

elseif (strstr($agent, "Linux")):

$opsys = "Linux";

// Αναζήτηση για υπογραφή UNIX

elseif (strstr (Sagent, "Unix")):

$opsys = "Unix";

// Αναζητήστε υπογραφή Macintosh

elseif (strstr($agent, "Mac")):

$opsys = "Macintosh";

// Άγνωστη άλλη πλατφόρμα:

$opsys = "Άγνωστο";

// Επιστροφή πληροφοριών σχετικά με το λειτουργικό σύστημα

λίστα ($browse_type. $browse_version) = browser_info ($HTTP_USER_AGENT); Soperating_sys = opsysjnfo($HTTP_USER_AGENT);

εκτύπωση "Τύπος προγράμματος περιήγησης: $browse_type
";

print "Έκδοση προγράμματος περιήγησης: $browse_version
";

εκτύπωση "Λειτουργικό σύστημα: $operating_sys
":

Αυτό είναι όλο! Για παράδειγμα, εάν ο χρήστης χρησιμοποιεί το πρόγραμμα περιήγησης Netscape 4.75 σε υπολογιστή με Windows, θα εμφανιστεί η ακόλουθη έξοδος:

Τύπος προγράμματος περιήγησης: Netscape

Έκδοση προγράμματος περιήγησης: 4.75

Λειτουργικό σύστημα: Windows

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

Αποτελέσματα

Αυτό το κεφάλαιο κάλυψε αρκετό υλικό. Τι ωφελεί μια γλώσσα προγραμματισμού αν δεν μπορείτε να δουλέψετε με κείμενο σε αυτήν; Καλύψαμε τα ακόλουθα θέματα:

  • γενικές πληροφορίες για κανονικές εκφράσεις σε στυλ POSIX και Perl.
  • τυπικές συναρτήσεις PHP για εργασία με κανονικές εκφράσεις.
  • αλλαγή μήκους γραμμής.
  • προσδιορισμός του μήκους μιας συμβολοσειράς.
  • εναλλακτικές συναρτήσεις PHP για την επεξεργασία πληροφοριών συμβολοσειρών.
  • μετατροπή απλού κειμένου σε HTML και αντίστροφα.
  • αλλαγή πεζών-κεφαλαίων χαρακτήρων σε συμβολοσειρές.

Το επόμενο κεφάλαιο ανοίγει το δεύτερο μέρος του βιβλίου - παρεμπιπτόντως, το αγαπημένο μου. Σε αυτό, θα αρχίσουμε να εξερευνούμε τα Web-centric εργαλεία της PHP, εξετάζοντας τη διαδικασία της δυναμικής δημιουργίας περιεχομένου, συμπεριλαμβανομένων των αρχείων, και τη δημιουργία κοινών προτύπων. Τα επόμενα κεφάλαια στο Μέρος 2 καλύπτουν την εργασία με φόρμες HTML, βάσεις δεδομένων, παρακολούθηση δεδομένων περιόδου σύνδεσης και προηγμένα εργαλεία προτύπων. Μείνετε εκεί - η διασκέδαση πρόκειται να ξεκινήσει!

Περιεχόμενα

$user_info

Αυτά είναι όλα τα κλειδιά που ορίζονται για το $user_info στο loadUserSettings(). Μερικοί είναι αυτονόητοι, σίγουρα.

ομάδες

πίνακας. Όλες οι πιθανές ομάδες μελών επισυνάπτουν επίσης έναν χρήστη. Τα κλειδιά δεν έχουν σημασία. Οι αξίες είναι οι ομάδες, απολυμανμένες ως int, για παν ενδεχόμενο. Αυτό περιλαμβάνει:

  • Πρωτοβάθμια ομάδα
  • Ομάδα καταμέτρησης αναρτήσεων
  • Πρόσθετες ομάδες. Αυτά αποθηκεύονται στη βάση δεδομένων ως συμβολοσειρά οριοθετημένη με κόμμα.

possibly_robot

bool. Ισχύει εάν ο πράκτορας ταιριάζει με μια γνωστή αράχνη, εάν η δυνατότητα είναι ενεργοποιημένη, και εάν είναι απενεργοποιημένη, κάνει μια σωστή εικασία.

ταυτότητα

int Αντιστοιχεί στην τιμή βάσης δεδομένων του μέλους "id_member".!}

όνομα χρήστη

όνομα

σειρά. Το εμφανιζόμενο όνομά τους.

ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ

passwd

Γλώσσα

είναι_επισκέπτης

is_admin

θέμα

τελευταία είσοδος

ενθ. Χρονική σήμανση Unix.

ip

$_SERVER["REMOTE_ADDR"]

ip2

$_SERVER["BAN_CHECK_IP"]

αναρτήσεις

ενθ. Καταμέτρηση αναρτήσεων.

μορφή ώρας

σειρά. Προσαρμοσμένη μορφή για strtftime().

time_offset

ενθ. Ωριαία μετατόπιση χρήστη από την ώρα του φόρουμ.

άβαταρ

  • url:string
  • όνομα αρχείου: string
  • custom_dir: bool
  • id_attach: ενθ

smiley_set

μηνύματα

ενθ. Αριθμός PM που έχουν.

μη αναγνωσμένα_μηνύματα

ενθ. Αριθμός μη αναγνωσμένων PM που έχουν.

total_time_logged_in

φίλοι

Σειρά. Η λίστα των φίλων τους οριοθετημένη με κόμμα.

αγνοώντας πίνακες

Σειρά. Ο κατάλογος των πινάκων που έχουν αγνοήσει οριοθετείται με κόμμα.

αγνοούν χρήστες

Σειρά. Η λίστα των χρηστών που επέλεξαν να αγνοήσουν είναι οριοθετημένη με κόμμα.

  • Στο SMF 1.1.x μόνο τα PM αγνοούνται.
  • Στο SMF 2.0.x και μεταγενέστερα, αυτή η δυνατότητα έχει βελτιωθεί για να κρύβει επίσης τις δημοσιεύσεις του χρήστη που αγνοήθηκε.

προειδοποίηση

ενθ. Τα προειδοποιητικά τους σημεία.

άδειες

query_see_board

Η λίστα όλων των πινάκων που μπορούν να δουν ως μέρος μιας προετοιμασμένης δήλωσης SQL.

query_wanna_see_board

Η λίστα των πινάκων που ΘΕΛΟΥΝ να βλέπουν ως μέρος μιας προετοιμασμένης δήλωσης SQL.

mod_cache

is_mod

Boolean. Είναι ψευδής εκτός από πίνακες όπου το μέλος είναι συντονιστής. Είναι πάντα στημένο.

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

Πριν ξεκινήσεις καθολικός πίνακας $_SERVER σε PHP, θα σας δώσω μια μικρή υπόδειξη αμέσως. Υπάρχει ένα μεγάλο χαρακτηριστικό ενσωματωμένο PHP, η οποία ονομάζεται phpinfo(). Ας δώσουμε αμέσως ένα παράδειγμα χρήσης του:

phpinfo();
?>

Ως αποτέλεσμα της εκτέλεσης αυτού του απλού σεναρίου, θα δείτε έναν τεράστιο πίνακα με διάφορα Ρυθμίσεις διερμηνέα PHP, συμπεριλαμβανομένου, κοντά στο τέλος θα υπάρχει ένας πίνακας τιμών καθολικός πίνακας $_SERVER. Θα εμφανίσει όλα τα κλειδιά και όλες τις αντίστοιχες τιμές τους. Πώς μπορεί αυτό να σας βοηθήσει; Και το γεγονός είναι ότι εάν χρειάζεστε αυτήν ή εκείνη την τιμή και ξεχάσετε πώς ονομάζεται το κλειδί, χρησιμοποιήστε τη συνάρτηση phpinfo()Μπορείτε πάντα να θυμάστε το όνομά του. Γενικά θα εκτελέσεις αυτό το σενάριο και θα με καταλάβεις αμέσως.

Τώρα ας περάσουμε στα πιο δημοφιλή στα κλειδιά του πίνακα $_SERVER:

  • HTTP_USER_AGENT- αυτό το κλειδί σάς επιτρέπει να μάθετε τα χαρακτηριστικά του πελάτη. Στις περισσότερες περιπτώσεις, αυτό είναι σίγουρα το πρόγραμμα περιήγησης, ωστόσο, όχι πάντα. Και πάλι, αν είναι πρόγραμμα περιήγησης, τότε ποιο, μπορείτε να το μάθετε σε αυτήν τη μεταβλητή.
  • HTTP_REFERER- περιέχει την απόλυτη διαδρομή προς αυτό το αρχείο ( Σενάριο PHP, σελίδα HTML), από το οποίο μεταβήκαμε σε αυτό το σενάριο. Σε γενικές γραμμές, από πού ήρθε ο πελάτης.
  • SERVER_ADDR - διεύθυνση IPυπηρέτης.
  • REMOTE_ADDR - διεύθυνση IPπελάτης.
  • DOCUMENT_ROOT- φυσική διαδρομή προς τον ριζικό κατάλογο του ιστότοπου. Αυτή η επιλογή ορίζεται μέσω Αρχείο διαμόρφωσης διακομιστή Apache.
  • SCRIPT_FILENAME- φυσική διαδρομή προς το καλούμενο σενάριο.
  • QUERY_STRING- μια πολύ χρήσιμη τιμή που σας επιτρέπει να λάβετε μια συμβολοσειρά με ένα αίτημα και, στη συνέχεια, μπορείτε να αναλύσετε αυτήν τη συμβολοσειρά.
  • REQUEST_URI- μια ακόμη πιο χρήσιμη τιμή που περιέχει όχι μόνο το ίδιο το αίτημα, αλλά και τη σχετική διαδρομή προς το καλούμενο σενάριο από τη ρίζα. Αυτό χρησιμοποιείται πολύ συχνά για την αφαίρεση διπλασιασμού από index.php, δηλαδή όταν έχουμε τέτοια URL: "http://mysite.ru/index.php" Και " http://mysite.ru/" οδηγεί σε μία σελίδα και URLδιαφορετικό, επομένως διπλασιασμό, το οποίο θα έχει άσχημη επίδραση στη βελτιστοποίηση μηχανών αναζήτησης. Και με τη βοήθεια REQUEST_URIμπορούμε να προσδιορίσουμε: με index.phpή όχι το σενάριο κλήθηκε. Και μπορούμε να κάνουμε μια ανακατεύθυνση με index.php(αν ήταν παρών REQUEST_URI) χωρίς index.php. Ως αποτέλεσμα, κατά την αποστολή ενός τέτοιου αιτήματος: " http://mysite.ru/index.php?id=5», θα έχουμε ανακατεύθυνση σε URL: "http://mysite.ru/?id=5«.Δηλαδή απαλλαγήκαμε από τον διπλασιασμό αφαιρώντας από URLΑυτό index.php.
  • SCRIPT_NAME- σχετική διαδρομή προς το καλούμενο σενάριο.

Ίσως αυτά να είναι όλα τα στοιχεία καθολικός πίνακας $_SERVER σε PHPπου χρησιμοποιούνται τακτικά. Πρέπει να τα γνωρίζετε και να μπορείτε να τα χρησιμοποιείτε όταν χρειάζεται.

5 Φεβρουαρίου , 2017

Δεν ξέρω κανένα πλαίσιο PHP. Αυτό είναι λυπηρό και ντροπιαστικό, αλλά δεν απαγορεύεται ακόμη από το νόμο. Αλλά ταυτόχρονα θέλω να παίξω με το REST API. Το πρόβλημα είναι ότι η php από προεπιλογή υποστηρίζει μόνο $_GET και $_POST. Και για μια ξεκούραστη υπηρεσία πρέπει επίσης να μπορείτε να εργαστείτε με PUT, DELETE και PATCH. Και δεν είναι πολύ προφανές πώς να επεξεργαστείτε πολιτιστικά πολλά αιτήματα όπως ΛΗΨΗ http://site.ru/users, ΔΙΑΓΡΑΦΗ http://site.ru/goods/5και άλλες αισχρότητες. Πώς να τυλίξετε όλα αυτά τα αιτήματα σε ένα μόνο σημείο, να τα αναλύσετε καθολικά σε μέρη και να εκτελέσετε τον απαραίτητο κώδικα για την επεξεργασία των δεδομένων;

Σχεδόν οποιοδήποτε πλαίσιο PHP μπορεί να το κάνει αυτό από το κουτί. Για παράδειγμα, το Laravel, όπου η δρομολόγηση υλοποιείται καθαρά και απλά. Τι γίνεται όμως αν δεν χρειάζεται να μελετήσουμε ένα νέο μεγάλο θέμα αυτήν τη στιγμή, αλλά απλώς θέλουμε να ξεκινήσουμε γρήγορα ένα έργο με υποστήριξη REST API; Αυτό θα συζητηθεί στο άρθρο.

Τι πρέπει να μπορεί να κάνει η υπηρεσία μας RESTful;

1. Υποστήριξη και των 5 βασικών τύπων αιτημάτων: GET, POST, PUT, PATCH, DELETE.
2. Λύστε διάφορες διαδρομές της προβολής
POST /εμπορεύματα
PUT /goods/(goodId)
GET /users/(userId)/info
και άλλες αυθαίρετα μακριές αλυσίδες.

Προσοχή: αυτό το άρθρο δεν αφορά τα βασικά του REST API
Υποθέτω ότι είστε ήδη εξοικειωμένοι με την προσέγγιση REST και κατανοείτε πώς λειτουργεί. Αν όχι, τότε υπάρχουν πολλά υπέροχα άρθρα στο Διαδίκτυο σχετικά με τα βασικά του REST - δεν θέλω να τα αντιγράψω, η ιδέα μου είναι να δείξω πώς να εργάζομαι με το REST στην πράξη.

Ποια λειτουργικότητα θα υποστηρίξουμε;

Ας εξετάσουμε 2 οντότητες - προϊόντα και χρήστες.

Για τα προϊόντα, οι επιλογές είναι οι εξής:

  • 1. GET /goods/(goodId)— Λήψη πληροφοριών για το προϊόν
  • 2. POST /εμπορεύματα— Προσθήκη νέου προϊόντος
  • 3. PUT /goods/(goodId)— Επεξεργασία προϊόντος
  • 4. PATCH /goods/(goodId)— Επεξεργασία ορισμένων παραμέτρων προϊόντος
  • 5. ΔΙΑΓΡΑΦΗ /goods/(goodId)— Αφαίρεση προϊόντος

Για τους χρήστες, για ποικιλία, ας εξετάσουμε διάφορες επιλογές με το GET

  • 1. GET /users/(userId)— Πλήρεις πληροφορίες για τον χρήστη
  • 2. GET /users/(userId)/info— Μόνο γενικές πληροφορίες για τον χρήστη
  • 3. GET /users/(userId)/παραγγελίες— Κατάλογος παραγγελιών χρηστών

Πώς θα λειτουργήσει αυτό με την εγγενή PHP;

Το πρώτο πράγμα που θα κάνουμε είναι να ρυθμίσουμε το .htaccess έτσι ώστε όλα τα αιτήματα να ανακατευθύνονται στο αρχείο index.php. Είναι αυτός που θα ασχοληθεί με την εξαγωγή δεδομένων.

Δεύτερον, ας αποφασίσουμε ποια δεδομένα χρειαζόμαστε και ας γράψουμε τον κώδικα για να τα λάβουμε - στο index.php.
Μας ενδιαφέρουν 3 τύποι δεδομένων:

  • 1. Μέθοδος αιτήματος (GET, POST, PUT, PATCH ή DELETE)
  • 2. Δεδομένα από τη διεύθυνση URL, για παράδειγμα, χρήστες/(userId)/πληροφορίες - απαιτούνται και οι 3 παράμετροι
  • 3. Στοιχεία από τον φορέα αιτήματος
Και τρίτον, θα γράψουμε κώδικα που εκτελεί τις απαραίτητες λειτουργίες. Οι λειτουργίες χωρίζονται σε αρχεία, όλα είναι Feng Shui, η προσθήκη νέων μονοπατιών και μεθόδων για μια υπηρεσία RESTful θα είναι πολύ απλή.

.htaccess

Ας δημιουργήσουμε ένα αρχείο .htaccess στη ρίζα του έργου

RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteRule ^(.+)$ index.php?q=$1

Με αυτές τις μυστηριώδεις γραμμές σας διατάζουμε να κάνετε αυτό:
1 - στείλτε όλα τα αιτήματα οποιουδήποτε είδους στο king-file index.php
2 - κάντε τη συμβολοσειρά στη διεύθυνση URL διαθέσιμη στο index.php στην παράμετρο get q. Δηλαδή, δεδομένα από μια διεύθυνση URL όπως /users/(userId)/infoθα πάρουμε από $_GET["q"].

index.php

Ας δούμε το index.php γραμμή προς γραμμή. Αρχικά, ας πάρουμε τη μέθοδο αιτήματος.

// Καθορίστε τη μέθοδο αιτήματος $method = $_SERVER["REQUEST_METHOD"];

Στη συνέχεια, τα δεδομένα από το σώμα αιτήματος

// Λήψη δεδομένων από το σώμα του αιτήματος $formData = getFormData($method);

Για το GET και το POST, είναι εύκολο να αντλήσετε δεδομένα από τους αντίστοιχους πίνακες $_GET και $_POST. Αλλά για άλλες μεθόδους πρέπει να είσαι λίγο διεστραμμένος. Ο κωδικός για αυτούς τραβιέται από το ρεύμα php://input, ο κώδικας είναι εύκολος στο Google, μόλις έγραψα ένα γενικό περιτύλιγμα - τη συνάρτηση getFormData($method)

// Λήψη δεδομένων από τη συνάρτηση σώματος αιτήματος getFormData($method) ( // GET ή POST: επιστρέφει δεδομένα ως έχουν ($method === "GET") επιστρέφει $_GET; εάν ($method === "POST" ) επιστρέφει $_POST; ("=", $pair if (count($item) == 2) ( $data = urldcode($item); ) ) return $data;

Δηλαδή, πήραμε τα απαραίτητα δεδομένα κρύβοντας όλες τις λεπτομέρειες στο getFormData - καλά, τέλεια. Ας περάσουμε στο πιο ενδιαφέρον κομμάτι - τη δρομολόγηση.

// Ανάλυση της διεύθυνσης url $url = (isset($_GET["q"])) ? $_GET["q"] : ""; $url = rtrim($url, "/"); $urls = explode("/", $url);

Μάθαμε παραπάνω ότι το .htaccess θα βάλει παραμέτρους από τη διεύθυνση URL στην παράμετρο q του πίνακα $_GET. Δηλαδή, το $_GET["q"] θα περιέχει κάτι σαν αυτό: χρήστες/10. Ανεξάρτητα από τη μέθοδο που χρησιμοποιούμε για να εκτελέσουμε το αίτημα.

ΕΝΑ explode("/", $url)μετατρέπει αυτήν τη συμβολοσειρά σε έναν πίνακα για εμάς, με τον οποίο μπορούμε ήδη να εργαστούμε. Έτσι, κάντε όσες μεγάλες αλυσίδες ερωτημάτων θέλετε, για παράδειγμα,
GET /goods/page/2/limit/10/sort/price_asc
Και να είστε σίγουροι, θα λάβετε έναν πίνακα

$urls = array("goods", "page", "2", "limit", "10", "sort", "price_asc");

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

// Ορισμός του δρομολογητή και των δεδομένων url $router = $urls; $urlData = array_slice($urls, 1); // Συνδέστε το αρχείο του δρομολογητή και εκτελέστε την κύρια συνάρτηση include_once "routers/" . $δρομολογητής. ".php"; route($method, $urlData, $formData);

Τόπιασες? Δημιουργούμε έναν φάκελο δρομολογητών στον οποίο τοποθετούμε αρχεία που χειρίζονται μια οντότητα: προϊόντα ή χρήστες. Ταυτόχρονα, συμφωνούμε ότι τα ονόματα των αρχείων συμπίπτουν με την πρώτη παράμετρο στο urlData - θα είναι ο δρομολογητής, $router. Και αυτός ο δρομολογητής πρέπει να αφαιρεθεί από το urlData, δεν το χρειαζόμαστε πλέον και χρησιμοποιείται μόνο για τη σύνδεση του απαιτούμενου αρχείου. array_slice ($urls, 1)και θα μας δώσει όλα τα στοιχεία του πίνακα εκτός από το πρώτο.

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

GET /goods/(goodId)

Αρχεία routers/goods.php

// Διαδρομή συνάρτησης δρομολογητή($method, $urlData, $formData) ( // Λήψη πληροφοριών σχετικά με ένα προϊόν // GET /goods/(goodId) if ($method === "GET" && count($urlData) == = 1) ( // Λήψη του αναγνωριστικού προϊόντος $goodId = $urlData; // Τραβήξτε το προϊόν έξω από τη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode(array("method" => "GET", "id" => $goodId, "good" => "phone", "price" => 10000) // Return error header("HTTP/1.0 400 Bad Request"); error" => "Κακή αίτηση") "));

Τα περιεχόμενα του αρχείου είναι μια μεγάλη συνάρτηση διαδρομής, η οποία, ανάλογα με τις παραμέτρους που έχουν περάσει, εκτελεί τις απαραίτητες ενέργειες. Εάν η μέθοδος GET και 1 παράμετρος (goodId) μεταβιβαστούν στο urlData, τότε αυτό είναι ένα αίτημα για τη λήψη δεδομένων σχετικά με ένα προϊόν.

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

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

Ας το δοκιμάσουμε με ένα παράδειγμα: ανοίξτε την κονσόλα του προγράμματος περιήγησής σας και εκτελέστε τον κώδικα

$.ajax((url: "/examples/rest/goods/10", μέθοδος: "GET", dataType: "json", επιτυχία: function(response)(console.log("response:", απάντηση))) )

Ο κώδικας θα στείλει ένα αίτημα στον διακομιστή όπου έχω αναπτύξει μια παρόμοια εφαρμογή και θα παράγει μια απάντηση. Βεβαιωθείτε ότι η διαδρομή που σας ενδιαφέρει είναι /αγαθά/10λειτούργησε πραγματικά. Στην καρτέλα Δίκτυο θα παρατηρήσετε το ίδιο αίτημα.
Και ναι, το /examples/rest είναι η ριζική διαδρομή της δοκιμαστικής εφαρμογής μας προς τον ιστότοπο

Εάν είστε πιο συνηθισμένοι να χρησιμοποιείτε το curl στην κονσόλα, τότε εκτελέστε το στο τερματικό - η απάντηση θα είναι η ίδια, ακόμη και με κεφαλίδες από τον διακομιστή.

Curl -X GET https://site/examples/rest/goods/10 -i

Στο τέλος της συνάρτησης γράψαμε τον παρακάτω κώδικα.

// Επιστροφή κεφαλίδας σφάλματος ("HTTP/1.0 400 Bad Request"); echo json_encode(array("error" => "Bad Request"));

Σημαίνει ότι εάν κάναμε λάθος με τις παραμέτρους ή δεν οριστεί η ζητούμενη διαδρομή, θα επιστρέψουμε το σφάλμα 400 Bad Request στον πελάτη. Για παράδειγμα, προσθέστε κάτι σαν αυτό στη διεύθυνση URL: αγαθά/10/άλλο_παράμκαι θα δείτε ένα σφάλμα στην κονσόλα και μια απάντηση 400 - το λανθασμένο αίτημα δεν ολοκληρώθηκε.

Κωδικοί http απόκρισης διακομιστή
Δεν θα ασχοληθούμε με την έξοδο διαφορετικών κωδικών, αν και αυτό αξίζει να γίνει σύμφωνα με το REST. Υπάρχουν πολλά σφάλματα πελάτη. Ακόμη και στην απλή μας περίπτωση, ένα 405 είναι κατάλληλο σε περίπτωση λανθασμένης μεθόδου. Δεν θέλω να περιπλέκω τα πράγματα επίτηδες.
Εάν είναι επιτυχής, ο διακομιστής μας θα επιστρέφει πάντα 200 ΟΚ. Ευτυχώς, όταν δημιουργείτε έναν πόρο, θα πρέπει να δώσετε το 201 Created. Αλλά και πάλι, όσον αφορά την απλοποίηση, θα απορρίψουμε αυτές τις λεπτές αποχρώσεις, αλλά σε ένα πραγματικό έργο μπορείτε εύκολα να τις εφαρμόσετε μόνοι σας.

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

POST /εμπορεύματα

Προσθήκη νέου προϊόντος

// Προσθήκη νέου προϊόντος // POST /goods if ($method === "POST" && κενό($urlData)) ( // Προσθήκη προϊόντος στη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode (array("method" => "POST", "id" => rand(1, 100), "formData" => $formData));

Το urlData είναι τώρα κενό, αλλά χρησιμοποιείται το formData - απλώς θα το εμφανίσουμε στον πελάτη.

Πώς να το κάνουμε "σωστά";
Σύμφωνα με τους κανόνες του REST, σε ένα αίτημα ανάρτησης θα πρέπει να επιστρέψετε μόνο το αναγνωριστικό της οντότητας που δημιουργήθηκε ή το url με το οποίο μπορεί να ληφθεί αυτή η οντότητα. Δηλαδή, η απάντηση θα είναι είτε απλώς ένας αριθμός - (καλή ταυτότητα), ή /goods/(goodId).
Γιατί έγραψα "σωστά" σε εισαγωγικά; Ναι, γιατί το REST δεν είναι ένα σύνολο αυστηρών κανόνων, αλλά συστάσεις. Και το πώς θα το εφαρμόσετε εξαρτάται από τις προτιμήσεις σας ή από τις ήδη αποδεκτές συμφωνίες για ένα συγκεκριμένο έργο.
Απλώς έχετε κατά νου ότι ένας άλλος προγραμματιστής που διαβάζει τον κώδικα και γνωρίζει την προσέγγιση REST θα περιμένει στην απάντηση σε ένα αίτημα ανάρτησης το αναγνωριστικό του δημιουργημένου αντικειμένου ή ένα url από το οποίο μπορούν να ανακτηθούν δεδομένα σχετικά με αυτό το αντικείμενο με ένα αίτημα λήψης.

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/goods/", μέθοδος: "POST", δεδομένα: (καλό: "notebook", τιμή: 20000), dataType: "json", επιτυχία: function(response)( console.log("response:", απάντηση))))

Curl -X POST https://site/examples/rest/goods/ --data "good=notebook&price=20000" -i

PUT /goods/(goodId)

Επεξεργασία προϊόντος

// Ενημέρωση όλων των δεδομένων προϊόντος // PUT /goods/(goodId) if ($method === "PUT" && count($urlData) === 1) ( // Λήψη του αναγνωριστικού προϊόντος $goodId = $urlData; / / Ενημέρωση όλων των πεδίων προϊόντων στη βάση δεδομένων... // Εξαγωγή της απόκρισης στον πελάτη echo json_encode(array("method" => "PUT", "id" => $goodId, "formData" => $formData)) ;

Εδώ όλα τα δεδομένα έχουν ήδη χρησιμοποιηθεί στο έπακρο. Το αναγνωριστικό προϊόντος εξάγεται από το urlData και οι ιδιότητες εξάγονται από το formData.

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/goods/15", μέθοδος: "PUT", δεδομένα: (καλό: "notebook", τιμή: 20000), dataType: "json", επιτυχία: function(response) (console.log("response:", απάντηση))))

Curl -X PUT https://site/examples/rest/goods/15 --data "good=notebook&price=20000" -i

PATCH /goods/(goodId)

Μερική ενημέρωση προϊόντος

// Μερική ενημέρωση των δεδομένων προϊόντος // PATCH /goods/(goodId) if ($method === "PATCH" && count($urlData) === 1) ( // Λήψη του αναγνωριστικού προϊόντος $goodId = $urlData; // Ενημερώνουμε μόνο τα καθορισμένα πεδία προϊόντων στη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode(array("method" => "PATCH", "id" => $goodId, "formData" => $formData));

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/goods/15", μέθοδος: "PATCH", δεδομένα: (τιμή: 25000), dataType: "json", επιτυχία: function(response)(console.log(" απάντηση:", απάντηση))))

Curl -X PATCH https://site/examples/rest/goods/15 --data "price=25000" -i

Γιατί όλη αυτή η επίδειξη με PUT και PATCH;
Δεν είναι αρκετό ένα ΠΟΥ; Δεν εκτελούν την ίδια ενέργεια - ενημέρωση των δεδομένων του αντικειμένου;
Αυτό είναι σωστό - εξωτερικά η δράση είναι μία. Η διαφορά είναι στα μεταδιδόμενα δεδομένα.
Το PUT υποθέτει ότι Ολαπεδία αντικειμένου και PATCH - μόνο άλλαξε. Αυτά που αποστέλλονται στο σώμα αιτήματος. Σημειώστε ότι στο προηγούμενο PUT περάσαμε και το όνομα του προϊόντος και την τιμή. Και σε PATCH - μόνο η τιμή. Δηλαδή, στείλαμε μόνο αλλαγμένα δεδομένα στον διακομιστή.
Εάν χρειάζεστε PATCH - αποφασίστε μόνοι σας. Αλλά θυμηθείτε αυτόν τον προγραμματιστή ανάγνωσης κώδικα που ανέφερα παραπάνω.

ΔΙΑΓΡΑΦΗ /goods/(goodId)

Αφαίρεση προϊόντος

// Διαγραφή προϊόντος // DELETE /goods/(goodId) if ($method === "DELETE" && count($urlData) === 1) ( // Λήψη του αναγνωριστικού προϊόντος $goodId = $urlData; // Διαγραφή του προϊόντος από τη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode(array("method" => "DELETE", "id" => $goodId));

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/goods/20", μέθοδος: "DELETE", dataType: "json", επιτυχία: function(response)(console.log("response:", απάντηση))) )

Curl -X DELETE https://site/examples/rest/goods/20 -i

Όλα είναι ξεκάθαρα με το αίτημα ΔΙΑΓΡΑΦΗ. Τώρα ας δούμε τη συνεργασία με τους χρήστες - τον δρομολογητή χρηστών και, κατά συνέπεια, το αρχείο users.php

GET /users/(userId)

Ανάκτηση όλων των δεδομένων χρήστη. Εάν το αίτημα GET είναι σαν /users/(userId), τότε θα επιστρέψουμε όλες τις πληροφορίες σχετικά με τον χρήστη, εάν διευκρινιστεί επιπλέον /πληροφορίεςή /παραγγελίες, τότε, κατά συνέπεια, μόνο γενικές πληροφορίες ή κατάλογος παραγγελιών.

// Διαδρομή συνάρτησης δρομολογητή($method, $urlData, $formData) ( // Λήψη όλων των πληροφοριών σχετικά με τον χρήστη // GET /users/(userId) if ($method === "GET" && count($urlData) = = = 1) ( // Λήψη του αναγνωριστικού προϊόντος $userId = $urlData; // Εξαγωγή όλων των δεδομένων σχετικά με τον χρήστη από τη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode(array("method" => " GET", "id" = > $userId, "info" => πίνακας("email" => " [email προστατευμένο]", "name" => "Webdevkin"), "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array (" orderId" => 8, "summa" => 5000, "orderDate" => "02/03/2017"))) // Επιστροφή της κεφαλίδας σφάλματος ("HTTP/1.0 400 Bad Request"); echo json_encode( array("error" => "Bad Request"));

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/users/5", μέθοδος: "GET", dataType: "json", επιτυχία: function(response)(console.log("response:", απάντηση))) )

Curl -X GET https://site/examples/rest/users/5 -i

GET /users/(userId)/info

Γενικές πληροφορίες για τον χρήστη

// Λήψη γενικών πληροφοριών για τον χρήστη // GET /users/(userId)/info if ($method === "GET" && count($urlData) === 2 && $urlData === "πληροφορίες") ( / / Λήψη του αναγνωριστικού προϊόντος $userId = $urlData // Εξαγωγή γενικών δεδομένων για τον χρήστη από τη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode(array("method" => "GET", "id; " => $userId, " info" => πίνακας("email" => " [email προστατευμένο]", "όνομα" => "Webdevkin"))); επιστροφή;)

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/users/5/info", μέθοδος: "GET", dataType: "json", επιτυχία: function(response)(console.log("response:", απάντηση) )))

Curl -X GET https://site/examples/rest/users/5/info -i

GET /users/(userId)/παραγγελίες

Λήψη λίστας παραγγελιών χρηστών

// Λήψη παραγγελιών χρήστη // GET /users/(userId)/παραγγελίες εάν ($method === "GET" && count($urlData) === 2 && $urlData === "παραγγελίες") ( // Λήψη αναγνωριστικό προϊόντος $userId = $urlData // Ανάκτηση δεδομένων σχετικά με τις παραγγελίες του χρήστη από τη βάση δεδομένων... // Εξαγωγή της απάντησης στον πελάτη echo json_encode(array("method" => "GET", "id" => $; userId, "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array("orderId" => 8, "summa " => 5000, "orderDate " => "02/03/2017")))); επιστροφή; )

Δοκιμή από την κονσόλα

$.ajax((url: "/examples/rest/users/5/orders", μέθοδος: "GET", dataType: "json", επιτυχία: function(response)(console.log("response:", απάντηση) )))

Curl -X GET https://site/examples/rest/users/5/orders -i

Αποτελέσματα και πηγές

Πηγές από παραδείγματα άρθρων -

Όπως μπορείτε να δείτε, η οργάνωση υποστήριξης REST API σε εγγενή php αποδείχθηκε ότι δεν ήταν τόσο δύσκολη και με εντελώς νόμιμους τρόπους. Το κύριο πράγμα είναι η υποστήριξη για διαδρομές και μη τυπικές μεθόδους PHP PUT, PATCH και DELETE.

Ο κύριος κώδικας που υλοποιεί αυτήν την υποστήριξη χωράει σε 3 δωδεκάδες γραμμές του index.php. Τα υπόλοιπα είναι απλώς ένα λουρί που μπορεί να εφαρμοστεί με όποιον τρόπο θέλετε. Πρότεινα να το κάνετε αυτό με τη μορφή plug-in αρχείων δρομολογητή, τα ονόματα των οποίων ταιριάζουν με τις οντότητες του έργου σας. Μπορείτε όμως να χρησιμοποιήσετε τη φαντασία σας και να βρείτε μια πιο ενδιαφέρουσα λύση.

Λαμβάνει ένα αντικείμενο WP_User που περιέχει όλα τα δεδομένα του καθορισμένου χρήστη.

Τα δεδομένα που επιστρέφουν οι συναρτήσεις αντιστοιχούν πλήρως στα πεδία των πινάκων της βάσης δεδομένων: wp_users και wp_usermeta (περιγραφή πίνακα).

Αυτή είναι μια δυνατότητα σύνδεσης - δηλ. μπορεί να αντικατασταθεί από το πρόσθετο. Αυτό σημαίνει ότι θα λειτουργήσει (σύνδεση) μόνο αφού συνδεθούν όλα τα πρόσθετα και μέχρι αυτό το σημείο η συνάρτηση δεν έχει ακόμη καθοριστεί... Επομένως, δεν μπορείτε να καλέσετε αυτό και τις λειτουργίες που εξαρτώνται από αυτό απευθείας από τον κωδικό του πρόσθετου. Πρέπει να καλούνται μέσω του plugins_loaded hook ή νεότερο, όπως το init hook.

Αντικατάσταση συνάρτησης (παράκαμψη) - στο πρόσθετο μπορείτε να δημιουργήσετε μια συνάρτηση με το ίδιο όνομα και, στη συνέχεια, θα αντικαταστήσει την τρέχουσα λειτουργία.

✈ 1 φορά = 0,000296s = γρήγορα| 50000 φορές = 0,78 δευτ. = πολύ γρήγορα| PHP 7.1.2RC1, WP 4.7.2

Δεν υπάρχουν γάντζοι.

Επιστροφές

WP_User/false. Αντικείμενο δεδομένων ή ψευδές εάν δεν ήταν δυνατός ο εντοπισμός του καθορισμένου χρήστη.

Χρήση

get_userdata($userid); $userid (αριθμός) (απαιτείται)Αναγνωριστικό του χρήστη του οποίου τα δεδομένα θέλετε να ανακτήσετε.
Προεπιλογή: όχι

Παραδείγματα

#1 Πώς να εξάγετε δεδομένα από ένα ληφθέν αντικείμενο δεδομένων

$user_info = get_userdata(1); echo "Όνομα χρήστη: " . $user_info->user_login . "\n"; echo "Επίπεδο πρόσβασης: " . $user_info->user_level . "\n"; echo "ID: " . $user_info->ID . "\n"; /* Έξοδοι: Όνομα χρήστη: διαχειριστής Επίπεδο πρόσβασης: 10 Αναγνωριστικό: 1 */

#1.2 Δεδομένα σε μια μεταβλητή

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

$user = get_userdata(1); $username = $user->user_login; $first_name = $user->first_name; $last_name = $user->last_name; echo "$first_name Ο $last_name επισκέφτηκε τον ιστότοπο κάτω από το login: $username."; /* Αντικείμενο $user: WP_User Object( => stdClass Object( => 80 => kogian => $P$BJFHKJfUKyWv1TwLOVAENYU0JGNsq. => kogian => [email προστατευμένο]=> http://example.com/ => 2016-09-01 00:34:42 => => => kogian) => 80 => Array( => 1) => wp_capabilities => Array( => συνδρομητής) => Πίνακας ( => 1 => 1 => 1) => => 1) */

#2 Μέθοδοι τάξης

Το αντικείμενο που λαμβάνεται από την get_userdata() είναι μια παρουσία της κλάσης και έχει μεθόδους που μπορούν να χρησιμοποιηθούν. Μερικές φορές αυτό μπορεί να φανεί χρήσιμο. Ακολουθεί ένα απλό παράδειγμα λήψης μιας επιλογής χρήστη χρησιμοποιώντας τη μέθοδο $user->get():

$user = get_userdata(1); echo $username = $user->get("user_login");

Λίστα ορισμένων μεθόδων:

    get($key) - επιστρέφει την τιμή της επιλογής.

    has_prop($key) - ελέγχει εάν η καθορισμένη επιλογή είναι εγκατεστημένη.

    has_cap($cap) - ελέγχει εάν ο χρήστης έχει την καθορισμένη ικανότητα ή ρόλο.

    get_role_caps() - Λαμβάνει όλες τις δυνατότητες του ρόλου του χρήστη και τις συνδυάζει με τις μεμονωμένες δυνατότητες του χρήστη.

    add_role($role) - προσθέτει έναν ρόλο στο χρήστη.

    remove_role($role) - αφαιρεί έναν ρόλο από έναν χρήστη.

  • set_role($role) - ορίζει το ρόλο του χρήστη.

Σημειώσεις

Ακολουθούν ορισμένες χρήσιμες τιμές πεδίων πίνακα wp_users και wp_usermeta που μπορείτε να χρησιμοποιήσετε για να ανακτήσετε δεδομένα:

  • όνομα_εμφάνισης

user_meta

  • user_description

    wp_capabilities (πίνακας)

    admin_color (θέμα πίνακα διαχειριστή. Προεπιλογή - φρέσκο)

    κλειστές ταχυδρομικές θυρίδες_σελίδα

  • source_domain

Θα πρέπει επίσης να σημειωθεί ότι από την έκδοση 3.2, τα δεδομένα που επιστράφηκαν έχουν αλλάξει ελαφρώς: το αντικείμενο WP_User επιστρέφεται. Τα δεδομένα στο αντικείμενο χωρίζονται σε ομάδες: δεδομένα, κεφαλαία, ρόλοι (προηγουμένως τα δεδομένα επιστρέφονταν σε μια γενική λίστα).

Ωστόσο, χάρη στις "μαγικές" (χρηστικές) μεθόδους της PHP, τα δεδομένα μπορούν να ληφθούν όπως πριν, για παράδειγμα, τώρα τα δεδομένα αποθηκεύονται ως εξής: get_userdata(1)->data->rich_editing , αλλά μπορείτε να τα λάβετε όπως this: get_userdata(1)->rich_editing , παρόλο που η var_dump() δεν θα εμφανίζει αυτή τη σχέση.

Κώδικας λήψη δεδομένων χρήστη: wp-includes/pluggable.php WP 5.2.2

document.write("");
mob_info