Ein einfacher RESTful-Dienst in nativem PHP. $_SERVER – Informationen über den Server und die Ausführungsumgebung Was unser RESTful-Dienst können sollte

Die Möglichkeiten, Informationen effektiv zu organisieren, zu suchen und zu verteilen, sind seit langem für Spezialisten auf dem Gebiet der Computertechnologie von Interesse. Da es sich bei Informationen hauptsächlich um Text handelt, der aus alphanumerischen Zeichen besteht, ist die Entwicklung von Mitteln zum Suchen und Verarbeiten von Informationen anhand von Mustern, die Text beschreiben, zum Gegenstand ernsthafter theoretischer Forschung geworden.

Mit der Mustersuche können Sie nicht nur bestimmte Textfragmente finden, sondern diese auch durch andere Fragmente ersetzen. Ein Standardbeispiel für den Mustervergleich sind die Such-/Ersetzungsbefehle in Texteditoren – zum Beispiel MS Word, Emacs und meinem Lieblingseditor vi. Alle UNIX-Benutzer sind mit Programmen wie sed, awk und grep vertraut; Der Funktionsreichtum dieser Programme beruht größtenteils auf ihren Mustersuchfunktionen. Mustersuchmechanismen lösen vier Hauptprobleme:

  • nach Zeichenfolgen suchen, die genau einem bestimmten Muster entsprechen;
  • Suche nach String-Fragmenten, die einem bestimmten Muster entsprechen;
  • Ersetzen von Zeichenfolgen und Teilzeichenfolgen mithilfe eines Musters;
  • Suche nach Zeichenfolgen mit einem bestimmten Muster stimmt nicht überein.

Das Aufkommen des Webs hat einen Bedarf an schnelleren und effizienteren Datensuchtools geschaffen, die es Benutzern auf der ganzen Welt ermöglichen, die benötigten Informationen auf Milliarden von Webseiten zu finden. Suchmaschinen, Online-Finanzdienstleistungen und E-Commerce-Websites wären ohne die Möglichkeit, die enormen Datenmengen in diesen Sektoren zu analysieren, völlig nutzlos. Tatsächlich sind String-Inein wesentlicher Bestandteil fast aller Sektoren, die auf die eine oder andere Weise mit modernen Informationstechnologien verbunden sind. Dieses Kapitel konzentriert sich auf die Möglichkeiten zur String-Verarbeitung in PHP. Wir werden uns einige Standard-String-Funktionen ansehen (es gibt mehr als 60 davon in der Sprache!), und die bereitgestellten Definitionen und Beispiele geben Ihnen die Informationen, die Sie zum Erstellen von Webanwendungen benötigen. Doch bevor wir auf die Besonderheiten von PHP eingehen, möchte ich Ihnen den grundlegenden Mechanismus vorstellen, der die Mustersuche ermöglicht. Wir sprechen über reguläre Ausdrücke.

Reguläre Ausdrücke

Reguläre Ausdrücke sind die Grundlage aller modernen Mustervergleichstechnologien. Ein regulärer Ausdruck ist eine Folge einfacher Zeichen und Dienstzeichen, die den gesuchten Text beschreiben. Manchmal sind reguläre Ausdrücke einfach und klar (zum Beispiel das Wort Hund), aber oft enthalten sie Sonderzeichen, die in der Syntax regulärer Ausdrücke eine besondere Bedeutung haben – zum Beispiel<(?)>.*<\/.?>.

In PHP gibt es zwei Familien von Funktionen, von denen jede eine andere Art von regulärem Ausdruck darstellt: POSIX-Stil oder Perl-Stil. Jeder Typ regulärer Ausdrücke hat seine eigene Syntax und wird im entsprechenden Teil des Kapitels erläutert. Zu diesem Thema wurden zahlreiche Lehrbücher verfasst, die sowohl im Internet als auch im Buchhandel erhältlich sind. Daher werde ich nur grundlegende Informationen zu jedem Typ bereitstellen. Weitere Informationen können Sie auf Wunsch auch selbst finden. Wenn Sie noch nicht mit der Funktionsweise regulärer Ausdrücke vertraut sind, lesen Sie unbedingt das kurze Einführungs-Tutorial, das den Rest dieses Abschnitts einnimmt. Und wenn Sie sich auf diesem Gebiet gut auskennen, können Sie gerne mit dem nächsten Abschnitt fortfahren.

Syntax für reguläre Ausdrücke (POSIX)

Der Aufbau regulärer POSIX-Ausdrücke erinnert ein wenig an den Aufbau typischer mathematischer Ausdrücke – verschiedene Elemente (Operatoren) werden miteinander kombiniert, um komplexere Ausdrücke zu bilden. Es ist jedoch der Sinn, Elemente zu kombinieren, der reguläre Ausdrücke zu einem so leistungsstarken und ausdrucksstarken Werkzeug macht. Die Funktionen beschränken sich nicht auf die Suche nach wörtlichem Text (z. B. einem bestimmten Wort oder einer bestimmten Zahl). Sie können nach Zeichenfolgen mit unterschiedlicher Semantik, aber ähnlicher Syntax suchen, beispielsweise nach allen HTML-Tags in einer Datei.

Der einfachste reguläre Ausdruck entspricht einem einzelnen Literalzeichen – der Ausdruck g beispielsweise entspricht Zeichenfolgen wie g , feilschen und sacken. Ein Ausdruck, der aus der Verkettung mehrerer Literalzeichen resultiert, entspricht denselben Regeln – beispielsweise stimmt die Sequenz gan in jeder Zeichenfolge überein, die diese Zeichen enthält (z. B. gang, organize oder Reagan).

Betreiber | (vertikaler Balken) testet, ob eine von mehreren Alternativen passt. Zum Beispiel der reguläre Ausdruck php | Zend prüft den String auf PHP oder Zend.

Eckige Klammern

Eckige Klammern () haben im Zusammenhang mit regulären Ausdrücken eine besondere Bedeutung – sie bedeuten „jedes in den Klammern aufgeführte Zeichen“. Im Gegensatz zu einem regulären PHP-Ausdruck, der auf alle Zeilen zutrifft, die PHP-Literaltext enthalten, trifft der Ausdruck auf jede Zeile zu, die die Zeichen p oder h enthält. Bei der Arbeit mit regulären Ausdrücken spielen eckige Klammern eine wichtige Rolle, da es bei der Suche häufig darum geht, Zeichen aus einem bestimmten Intervall zu finden. Nachfolgend sind einige häufig verwendete Intervalle aufgeführt:

  • – entspricht einer beliebigen Dezimalziffer von 0 bis 9;
  • – entspricht jedem Kleinbuchstaben von a bis z;
  • – entspricht jedem Großbuchstaben von A bis Z;
  • – entspricht allen Klein- und Großbuchstaben von a bis z.

Natürlich veranschaulichen die oben aufgeführten Intervalle lediglich das allgemeine Prinzip. Beispielsweise können Sie den Abstand verwenden, um eine beliebige Dezimalziffer von 0 bis 3 darzustellen, oder den Abstand, um ein beliebiges Kleinbuchstabe von b bis v darzustellen. Kurz gesagt, die Intervalle werden völlig willkürlich bestimmt.

Quantifizierer

Es gibt eine spezielle Klasse von Dienstzeichen, die die Anzahl der Wiederholungen eines einzelnen Zeichens oder Konstrukts in eckigen Klammern angeben. Diese Sonderzeichen (+, * und (...)) werden aufgerufen Quantoren. Das Funktionsprinzip lässt sich am einfachsten anhand von Beispielen erklären:

  • p+ bedeutet ein oder mehrere p Zeichen hintereinander;
  • p* bedeutet null oder mehr p Zeichen in einer Zeile;
  • R? bedeutet null oder ein Zeichen p;
  • p(2) bedeutet zwei p Zeichen hintereinander;
  • p(2,3) bedeutet zwei bis drei p Zeichen hintereinander;
  • p(2,) bedeutet zwei oder mehr p Zeichen hintereinander.

Andere Dienstzeichen

Die Dienstzeichen $ und ^ stimmen nicht mit Symbolen überein, sondern mit bestimmten Positionen in der Zeichenfolge. Beispielsweise bedeutet der Ausdruck p$ eine Zeichenfolge, die mit dem Zeichen p endet, und der Ausdruck ^p bedeutet eine Zeichenfolge, die mit dem Zeichen p beginnt.

  • Die Konstruktion [^a-zA-Z] passt zu jedem Zeichen nicht enthalten in den angegebenen Abständen (a-z und A-Z).
  • Servicesymbol. (Punkt) bedeutet „beliebiges Zeichen“. Beispielsweise entspricht der Ausdruck p.p dem Zeichen p, gefolgt von einem beliebigen Zeichen, gefolgt vom Zeichen p erneut.

Das Kombinieren von Servicesymbolen führt zu komplexeren Ausdrücken. Schauen wir uns ein paar Beispiele an:

  • ^.(2)$ – jede Zeichenfolge, die enthält glatt zwei Zeichen;
  • (.*)– eine beliebige Zeichenfolge dazwischen<Ь>Und(wahrscheinlich HTML-Tags zur Darstellung von fettem Text);
  • p(hp)* – das Zeichen p, gefolgt von null oder mehr Instanzen der Sequenz hp (z. B. phphphp).

Manchmal müssen Sie Sonderzeichen in Zeichenfolgen finden, anstatt sie im beschriebenen speziellen Kontext zu verwenden. Dazu werden Dienstzeichen mit einem Backslash (\) maskiert. Um beispielsweise nach einem Geldbetrag in Dollar zu suchen, können Sie den Ausdruck \$+ verwenden, also „ein Dollarzeichen gefolgt von einer oder mehreren Dezimalstellen“. Beachten Sie den Backslash vor dem $. Mögliche Übereinstimmungen für diesen regulären Ausdruck sind $42, $560 und $3.

Standardintervallausdrücke (Zeichenklassen)

Zur Vereinfachung der Programmierung hat der POSIX-Standard einige Standardintervallausdrücke definiert, die auch „Intervallausdrücke“ genannt werden Charakterklassen(Charakterklassen). Eine Zeichenklasse definiert ein Zeichen aus einem bestimmten Bereich – zum Beispiel einen Buchstaben des Alphabets oder eine Zahl:

  • [[:alpha:]] – alphabetisches Zeichen (aA-zZ);
  • [[:digit:]]-Ziffer (0-9);
  • [[:alnum:]] – alphabetisches Zeichen (aA-zZ) oder Zahl (0-9);
  • [[:space:]] – Leerzeichen (Zeilenumbrüche, Tabulatoren usw.).

PHP-Funktionen zum Arbeiten mit regulären Ausdrücken (POSIX-konform)

PHP unterstützt derzeit sieben Suchfunktionen mit regulären Ausdrücken im POSIX-Stil:

  • ereg();
  • ereg_replace();
  • eregi();
  • eregi_replace();
  • Teilt();
  • Teilt();
  • sql_regcase().

Beschreibungen dieser Funktionen finden Sie in den folgenden Abschnitten.

Die Funktion ereg() durchsucht eine bestimmte Zeichenfolge nach einer Übereinstimmung mit einem Muster. Wenn eine Übereinstimmung gefunden wird, wird TRUE zurückgegeben, andernfalls wird FALSE zurückgegeben. Die Syntax der Funktion ereg() lautet:

int ereg (String-Muster, String-String [, Array-Übereinstimmungen])

Die Suche erfolgt unter Berücksichtigung der Groß-/Kleinschreibung alphabetischer Zeichen. Ein Beispiel für die Verwendung von ereg() zur Suche in domains.com-Strings:

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

// Funktion gibt TRUE zurück, wenn $email mit „.com“-Zeichen endet

// Insbesondere nach Zeichenfolgen ist die Suche erfolgreich

// „www.wjgilmore.com“ und „ [email protected]"

Beachten Sie, dass der reguläre Ausdruck aufgrund des Vorhandenseins des $-Symbols nur dann übereinstimmt, wenn die Zeichenfolge mit .com-Zeichen endet. Es entspricht beispielsweise der Zeichenfolge „www.apress.com“, aber wird nicht passen in der Zeile „www.apress.com/catalog“.

Der optionale Parameter „match“ enthält ein Array von Übereinstimmungen für alle Unterausdrücke, die im regulären Ausdruck in Klammern eingeschlossen sind. Listing 8.1 zeigt, wie Sie mit diesem Array eine URL in mehrere Segmente aufteilen.

Auflistung 8.1. Druckt Elemente des $regs-Arrays

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

// $url in drei Komponenten aufteilen: „http://www“. „apress“ und „com“

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

if ($www_url) : // Wenn $www_url eine URL enthält

echo $regs; // Die gesamte Zeichenfolge „http://www.apress.com“

drucken "
";

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

drucken "
";

echo $regs; // „apress“

drucken "
";

echo $regs; // „com“ endif;

Das Ausführen des Skripts in Listing 8.1 erzeugt die folgende Ausgabe:

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

Die Funktion ereg_replace() durchsucht eine bestimmte Zeichenfolge nach einer Übereinstimmung mit einem Muster und ersetzt sie durch ein neues Fragment. Syntax der Funktion ereg_replace():

string ereg_replace (String-Muster, String-Ersetzung, String-String)

Die Funktion ereg_replace() funktioniert nach dem gleichen Prinzip wie ereg(), ihre Fähigkeiten werden jedoch von der einfachen Suche auf die Suche mit Ersetzung erweitert. Nach der Ersetzung gibt die Funktion die geänderte Zeichenfolge zurück. Wenn Übereinstimmungen

fehlen, bleibt die Leitung im gleichen Zustand. Bei der Funktion ereg_replace() wird wie bei ereg() zwischen Groß- und Kleinschreibung unterschieden. Nachfolgend finden Sie ein einfaches Beispiel, das die Verwendung dieser Funktion demonstriert:

$copy_date = "Copyright 1999":

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

print $copy_date: // Druckt die Zeichenfolge „Copyright 2000“

Eine interessante Funktion der Such- und Ersetzungstools von PHP ist die Möglichkeit, Rückverweise auf in Klammern eingeschlossene Teile des Hauptausdrucks zu verwenden. Rückverweise ähneln den Elementen des optionalen Match-Array-Parameters von ereg(), mit einer Ausnahme: Rückverweise werden als \0, \1, \2 usw. geschrieben, wobei \0 auf die gesamte Zeichenfolge und \1 auf einen erfolgreichen Wert übereinstimmt Übereinstimmung mit dem ersten Unterausdruck usw. Der Ausdruck kann bis zu 9 Backlinks enthalten. Das folgende Beispiel ersetzt alle URL-Links im Text durch funktionierende Hyperlinks:

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

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

// Die Zeile wird angezeigt:

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

Die Funktion eregi() durchsucht eine bestimmte Zeichenfolge nach einer Übereinstimmung mit einem Muster. Syntax der eregi()-Funktion:

int eregi (String-Muster, String-String [, Array-Übereinstimmungen])

Die Suche ist im Gange ausschließlich Fall von alphabetischen Zeichen. Die Funktion eregi() ist besonders nützlich, um die Gültigkeit eingegebener Zeichenfolgen (z. B. Passwörter) zu überprüfen. Die Verwendung der Funktion eregi() wird im folgenden Beispiel demonstriert:

$password = "abc";

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

print „Ungültiges Passwort! Passwörter müssen zwischen 8 und 10 Zeichen lang sein.“;

// Als Ergebnis der Ausführung dieses Fragments wird eine Fehlermeldung angezeigt.

// weil die Länge der Zeichenfolge „abc“ nicht innerhalb des zulässigen Intervalls liegt

// von 8 bis 10 Zeichen.

Die Funktion eregi_replace() funktioniert genauso wie ereg_replace(), mit einer Ausnahme: Bei der Suche wird die Groß-/Kleinschreibung nicht beachtet. Syntax der Funktion ereg_replace():

string eregi_replace (String-Vorlage, String-Ersetzung, String-String)

Die Funktion split() teilt einen String in Elemente auf, deren Grenzen durch ein vorgegebenes Muster bestimmt werden. Die Syntax der Funktion split() lautet:

Array-Aufteilung (String-Muster, String-String [, int-Schwellenwert])

Der optionale Schwellenwertparameter gibt die maximale Anzahl von Elementen an, in die die Zeichenfolge von links nach rechts unterteilt wird. Wenn das Muster alphabetische Zeichen enthält, berücksichtigt die Funktion spl it() die Groß-/Kleinschreibung. Das folgende Beispiel zeigt die Verwendung der Funktion split() zum Aufteilen einer kanonischen IP-Adresse in Triplets:

$ip = "123.345.789.000"; // Kanonische IP-Adresse

$iparr = split ("\.", $ip) // Weil der Punkt ein Dienstzeichen ist.

// es muss maskiert werden.

print „$iparr
"; // Gibt „123“ aus

print „$iparr
"; // Gibt „456“ aus

print „$iparr
"; // Gibt „789“ aus

print „$iparr
"; // Gibt „000“ aus

Die Funktion spliti() funktioniert genau wie ihr Prototyp split(), mit einer Ausnahme: it nicht berücksichtigt Zeichenregister. Die Syntax der Funktion spliti() lautet:

Array-Spliti (String-Muster, String-String [, int-Schwellenwert])

Die Groß-/Kleinschreibung ist natürlich nur dann wichtig, wenn das Muster alphabetische Zeichen enthält. Für andere Zeichen ist die Ausführung von spliti() genau das Gleiche wie split().

Die Hilfsfunktion sql_regcase() schließt jedes Zeichen in der Eingabezeichenfolge in eckige Klammern ein und hängt das passende Zeichen daran an. Syntax der Funktion sql_regcase():

string sql_regcase (string string)

Wenn ein alphabetisches Zeichen in zwei Varianten existiert (Groß- und Kleinschreibung), enthält der Ausdruck in eckigen Klammern beide Varianten; andernfalls wird das ursprüngliche Zeichen zweimal wiederholt. Die Funktion sql_regcase() ist besonders nützlich, wenn PHP mit Softwarepaketen verwendet wird, die reguläre Ausdrücke in Einzelbuchstaben unterstützen. Ein Beispiel für die Konvertierung einer Zeichenfolge mit der Funktion sql_regcase():

$version = "php 4.0";

print sql_regcase($version);

// Zeigt die Zeichenfolge [..] an

Syntax für reguläre Ausdrücke im Perl-Stil

Konvertieren einer Zeichenfolge in Groß- und Kleinschreibung

In PHP gibt es vier Funktionen, mit denen die Groß-/Kleinschreibung einer Zeichenfolge geändert werden kann:

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

Alle diese Funktionen werden im Folgenden ausführlich beschrieben.

strtolower()

Die Funktion strtolower() wandelt alle alphabetischen Zeichen in einer Zeichenfolge in Kleinbuchstaben um. Die Syntax der Funktion strtolower() lautet:

string strtolower(string string)

Nicht-alphabetische Zeichen werden durch die Funktion nicht verändert. Das Konvertieren einer Zeichenfolge in Kleinbuchstaben mithilfe der Funktion strtolower() wird im folgenden Beispiel demonstriert:

$satz = strtolower($satz);

// „Kochen und PHP programmieren sind meine beiden Lieblingsbeschäftigungen!“

Zeichenfolgen können nicht nur in Kleinbuchstaben, sondern auch in Großbuchstaben umgewandelt werden. Die Konvertierung erfolgt durch die Funktion strtoupper(), die folgende Syntax hat:

string strtoupper (string string)

Nicht-alphabetische Zeichen werden durch die Funktion nicht verändert. Das Konvertieren einer Zeichenfolge in Großbuchstaben mit strtoupper() wird im folgenden Beispiel demonstriert:

$sentence = "Kochen und PHP programmieren sind meine beiden Lieblingsbeschäftigungen!";

$satz = strtoupper($satz);

// Nach Aufruf der Funktion enthält $sentence den String

// „KOCHEN UND PHP PROGRAMMIEREN SIND MEINE BEIDEN LIEBLINGSBEHÄLTNISSE!“

Die Funktion ucfirst() wandelt das erste Zeichen einer Zeichenfolge in Großbuchstaben um, sofern es sich um ein alphabetisches Zeichen handelt. Syntax der Funktion ucfirst():

string ucfirst (string string)

Nicht-alphabetische Zeichen werden durch die Funktion nicht verändert. Die Konvertierung des ersten Zeichens eines Strings durch die Funktion ucfirst() wird im folgenden Beispiel demonstriert:

&sentence = "Kochen und PHP programmieren sind meine beiden Lieblingsbeschäftigungen!";

$satz = ucfirst($satz);

// Nach Aufruf der Funktion enthält $sentence den String

// „Kochen und PHP programmieren sind meine beiden Lieblingsbeschäftigungen!“

Die Funktion ucwords() wandelt den ersten Buchstaben jedes Wortes in einer Zeichenfolge in Großbuchstaben um. Syntax der Funktion ucwords():

string ucwords (string string")

Nicht-alphabetische Zeichen werden durch die Funktion nicht verändert. Ein „Wort“ ist definiert als eine Folge von Zeichen, die durch Leerzeichen von anderen Zeichenfolgeelementen getrennt sind. Das folgende Beispiel zeigt, wie die Funktion ucwords() die ersten Zeichen von Wörtern umwandelt:

$sentence = "Kochen und PHP programmieren sind meine beiden Lieblingsbeschäftigungen!";

$satz = ucwords($satz);

// Nach Aufruf der Funktion enthält $sentence den String

// „Kochen und PHP programmieren sind meine beiden Lieblingsbeschäftigungen!“

Projekt: Browser-Identifikation

Jeder Programmierer, der eine benutzerfreundliche Website erstellen möchte, muss Unterschiede in der Seitenformatierung berücksichtigen, wenn er die Website in verschiedenen Browsern und Betriebssystemen betrachtet. Obwohl das W3-Konsortium (http://www.w3.org) weiterhin Standards veröffentlicht, die Programmierer beim Erstellen von Webanwendungen einhalten müssen, fügen Browserentwickler diesen Standards gerne ihre eigenen kleinen „Verbesserungen“ hinzu, was letztendlich zu Chaos und Verwirrung führt . Entwickler lösen dieses Problem oft, indem sie für jeden Browsertyp und jedes Betriebssystem unterschiedliche Seiten erstellen. Dies erhöht den Arbeitsaufwand erheblich, aber die resultierende Website ist für jeden Benutzer ideal. Das Ergebnis ist ein guter Ruf der Website und die Gewissheit, dass der Benutzer sie erneut besucht.

Damit der Benutzer die Seite in einem Format anzeigen kann, das für seinen Browser und sein Betriebssystem geeignet ist, werden Informationen über den Browser und die Plattform aus der eingehenden Seitenanfrage extrahiert. Nach Erhalt der notwendigen Daten wird der Nutzer auf die gewünschte Seite weitergeleitet.

Das folgende Projekt (sniffer.php) zeigt, wie PHP-Funktionen verwendet werden, um mit regulären Ausdrücken zu arbeiten und Informationen aus Abfragen abzurufen. Das Programm ermittelt Typ und Version des Browsers und des Betriebssystems und zeigt die empfangenen Informationen dann im Browserfenster an. Bevor ich jedoch zur eigentlichen Analyse des Programms übergehe, möchte ich eine seiner Hauptkomponenten vorstellen – die Standard-PHP-Variable $HTTP_USER_AGENT. Diese Variable speichert verschiedene Informationen über den Browser und das Betriebssystem des Benutzers im String-Format – genau das, woran wir interessiert sind. Mit nur einem Befehl lassen sich diese Informationen ganz einfach auf dem Bildschirm anzeigen:

echo $HTTP USER_AGENT;

Wenn Sie Internet Explorer 5.0 auf einem Windows 98-Computer ausführen, sieht das Ergebnis folgendermaßen aus:

Mozilla/4.0 (kompatibel; MSIE 5.0; Windows 98; DigExt)

Für Netscape Navigator 4.75 werden folgende Daten angezeigt:

Mozilla/4.75 (Win98; U)

Sniffer.php extrahiert die erforderlichen Daten aus $HTTP_USER_AGENT mithilfe von String-Verarbeitung und Funktionen für reguläre Ausdrücke. Programmalgorithmus im Pseudocode:

  • Definieren Sie zwei Funktionen zur Identifizierung des Browsers und des Betriebssystems: browser_info() und opsys_info(). Beginnen wir mit dem Pseudocode der Funktion browser_info().
  • Bestimmen Sie den Browsertyp mit der Funktion eged(). Obwohl diese Funktion langsamer ist als vereinfachte String-Funktionen wie strstr(), ist sie in diesem Fall praktischer, da Sie mit dem regulären Ausdruck die Browserversion ermitteln können.
  • Verwenden Sie das if/elseif-Konstrukt, um die folgenden Browser und ihre Versionen zu identifizieren: Internet Explorer, Opera, Netscape und einen Browser unbekannten Typs.
  • Gibt Browsertyp- und Versionsinformationen als Array zurück.
  • Die Funktion opsys_info() ermittelt den Betriebssystemtyp. Dieses Mal wird die Funktion strstr() verwendet, da der Betriebssystemtyp ohne die Verwendung regulärer Ausdrücke bestimmt wird.
  • Verwenden Sie das if/elseif-Konstrukt, um die folgenden Systeme zu identifizieren: Windows, Linux, UNIX, Macintosh und unbekanntes Betriebssystem.
  • Gibt Informationen zum Betriebssystem zurück.

Listing 8.3. Identifizieren des Browsertyps und des Client-Betriebssystems

Datei: sniffer.php

Zweck: Identifizierung von Browsertyp/-version und Plattform

// Funktion: browser_info

// Zweck: Gibt Browsertyp und -version zurück

Funktion browser_info ($agent) (

// Browsertyp bestimmen

// Nach Internet Explorer-Signatur suchen

if (ereg("MSIE (.(1,2))", $agent, $version))

$browse_type = "IE";

$browse-Version = $version;

// Suche nach Opera-Signatur

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

$browse_type = "Opera":

$browse_version = $version:

// Nach Netscape-Signatur suchen. Überprüfung des Netscape-Browsers

// *muss* nach Überprüfung von Internet Explorer und Opera erfolgen,

// weil alle diese Browser gerne den Namen melden

// Mozilla zusammen mit echtem Namen.

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

$browse_type = "Netscape";

$browse_version = $version;

// Es sei denn, es handelt sich um Internet Explorer, Opera oder Netscape.

// bedeutet, dass wir einen unbekannten Browser erkannt haben,

$browse_type = "Unbekannt";

$browse_version = "Unbekannt";

// Browsertyp und -version als Array zurückgeben

Array zurückgeben ($browse_type, $browse_version);

) // Ende der browser_info-Funktion

// Funktion: opsys_info

// Zweck: Gibt Informationen über das Betriebssystem des Benutzers zurück

Funktion opsys_info($agent) (

// Identifizieren Sie das Betriebssystem

// Nach Windows-Signatur suchen

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

$opsys = "windows";

// Nach Linux-Signatur suchen

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

$opsys = "Linux";

// Nach UNIX-Signatur suchen

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

$opsys = "Unix";

// Suchen Sie nach der Macintosh-Signatur

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

$opsys = "Macintosh";

// Unbekannte Plattform sonst:

$opsys = "Unbekannt";

// Informationen zum Betriebssystem zurückgeben

list ($browse_type. $browse_version) = browser_info ($HTTP_USER_AGENT); Soperating_sys = opsysjnfo($HTTP_USER_AGENT);

print „Browsertyp: $browse_type
";

print „Browserversion: $browse_version
";

print „Betriebssystem: $operating_sys
":

Das ist alles! Wenn der Benutzer beispielsweise den Netscape 4.75-Browser auf einem Windows-Computer verwendet, wird die folgende Ausgabe angezeigt:

Browsertyp: Netscape

Browserversion: 4.75

Betriebssystem: Windows

Im nächsten Kapitel erfahren Sie, wie Sie zwischen Seiten navigieren und sogar Stylesheets für bestimmte Betriebssysteme und Browser erstellen.

Ergebnisse

In diesem Kapitel wurde ziemlich viel Material behandelt. Was nützt eine Programmiersprache, wenn man darin nicht mit Text arbeiten kann? Wir haben folgende Themen behandelt:

  • allgemeine Informationen zu regulären Ausdrücken in POSIX- und Perl-Stilen;
  • Standard-PHP-Funktionen zum Arbeiten mit regulären Ausdrücken;
  • Änderung der Zeilenlänge;
  • Bestimmen der Länge einer Zeichenfolge;
  • alternative PHP-Funktionen zur Verarbeitung von String-Informationen;
  • Konvertieren von einfachem Text in HTML und umgekehrt;
  • Ändern der Groß-/Kleinschreibung von Zeichen in Zeichenfolgen.

Das nächste Kapitel eröffnet den zweiten Teil des Buches – übrigens mein Favorit. Darin beginnen wir mit der Erkundung der webzentrierten PHP-Tools und betrachten den Prozess der dynamischen Erstellung von Inhalten, einschließlich Dateien, und der Erstellung allgemeiner Vorlagen. Spätere Kapitel in Teil 2 behandeln die Arbeit mit HTML-Formularen, Datenbanken, Sitzungsdatenverfolgung und erweiterten Vorlagentools. Bleiben Sie dran – der Spaß kann gleich beginnen!

Inhalt

$user_info

Dies sind alle Schlüssel, die für $user_info in loadUserSettings() definiert sind. Einige sind sicherlich selbsterklärend.

Gruppen

Array. Alle möglichen Mitgliedergruppen sind einem Benutzer zugeordnet. Schlüssel spielen keine Rolle. Werte sind die Gruppen, bereinigt als int, für alle Fälle. Das beinhaltet:

  • Hauptgruppe
  • Beitragsanzahlgruppe
  • Zusätzliche Gruppen. Diese werden in der Datenbank als durch Kommas getrennte Zeichenfolge gespeichert.

möglicherweise_robot

bool. Ist wahr, wenn der Agent mit einer bekannten Spinne übereinstimmt, wenn die Funktion aktiviert ist, und wenn sie deaktiviert ist, macht sie eine fundierte Vermutung.

Ausweis

int Entspricht dem Datenbankwert des Mitglieds "id_member".!}

Nutzername

Name

Zeichenfolge. Ihr angezeigter Name.

Email

Passwort

Sprache

ist_gast

is_admin

Thema

letzte Anmeldung

int. Unix-Zeitstempel.

IP

$_SERVER["REMOTE_ADDR"]

IP2

$_SERVER["BAN_CHECK_IP"]

Beiträge

int. Anzahl der Beiträge.

Zeitformat

Zeichenfolge. Benutzerdefiniertes Format für strtftime().

Zeitverschiebung

int. Stündlicher Versatz des Benutzers zur Forumszeit.

Benutzerbild

  • URL:Zeichenfolge
  • Dateiname:Zeichenfolge
  • benutzerdefiniertes Verzeichnis: bool
  • id_attach: int

smiley_set

Mitteilungen

int. Anzahl der PMs, die sie haben.

ungelesene Nachrichten

int. Anzahl der ungelesenen PMs, die sie haben.

total_time_logged_in

Freunde

Zeichenfolge. Die durch Kommas getrennte Liste ihrer Freunde.

Ignoriertafeln

Zeichenfolge. Die Liste der Boards, die sie ignoriert haben, getrennt durch Kommas.

Ignorieren Sie Benutzer

Zeichenfolge. Die durch Kommas getrennte Liste der Benutzer, die sie ignoriert haben.

  • In SMF 1.1.x werden nur PMs ignoriert.
  • In SMF 2.0.x und höher wurde diese Funktion verbessert, um auch die Beiträge des ignorierten Benutzers auszublenden.

Warnung

int. Ihre Warnpunkte.

Berechtigungen

query_see_board

Die Liste aller Boards, die sie als Teil einer vorbereiteten SQL-Anweisung sehen können.

query_wanna_see_board

Die Liste der Boards, die sie als Teil einer vorbereiteten SQL-Anweisung sehen WOLLEN.

mod_cache

is_mod

Boolescher Wert. Ist falsch, außer in Foren, in denen das Mitglied Moderator ist. Es ist immer eingestellt.

Diejenigen, die mehr oder weniger ernsthaft studiert haben PHP wissen, dass es ein sehr nützliches globales Array gibt PHP Was heisst $_SERVER. Und in diesem Artikel möchte ich die gängigsten Schlüssel und ihre Werte in diesem Array analysieren, da deren Kenntnis selbst für einen Anfänger einfach Pflicht ist PHP-Programmierer.

Bevor du anfängst globales Array $_SERVER in PHP, ich gebe dir gleich einen kleinen Hinweis. Es ist eine tolle Funktion integriert PHP, Was heisst phpinfo(). Lassen Sie uns gleich ein Beispiel für seine Verwendung geben:

phpinfo();
?>

Als Ergebnis der Ausführung dieses einfachen Skripts sehen Sie eine riesige Tabelle mit verschiedenen PHP-Interpreter-Einstellungen, einschließlich, am Ende wird es eine Wertetabelle geben globales Array $_SERVER. Es werden alle Schlüssel und alle zugehörigen Werte aufgelistet. Wie kann Ihnen das helfen? Und Tatsache ist: Wenn Sie diesen oder jenen Wert benötigen und vergessen haben, wie der Schlüssel heißt, dann verwenden Sie die Funktion phpinfo() Den Namen können Sie sich immer merken. Im Allgemeinen werden Sie dieses Skript ausführen und mich sofort verstehen.

Kommen wir nun zu den beliebtesten zu den Schlüsseln des $_SERVER-Arrays:

  • HTTP_USER_AGENT- Mit diesem Schlüssel können Sie die Eigenschaften des Kunden herausfinden. In den meisten Fällen ist dies sicherlich der Browser, jedoch nicht immer. Und noch einmal: Wenn es sich um einen Browser handelt, welchen, können Sie in dieser Variable herausfinden.
  • HTTP_REFERER- enthält den absoluten Pfad zu dieser Datei ( PHP-Skript, HTML-Seite), von dem wir zu diesem Skript gewechselt sind. Grob gesagt, woher der Kunde kam.
  • SERVER_ADDR - IP Adresse Server.
  • REMOTE_ADDR - IP Adresse Klient.
  • DOKUMENT ROOT- physischer Pfad zum Stammverzeichnis der Site. Diese Option wird über eingestellt Konfigurationsdatei des Apache-Servers.
  • SCRIPT_FILENAME- physischer Pfad zum aufgerufenen Skript.
  • QUERY_STRING– ein sehr nützlicher Wert, der es Ihnen ermöglicht, mit einer Anfrage eine Zeichenfolge abzurufen und diese Zeichenfolge dann zu analysieren.
  • REQUEST_URI– ein noch nützlicherer Wert, der nicht nur die Anfrage selbst, sondern auch den relativen Pfad zum aufgerufenen Skript vom Stammverzeichnis enthält. Dies wird sehr oft verwendet, um Duplikate zu entfernen index.php, das heißt, wenn wir solche haben URL: "http://mysite.ru/index.php" Und " http://mysite.ru/" führen zu einer Seite und URLs unterschiedlich, daher Duplikate, was sich negativ auf die Suchmaschinenoptimierung auswirkt. Und mit der Hilfe REQUEST_URI wir können bestimmen: mit index.php oder nicht, ob das Skript aufgerufen wurde. Und wir können eine Weiterleitung mit durchführen index.php(falls er dabei war REQUEST_URI) auf ohne index.php. Als Ergebnis beim Senden einer solchen Anfrage: „ http://mysite.ru/index.php?id=5", wir werden eine Weiterleitung haben URL: "http://mysite.ru/?id=5". Das heißt, wir haben die Duplizierung beseitigt, indem wir sie entfernt haben URL Das index.php.
  • SCRIPT_NAME- relativer Pfad zum aufgerufenen Skript.

Vielleicht sind das alle Elemente globales Array $_SERVER in PHP die regelmäßig genutzt werden. Sie müssen sie kennen und bei Bedarf nutzen können.

5. Februar , 2017

Ich kenne kein PHP-Framework. Das ist traurig und beschämend, aber gesetzlich verboten ist es noch nicht. Aber gleichzeitig möchte ich mit der REST-API spielen. Das Problem ist, dass PHP standardmäßig nur $_GET und $_POST unterstützt. Und für einen RESTful-Service müssen Sie auch mit PUT, DELETE und PATCH arbeiten können. Und es ist nicht ganz offensichtlich, wie man viele Anfragen kulturell verarbeiten kann Holen Sie sich http://site.ru/users, löschen Sie http://site.ru/goods/5 und andere Obszönitäten. Wie kann man alle derartigen Anfragen an einem einzigen Punkt zusammenfassen, sie universell in Teile zerlegen und den erforderlichen Code zur Verarbeitung der Daten ausführen?

Fast jedes PHP-Framework kann dies sofort tun. Zum Beispiel Laravel, wo das Routing klar und einfach umgesetzt ist. Was aber, wenn wir uns gerade nicht mit einem neuen großen Thema befassen müssen, sondern einfach schnell ein Projekt mit REST-API-Unterstützung starten möchten? Dies wird im Artikel besprochen.

Was soll unser RESTful-Service können?

1. Unterstützt alle fünf Hauptanforderungstypen: GET, POST, PUT, PATCH, DELETE.
2. Lösen Sie verschiedene Routen der Ansicht
POST /Waren
PUT /goods/(goodId)
GET /users/(userId)/info
und andere beliebig lange Ketten.

Achtung: In diesem Artikel geht es nicht um die Grundlagen der REST API
Ich gehe davon aus, dass Sie mit dem REST-Ansatz bereits vertraut sind und verstehen, wie er funktioniert. Wenn nicht, dann gibt es im Internet viele tolle Artikel zu den Grundlagen von REST – ich möchte sie nicht duplizieren, meine Idee ist es zu zeigen, wie man mit REST in der Praxis arbeitet.

Welche Funktionalität werden wir unterstützen?

Betrachten wir zwei Entitäten – Produkte und Benutzer.

Für Produkte stehen folgende Optionen zur Verfügung:

  • 1. GET /goods/(goodId)— Einholen von Informationen über das Produkt
  • 2. POST /Waren— Hinzufügen eines neuen Produkts
  • 3. PUT /goods/(goodId)— Bearbeiten eines Produkts
  • 4. PATCH /goods/(goodId)— Bearbeiten einiger Produktparameter
  • 5. DELETE /goods/(goodId)— Entfernen eines Produkts

Für Benutzer und zur Abwechslung betrachten wir mehrere Optionen mit GET

  • 1. GET /users/(userId)— Vollständige Informationen über den Benutzer
  • 2. GET /users/(userId)/info— Nur allgemeine Informationen über den Benutzer
  • 3. GET /users/(userId)/orders— Liste der Benutzerbestellungen

Wie funktioniert das mit nativem PHP?

Als Erstes richten wir .htaccess so ein, dass alle Anfragen an die Datei index.php umgeleitet werden. Er wird sich mit der Datenextraktion befassen.

Zweitens entscheiden wir, welche Daten wir benötigen, und schreiben den Code, um sie zu erhalten – in index.php.
Uns interessieren 3 Arten von Daten:

  • 1. Anforderungsmethode (GET, POST, PUT, PATCH oder DELETE)
  • 2. Daten aus der URL, zum Beispiel „users/(userId)/info“ – alle 3 Parameter werden benötigt
  • 3. Daten aus dem Anfragetext
Und drittens schreiben wir Code, der die notwendigen Funktionen ausführt. Die Funktionen sind in Dateien unterteilt, alles ist Feng Shui, das Hinzufügen neuer Pfade und Methoden für einen RESTful-Dienst wird sehr einfach sein.

.htaccess

Erstellen wir eine .htaccess-Datei im Projektstammverzeichnis

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

Mit diesen geheimnisvollen Zeilen befehlen wir Ihnen Folgendes:
1 - Alle Anfragen jeglicher Art an die King-Datei index.php senden
2 – Machen Sie die Zeichenfolge in der URL in index.php im Get-Parameter q verfügbar. Das heißt, Daten von einer URL wie /users/(userId)/info wir erhalten von $_GET["q"].

index.php

Schauen wir uns index.php Zeile für Zeile an. Lassen Sie uns zunächst die Anforderungsmethode abrufen.

// Definieren Sie die Anfragemethode $method = $_SERVER["REQUEST_METHOD"];

Dann die Daten aus dem Anfragetext

// Daten aus dem Anfragetext abrufen $formData = getFormData($method);

Für GET und POST ist es einfach, Daten aus den entsprechenden $_GET- und $_POST-Arrays abzurufen. Aber für andere Methoden muss man etwas pervers sein. Der Code dafür wird aus dem Stream gezogen php://Eingabe, der Code ist für Google einfach, ich habe gerade einen allgemeinen Wrapper geschrieben – die Funktion getFormData($method).

// Daten aus der Anfragetextfunktion abrufen getFormData($method) ( // GET oder POST: Daten unverändert zurückgeben if ($method === "GET") return $_GET; if ($method === "POST" ) return $_POST; // PUT, PATCH oder DELETE $data = explosion("&", file_get_contents("php://input") ( $item = explosion ("=", $pair); if (count($item) == 2) ( $data = urldecode($item); ) ) return $data;

Das heißt, wir haben die notwendigen Daten erhalten, indem wir alle Details in getFormData ausgeblendet haben – na ja, großartig. Kommen wir zum interessantesten Teil – dem Routing.

// Die URL analysieren $url = (isset($_GET["q"])) ? $_GET["q"] : ""; $url = rtrim($url, "/"); $urls = explosion("/", $url);

Wir haben oben erfahren, dass .htaccess Parameter aus der URL in den q-Parameter des $_GET-Arrays einfügt. Das heißt, $_GET["q"] wird etwa Folgendes enthalten: Benutzer/10. Unabhängig davon, mit welcher Methode wir die Anfrage ausführen.

A explodieren("/", $url) wandelt diesen String für uns in ein Array um, mit dem wir bereits arbeiten können. Erstellen Sie also beliebig lange Abfrageketten, z. B.
GET /goods/page/2/limit/10/sort/price_asc
Und seien Sie versichert, Sie erhalten ein Array

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

Da wir nun alle Daten haben, müssen wir etwas Nützliches damit machen. Und es genügen nur 4 Zeilen Code

// Definieren Sie die Router- und URL-Daten $router = $urls; $urlData = array_slice($urls, 1); // Verbinden Sie die Router-Datei und führen Sie die Hauptfunktion include_once "routers/" aus. $router. ".php"; route($method, $urlData, $formData);

Verstehst du es? Wir erstellen einen Router-Ordner, in dem wir Dateien ablegen, die eine Entität manipulieren: Produkte oder Benutzer. Gleichzeitig stimmen wir zu, dass die Namen der Dateien mit dem ersten Parameter in urlData übereinstimmen – es wird der Router $router sein. Und dieser Router muss aus urlData entfernt werden, wir brauchen ihn nicht mehr und werden nur zum Verbinden der erforderlichen Datei verwendet. array_slice($urls, 1) und gibt uns alle Elemente des Arrays außer dem ersten.

Jetzt müssen Sie nur noch die gewünschte Routerdatei verbinden und die Routenfunktion mit drei Parametern ausführen. Was ist diese Funktionsroute? Vereinbaren wir, dass in jeder Router-Datei eine Funktion definiert wird, die anhand der Eingabeparameter bestimmt, welche Aktion der Benutzer initiiert hat, und den erforderlichen Code ausführt. Jetzt wird es klarer. Betrachten wir die erste Anfrage – das Erhalten von Daten zu einem Produkt.

GET /goods/(goodId)

Datei routers/goods.php

// Router-Funktion route($method, $urlData, $formData) ( // Informationen über ein Produkt abrufen // GET /goods/(goodId) if ($method === "GET" && count($urlData) == = 1) ( // Holen Sie sich die Produkt-ID $goodId = $urlData; // Ziehen Sie das Produkt aus der Datenbank... // Geben Sie die Antwort an den Client aus echo json_encode(array("method" => "GET", "id" => $goodId, "good" => "phone", "price" => 10000) // Return error header("HTTP/1.0 400 Bad Request"); echo json_encode(" Fehler“ => „Bad Request“) „) )

Der Inhalt der Datei ist eine große Routenfunktion, die abhängig von den übergebenen Parametern die notwendigen Aktionen ausführt. Wenn die GET-Methode und 1 Parameter (goodId) an urlData übergeben werden, handelt es sich um eine Anfrage zum Abrufen von Daten zu einem Produkt.

Achtung: Das Beispiel ist stark vereinfacht
Im wirklichen Leben müssen Sie natürlich zusätzlich die Eingabeparameter überprüfen, z. B. ob goodId eine Zahl ist. Anstatt den Code hier zu schreiben, werden Sie wahrscheinlich die erforderliche Klasse einschließen. Und um das Produkt zu erhalten, erstellen Sie ein Objekt dieser Klasse und rufen Sie eine Methode dafür auf.
Oder übertragen Sie die Kontrolle an einen Controller, der sich bereits um die Initialisierung der erforderlichen Modelle kümmert. Es gibt viele Möglichkeiten, wir betrachten nur die allgemeine Struktur des Codes.

In der Antwort an den Kunden zeigen wir die notwendigen Daten an: den Namen des Produkts und seinen Preis. Die Produkt-ID und die Methode sind in einer realen Anwendung völlig optional. Wir zeigen sie nur, um sicherzustellen, dass die richtige Methode mit den richtigen Parametern aufgerufen wird.

Versuchen wir es anhand eines Beispiels: Öffnen Sie Ihre Browserkonsole und führen Sie den Code aus

$.ajax((url: „/examples/rest/goods/10“, Methode: „GET“, dataType: „json“, Erfolg: function(response)(console.log(“response:“, Response))) )

Der Code sendet eine Anfrage an den Server, auf dem ich eine ähnliche Anwendung bereitgestellt habe, und gibt eine Antwort aus. Stellen Sie sicher, dass es sich um die Route handelt, die Sie interessiert /Waren/10 hat wirklich funktioniert. Auf der Registerkarte „Netzwerk“ sehen Sie dieselbe Anfrage.
Und ja, /examples/rest ist der Stammpfad unserer Testanwendung zur Site

Wenn Sie es eher gewohnt sind, Curl in der Konsole zu verwenden, führen Sie dies im Terminal aus – die Antwort wird dieselbe sein, und zwar sogar mit Headern vom Server.

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

Am Ende der Funktion haben wir den folgenden Code geschrieben.

// Einen Fehlerheader zurückgeben("HTTP/1.0 400 Bad Request"); echo json_encode(array("error" => "Bad Request"));

Das bedeutet, dass wir den Fehler 400 Bad Request an den Client zurückgeben, wenn wir einen Fehler bei den Parametern gemacht haben oder die angeforderte Route nicht definiert ist. Fügen Sie der URL beispielsweise so etwas hinzu: waren/10/another_param und Sie werden einen Fehler in der Konsole und eine 400-Antwort sehen – die krumme Anfrage wurde nicht durchgegangen.

Durch Serverantwort-HTTP-Codes
Wir machen uns nicht die Mühe, unterschiedliche Codes auszugeben, obwohl sich dies laut REST lohnt. Es gibt viele Clientfehler. Selbst in unserem einfachen Fall ist ein 405 im Falle einer falsch übergebenen Methode angemessen. Ich möchte die Dinge nicht absichtlich komplizieren.
Bei Erfolg gibt unser Server immer 200 OK zurück. Glücklicherweise sollten Sie beim Erstellen einer Ressource 201 Erstellt angeben. Der Einfachheit halber werden wir diese Feinheiten jedoch noch einmal verwerfen, aber in einem echten Projekt können Sie sie problemlos selbst umsetzen.

Ehrlich gesagt ist der Artikel fertig. Ich denke, Sie verstehen bereits den Ansatz, wie alle Routen aufgelöst werden, wie Daten abgerufen werden, wie man sie testet, wie man neue Anfragen hinzufügt usw. Aber um das Bild zu vervollständigen, werde ich die Implementierung der verbleibenden sieben Abfragen vorstellen, die wir am Anfang des Artikels beschrieben haben. Unterwegs werde ich ein paar interessante Kommentare abgeben und am Ende ein Archiv mit dem Quellcode veröffentlichen.

POST /Waren

Ein neues Produkt hinzufügen

// Ein neues Produkt hinzufügen // POST /goods if ($method === "POST" && empty($urlData)) ( // Ein Produkt zur Datenbank hinzufügen... // Die Antwort an den Client ausgeben echo json_encode (array("method" => "POST", "id" => rand(1, 100), "formData" => $formData));

urlData ist jetzt leer, aber formData wird verwendet – wir zeigen es einfach dem Client an.

Wie macht man es „richtig“?
Gemäß den Regeln von REST sollten Sie in einer Post-Anfrage nur die ID der erstellten Entität oder die URL zurückgeben, über die diese Entität abgerufen werden kann. Das heißt, die Antwort wird entweder nur eine Zahl sein – (goodId), oder /goods/(goodId).
Warum habe ich in Anführungszeichen „richtig“ geschrieben? Ja, denn bei REST handelt es sich nicht um eine Reihe strenger Regeln, sondern um Empfehlungen. Und wie Sie es umsetzen, hängt von Ihren Präferenzen oder bereits akzeptierten Vereinbarungen zu einem bestimmten Projekt ab.
Bedenken Sie jedoch, dass ein anderer Programmierer, der den Code liest und mit dem REST-Ansatz vertraut ist, in der Antwort auf eine Post-Anfrage die ID des erstellten Objekts oder eine URL erwartet, von der aus Daten zu diesem Objekt mit einer Get-Anfrage abgerufen werden können.

Testen von der Konsole aus

$.ajax((url: „/examples/rest/goods/“, Methode: „POST“, Daten: (gut: „Notebook“, Preis: 20000), Datentyp: „json“, Erfolg: Funktion(Antwort)( console.log("response:", Antwort))))

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

PUT /goods/(goodId)

Bearbeiten eines Produkts

// Alle Produktdaten aktualisieren // PUT /goods/(goodId) if ($method === "PUT" && count($urlData) === 1) ( // Produkt-ID abrufen $goodId = $urlData; / / Alle Produktfelder in der Datenbank aktualisieren... // Antwort an den Client ausgeben echo json_encode(array("method" => "PUT", "id" => $goodId, "formData" => $formData)) ;

Hier werden alle Daten bereits voll ausgenutzt. Die Produkt-ID wird aus urlData abgerufen und die Eigenschaften werden aus formData abgerufen.

Testen von der Konsole aus

$.ajax((url: „/examples/rest/goods/15“, Methode: „PUT“, Daten: (gut: „notebook“, Preis: 20000), dataType: „json“, Erfolg: function(response) (console.log("response:", Antwort))))

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

PATCH /goods/(goodId)

Teilweise Produktaktualisierung

// Teilweise Aktualisierung der Produktdaten // PATCH /goods/(goodId) if ($method === "PATCH" && count($urlData) === 1) ( // Holen Sie sich die Produkt-ID $goodId = $urlData; // Wir aktualisieren nur die angegebenen Produktfelder in der Datenbank... // Geben Sie die Antwort an den Client aus echo json_encode(array("method" => "PATCH", "id" => $goodId, "formData" => $formData));

Testen von der Konsole aus

$.ajax((URL: „/examples/rest/goods/15“, Methode: „PATCH“, Daten: (Preis: 25000), Datentyp: „json“, Erfolg: function(response)(console.log(“ Antwort:", Antwort))))

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

Warum all diese Angeberei mit PUT und PATCH?
Reicht ein PUT nicht? Führen sie nicht die gleiche Aktion aus – die Daten des Objekts aktualisieren?
Das ist richtig – äußerlich ist die Aktion eins. Der Unterschied liegt in den übertragenen Daten.
PUT geht davon aus Alle Objektfelder und PATCH - nur geändert. Diejenigen, die im Anfragetext gesendet werden. Bitte beachten Sie, dass wir im vorherigen PUT sowohl den Produktnamen als auch den Preis übergeben haben. Und in PATCH - nur der Preis. Das heißt, wir haben nur geänderte Daten an den Server gesendet.
Ob Sie PATCH benötigen – entscheiden Sie selbst. Aber denken Sie an den Code-lesenden Programmierer, den ich oben erwähnt habe.

DELETE /goods/(goodId)

Ein Produkt entfernen

// Ein Produkt löschen // DELETE /goods/(goodId) if ($method === "DELETE" && count($urlData) === 1) ( // Produkt-ID abrufen $goodId = $urlData; // Produkt aus der Datenbank löschen... // Antwort an den Client ausgeben echo json_encode(array("method" => "DELETE", "id" => $goodId));

Testen von der Konsole aus

$.ajax((url: „/examples/rest/goods/20“, Methode: „DELETE“, dataType: „json“, Erfolg: function(response)(console.log(“response:“, Response))) )

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

Mit der DELETE-Anfrage ist alles klar. Schauen wir uns nun die Arbeit mit Benutzern an – dem Router des Benutzers und dementsprechend der Datei „users.php“.

GET /users/(userId)

Abrufen aller Benutzerdaten. Wenn die GET-Anfrage wie folgt ist /users/(Benutzer-ID), dann geben wir alle Informationen über den Benutzer zurück, sofern zusätzlich angegeben /die Info oder /Aufträge, dann dementsprechend nur allgemeine Informationen bzw. eine Auftragsliste.

// Router-Funktion route($method, $urlData, $formData) ( // Alle Informationen über den Benutzer abrufen // GET /users/(userId) if ($method === "GET" && count($urlData) = = = 1) ( // Holen Sie sich die Produkt-ID $userId = $urlData; // Extrahieren Sie alle Daten über den Benutzer aus der Datenbank... // Geben Sie die Antwort an den Client aus echo json_encode(array("method" => " GET", "id" = > $userId, "info" => array("email" => " [email protected]", "name" => "Webdevkin"), "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "12.01.2017"), array ("orderId" => 8, "summa" => 5000, "orderDate" => "02/03/2017"))) // Return the error header("HTTP/1.0 400 Bad Request" ); echo json_encode( array("error" => "Bad Request"));

Testen von der Konsole aus

$.ajax((url: „/examples/rest/users/5“, Methode: „GET“, dataType: „json“, Erfolg: function(response)(console.log(“response:“, Response))) )

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

GET /users/(userId)/info

Allgemeine Informationen zum Benutzer

// Allgemeine Informationen über den Benutzer abrufen // GET /users/(userId)/info if ($method === "GET" && count($urlData) === 2 && $urlData === "info") ( // Holen Sie sich die Produkt-ID $userId = $urlData; // Extrahieren Sie allgemeine Daten über den Benutzer aus der Datenbank... // Geben Sie die Antwort an den Client aus echo json_encode(array("method" => "GET", "id " => $userId, " info" => array("email" => " [email protected]", "name" => "Webdevkin"))); return; )

Testen von der Konsole aus

$.ajax((URL: „/examples/rest/users/5/info“, Methode: „GET“, Datentyp: „json“, Erfolg: function(response)(console.log(“response:“, Antwort) )))

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

GET /users/(userId)/orders

Eine Liste der Benutzerbestellungen abrufen

// Benutzeraufträge empfangen // GET /users/(userId)/orders if ($method === "GET" && count($urlData) === 2 && $urlData === "orders") ( // Get Produkt-ID $userId = $urlData; // Daten über die Bestellungen des Benutzers aus der Datenbank abrufen... // Antwort an den Client ausgeben echo json_encode(array("method" => "GET", "id" => $ userId, "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "12.01.2017"), array("orderId" => 8, "summa " => 5000, "orderDate " => "03.02.2017")))); return; )

Testen von der Konsole aus

$.ajax((URL: „/examples/rest/users/5/orders“, Methode: „GET“, Datentyp: „json“, Erfolg: function(response)(console.log(“response:“, Antwort) )))

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

Ergebnisse und Quellen

Quellen aus Artikelbeispielen -

Wie Sie sehen, erwies sich die Organisation der REST-API-Unterstützung in nativem PHP als nicht so schwierig und auf völlig legale Weise. Die Hauptsache ist die Unterstützung von Routen und nicht standardmäßigen PHP-Methoden PUT, PATCH und DELETE.

Der Hauptcode, der diese Unterstützung implementiert, passt in drei Dutzend Zeilen von index.php. Der Rest ist nur ein Geschirr, das beliebig umgesetzt werden kann. Ich habe vorgeschlagen, dies in Form von Plug-in-Router-Dateien zu tun, deren Namen mit den Entitäten Ihres Projekts übereinstimmen. Aber Sie können Ihrer Fantasie freien Lauf lassen und eine interessantere Lösung finden.

Ruft ein WP_User-Objekt ab, das alle Daten des angegebenen Benutzers enthält.

Die von den Funktionen zurückgegebenen Daten entsprechen vollständig den Feldern der Datenbanktabellen: wp_users und wp_usermeta (Tabellenbeschreibung).

Dies ist eine steckbare Funktion, d. h. Es kann über das Plugin ersetzt werden. Dies bedeutet, dass es erst dann funktioniert (verbindet), wenn alle Plugins verbunden wurden und bis zu diesem Zeitpunkt die Funktion noch nicht definiert wurde ... Daher können Sie diese und die davon abhängigen Funktionen nicht direkt aus dem Plugin-Code aufrufen. Sie müssen über den Plugins_loaded-Hook oder höher aufgerufen werden, beispielsweise über den Init-Hook.

Funktionsersetzung (Override) – Sie können im Plugin eine Funktion mit demselben Namen erstellen, die dann die aktuelle Funktion ersetzt.

✈ 1 Mal = 0,000296s = schnell| 50000 Mal = 0,78 s = sehr schnell| PHP 7.1.2RC1, WP 4.7.2

Es gibt keine Haken.

Kehrt zurück

WP_User/false. Datenobjekt oder false, wenn der angegebene Benutzer nicht gefunden werden konnte.

Verwendung

get_userdata($userid); $Benutzer-ID (Anzahl) (erforderlich) ID des Benutzers, dessen Daten Sie abrufen möchten.
Standard: Nein

Beispiele

#1 So geben Sie Daten aus einem empfangenen Datenobjekt aus

$user_info = get_userdata(1); echo "Benutzername: " . $user_info->user_login . "\N"; echo "Zugriffsebene: " . $user_info->user_level . "\N"; echo "ID: " . $user_info->ID . "\N"; /* Ausgaben: Benutzername: admin Zugriffsebene: 10 ID: 1 */

#1.2 Daten in eine Variable

Ein weiteres Beispiel, nur hier schreiben wir die Daten zunächst in Variablen und zeigen sie dann auf dem Bildschirm an:

$user = get_userdata(1); $username = $user->user_login; $first_name = $user->first_name; $last_name = $user->last_name; echo „$first_name $last_name hat die Seite mit dem Login besucht: $username.“; /* Object $user: WP_User Object( => stdClass Object( => 80 => kogian => $P$BJFHKJfUKyWv1TwLOVAENYU0JGNsq. => kogian => [email protected]=> http://example.com/ => 2016-09-01 00:34:42 => => => kogian) => 80 => Array( => 1) => wp_capabilities => Array( => Abonnent) => Array( => 1 => 1 => 1) => => 1) */

#2 Klassenmethoden

Das von get_userdata() erhaltene Objekt ist eine Instanz der Klasse und verfügt über Methoden, die verwendet werden können. Manchmal kann das nützlich sein. Hier ist ein einfaches Beispiel für das Abrufen einer Benutzeroption mit der Methode $user->get():

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

Liste einiger Methoden:

    get($key) – gibt den Optionswert zurück;

    has_prop($key) – prüft, ob die angegebene Option installiert ist;

    has_cap($cap) – prüft, ob der Benutzer über die angegebene Fähigkeit oder Rolle verfügt;

    get_role_caps() – Ruft alle Fähigkeiten der Benutzerrolle ab und kombiniert sie mit den individuellen Fähigkeiten des Benutzers;

    add_role($role) – fügt dem Benutzer eine Rolle hinzu;

    remove_role($role) – entfernt eine Rolle von einem Benutzer;

  • set_role($role) – legt die Benutzerrolle fest;

Anmerkungen

Hier sind einige nützliche wp_users- und wp_usermeta-Tabellenfeldwerte, die Sie zum Abrufen von Daten verwenden können:

  • Anzeigename

user_meta

  • Benutzerbeschreibung

    wp_capabilities (Array)

    admin_color (Theme des Admin-Panels. Standard: frisch)

    geschlossene Postfächer_Seite

  • Quelldomäne

Es ist auch zu beachten, dass sich die zurückgegebenen Daten seit Version 3.2 leicht geändert haben: Es wird das WP_User-Objekt zurückgegeben. Die Daten im Objekt sind in Gruppen unterteilt: Daten, Obergrenzen, Rollen (zuvor wurden die Daten in einer allgemeinen Liste zurückgegeben).

Dank der „magischen“ (Dienstprogramm-)Methoden von PHP können Daten jedoch wie zuvor abgerufen werden. Jetzt werden die Daten beispielsweise wie folgt gespeichert: get_userdata(1)->data->rich_editing , aber Sie können sie auch wie folgt abrufen Dies: get_userdata(1)->rich_editing , auch wenn var_dump() diese Beziehung nicht anzeigt.

Code Benutzerdaten abrufen: wp-includes/pluggable.php WP 5.2.2

document.write("");
mob_info