Frenzy doet php-actie. PHP en formulieren. #1 Normale haak

RxGroovy heeft verschillende Do-varianten.

  • Javadoc:
  • Javadoc:

  • Javadoc:

De doOnRequest-operator (nieuw in RxGroovy 1.1) registreert een actie die wordt aangeroepen wanneer een waarnemer extra items opvraagt ​​uit de resulterende Observable. Die actie krijgt als parameter het aantal items waar de waarnemer om vraagt.

  • Javadoc:

  • Javadoc:

  • Javadoc:

  • Javadoc:

  • Javadoc:

voor

  • Javadoc:

na de resulterende Observable eindigt, normaal of met een fout.

Voorbeeldcode

def getallen = Waarneembaar.from(); getallen.finallyDo(( println("Eindelijk"); )).subscribe(( println(it); ), // onNext ( println("Fout: " + it.getMessage()); ), // onError ( println ("Reeks voltooid") // onCompleted);

1 2 3 4 5 Reeks voltooid Eindelijk

  • Javadoc:

RxJava heeft verschillende Do-varianten.

Met de doOnEach-operator kunt u een callback tot stand brengen die de resulterende Observable zal aanroepen telkens wanneer deze een item verzendt. U kunt deze callback doorgeven in de vorm van een actie die een onNext-variant van Notification als enige parameter heeft, of u kunt een Observer doorgeven wiens onNext-methode wordt aangeroepen alsof deze zich op de Observable heeft geabonneerd.

  • Javadoc:
  • Javadoc:

De operator doOnNext lijkt veel op doOnEach(Action1), behalve dat de actie die u als parameter doorgeeft geen melding accepteert, maar in plaats daarvan eenvoudigweg het verzonden item accepteert.

Voorbeeldcode

Observable.just(1, 2, 3).doOnNext(new Action1() ( @Override public void call(Integer item) ( if(item > 1) ( throw new RuntimeException("Item overschrijdt maximale waarde"); ) ) ) ).subscribe(new Subscriber() ( @Override public void onNext(Integer item) ( System.out.println("Next: " + item); ) @Override public void onError(Throwable error) ( System.err.println( "Fout: " + error.getMessage()); @Override public void onCompleted() ( System.out.println("Sequence complete."); ) ));

Volgende: 1 fout: item overschrijdt de maximale waarde

  • Javadoc:

De doOnRequest-operator (nieuw in RxJava 1.1) registreert een actie die wordt aangeroepen wanneer een waarnemer extra items opvraagt ​​uit de resulterende Observable. Die actie krijgt als parameter het aantal items waar de waarnemer om vraagt.

  • Javadoc:

De doOnSubscribe-operator registreert een actie die wordt aangeroepen wanneer een waarnemer zich abonneert op de resulterende Observable.

  • Javadoc:

De doOnUnsubscribe-operator registreert een actie die wordt aangeroepen wanneer een waarnemer zich afmeldt voor de resulterende Observable.

  • Javadoc:

De operator doOnCompleted registreert een actie die wordt aangeroepen als de resulterende Observable normaal wordt beëindigd, waarbij onCompleted wordt aangeroepen.

  • Javadoc:

De doOnError-operator registreert een actie die wordt aangeroepen als de resulterende Observable abnormaal wordt beëindigd, waarbij onError wordt aangeroepen. Deze actie wordt doorgegeven aan de worp die de fout vertegenwoordigt.

  • Javadoc:

De doOnTerminate-operator registreert een actie die just wordt aangeroepen voor de resulterende Observable eindigt, normaal of met een fout.

  • Javadoc:

finalDo is verouderd sinds RxJava 1.1.1, ten gunste van doAfterTerminate met hetzelfde gedrag.

De operator finalDo registreert een actie die just wordt aangeroepen na de resulterende Observable eindigt, normaal of met een fout.

  • Javadoc:

De doAfterTerminate-operator registreert een actie die just wordt aangeroepen na de resulterende Observable eindigt, normaal of met een fout.

  • Javadoc:


RxJS implementeert de basis Do-operator zoals do or tap (twee namen voor dezelfde operator). U heeft twee keuzes voor het gebruik van deze operator:

  • U kunt het doorgeven aan een waarnemer, in welk geval do / tap de methoden van die waarnemer aanroept alsof die waarnemer zich heeft geabonneerd op de resulterende waarneembare.
  • U kunt een set van 1-3 individuele functies doorgeven (onNext , onError en onCompleted) die do / tap zullen aanroepen, samen met de gelijknamige functies van een van zijn waarnemers.
  • Voorbeeldcode

    /* Een waarnemer gebruiken */ var waarnemer = Rx.Observer.create(function (x) ( console.log("Do Next: %s", x); ), function (err) ( console.log("Do Error : %s", err); ), function () ( console.log("Do Completed"); )); var source = Rx.Observable.range(0, 3) .do(waarnemer); var abonnement = source.subscribe(function (x) ( console.log("Volgende: %s", x); ), function (err) ( console.log("Fout: %s", err); ), function () (console.log("Voltooid"); ));

    /* Een functie gebruiken */ var source = Rx.Observable.range(0, 3) .do(function (x) ( console.log("Do Next:", x); ), function (err) ( console.log("Do Next:", x); ), function (err) ( console. log("Doe fout:", err); function () ( console.log("Doe voltooid"); )); var abonnement = source.subscribe(functie (x) ( console.log("Volgende: %s", x); ), function (err) ( console.log("Fout: %s", err); ), function () (console.log("Voltooid"); ));

    Volgende doen: 0 Volgende: 0 Volgende doen: 1 Volgende: 1 Volgende doen: 2 Volgende: 2 Doen Voltooid Voltooid


    RxJS implementeert ook doOnNext of tapOnNext (twee namen voor dezelfde operator).

    Voorbeeldcode

    var source = Rx.Observable.range(0, 3) .doOnNext(function () ( this.log("Do Next: %s", x); ), console); var abonnement = source.subscribe(functie (x) ( console.log("Volgende: %s", x); ), function (err) ( console.log("Fout: %s", err); ), function () (console.log("Voltooid"); ));

    Volgende doen: 0 Volgende: 0 Volgende doen: 1 Volgende: 1 Volgende doen: 2 Volgende: 2 Voltooid


    RxJS implementeert ook doOnError of tapOnError (twee namen voor dezelfde operator).

    Voorbeeldcode

    Het is een gespecialiseerde vorm van Do die alleen reageert op het geval onError, door een callback-functie aan te roepen die u als parameter opgeeft. U kunt optioneel ook een tweede parameter doorgeven die het object “this” zal zijn vanuit het oogpunt van uw callback-functie wanneer deze wordt uitgevoerd.

    var source = Rx.Observable.throw(nieuwe fout());


    .doOnError(functie (err) ( this.log("Do Error: %s", err); ), console); var abonnement = source.subscribe(functie (x) ( console.log("Volgende: %s", x); ), function (err) ( console.log("Fout: %s", err); ), function () (console.log("Voltooid"); ));

    Voorbeeldcode

    Doen Fout: Fout Fout: Fout

    RxJS implementeert ook doOnCompleted of tapOnCompleted (twee namen voor dezelfde operator). Het is een gespecialiseerde vorm van Do die alleen reageert op het geval onCompleted, door een callback-functie aan te roepen die u als parameter opgeeft. U kunt optioneel ook een tweede parameter doorgeven die het object “this” zal zijn vanuit het oogpunt van uw callback-functie wanneer deze wordt uitgevoerd.


    var source = Rx.Observable.range(0, 3) .doOnCompleted(function () ( this.log("Do Completed"); ), console); var abonnement = source.subscribe(functie (x) ( console.log("Volgende: %s", x); ), function (err) ( console.log("Fout: %s", err); ), function () (console.log("Voltooid"); ));

    Voorbeeldcode

    Volgende: 0 Volgende: 1 Volgende: 2 Doen Voltooid Voltooid

    RxJS implementeert ook een eindelijk-operator. Er is een functie voor nodig die wordt aangeroepen nadat de resulterende Observable is beëindigd, hetzij normaal (onCompleted) of abnormaal (onError).

    var source = Rx.Observable.throw(nieuwe fout()) .finally(function () ( console.log("Eindelijk"); )); var abonnement = source.subscribe(function (x) ( console.log("Volgende: " + x); ), function (err) ( console.log("Fout: " + err); ), function () ( console .log("Voltooid");

    • Fout: Fout Eindelijk
    • do / tap , doOnNext / tapOnNext , doOnError / tapOnError , doOnCompleted / tapOnCompleted , en tenslotte zijn ze te vinden in elk van de volgende distributies:
    • rx.js
    • rx.all.js
    • rx.all.compat.js
    • rx.compat.js

    RxPHP implementeert deze operator op dezelfde manier als .

    Roept een actie op voor elk element in de waarneembare reeks en roept een actie op bij een sierlijke of uitzonderlijke beëindiging van de waarneembare reeks. Deze methode kan worden gebruikt voor foutopsporing, logboekregistratie, enz. van het vraaggedrag door de berichtenstroom te onderscheppen om willekeurige acties uit te voeren voor berichten in de pijplijn. Wanneer u do gebruikt, is het belangrijk op te merken dat de waarnemer mogelijk extra gebeurtenissen ontvangt nadat een stream is voltooid of een fout heeft gemaakt (zoals bij gebruik van een herhaling of opnieuw abonneren). Als u een Observable gebruikt die de AbstractObservable uitbreidt, ontvangt u deze gebeurtenissen niet. Gebruik voor dit speciale geval de DoObserver. doOnNext, doOnError en doOnCompleted gebruiken de DoObserver intern en ontvangen deze aanvullende gebeurtenissen.

    Voorbeeldcode

    //van https://github.com/ReactiveX/RxPHP/blob/master/demo/do/do.php $source = \Rx\Observable::range(0, 3) ->do(functie ($x) ( echo "Do Next:", $x, PHP_EOL; ), function (Throwable $err) ( echo "Do Error:", $err->getMessage(), PHP_EOL; ), function () ( echo "Do Completed" , PHP_EOL )); $subscription = $source->subscribe($stdoutObserver);

    Volgende doen:0 Volgende waarde: 0 Volgende doen:1 Volgende waarde: 1 Volgende doen:2 Volgende waarde: 2 Doen Voltooid Voltooid!

    RxPHP heeft ook een operator doOnError .

    Voorbeeldcode

    //van https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnError.php $source = \Rx\Observable::error(new Exception("Oeps")) ->doOnError(functie (Throwable $err) ( echo "Do Error:", $err->getMessage(), PHP_EOL; )); $subscription = $source->subscribe($stdoutObserver);

    Doe Fout: Oeps Uitzondering: Oeps

    RxPHP heeft ook een operator doOnCompleted .

    Voorbeeldcode

    //van https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnCompleted.php $source = \Rx\Observable::empty() ->doOnCompleted(function () ( echo "Do Completed ", PHP_EOL; )); $subscription = $source->subscribe($stdoutObserver);

    Doen Voltooid Compleet!

    RxPHP heeft eindelijk ook een operator.

    Zal een gespecificeerde functie aanroepen wanneer de bron eindigt bij voltooiing of fout.

    Voorbeeldcode

    //van https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally.php Rx\Observable::range(1, 3) ->finally(function() ( echo "Eindelijk\n "; )) ->Abonneren($stdoutObserver);

    Volgende waarde: 1 Volgende waarde: 2 Volgende waarde: 3 Voltooid! Eindelijk

    //van https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally-error.php Rx\Observable::range(1, 3) ->map(function($value) ( ​​​​if ($value == 2) ( throw new \Exception("error"); ) return $value )) ->finally(function() ( echo "Eindelijk\n"; )) ->subscribe($stdoutObserver) ;

    Volgende waarde: 1 Uitzondering: fout Eindelijk

    “Gebruik de goto-operator niet”, dat is wat de docenten van de academie ons vertelden, en inderdaad, deze operator maakt van de code een complete puinhoop. De PHP-ontwikkelaars hebben het probleem radicaal opgelost: het bestaat simpelweg niet in PHP3 en PHP4. Waardoor werden ze aanvankelijk gemotiveerd? Misschien wilden ze ons allemaal de juiste programmeerstijl bijbrengen? Welnu, we kunnen zeggen dat ze er volledig in zijn geslaagd - we zijn er allemaal al aan gewend, dat wil zeggen, we zijn de gewoonte om deze operator te gebruiken volledig kwijtgeraakt, misschien is dit het beste, want ik moest ooit een logische constructie bedenken die volledig gecompenseerd voor deze meest ongelukkige bestemming.
    Ik weet niet hoe het voor iemand is, maar voor mij had ik vooral vaak de wens om goto te gebruiken bij het maken van een html-formulierhandler, wanneer er veel gegevens van de gebruiker naar de server worden verzonden, wat het php-script moet doen. stap voor stap controleren. Dit proces vindt in de regel in verschillende fasen plaats: het formulier zelf afdrukken, de ontvangen gegevens controleren, voorlopige weergave en bijvoorbeeld opslaan. Bovendien kunnen sommige fasen worden herhaald: als de gegevensverificatie niet goed is verlopen, gaan we verder met het afdrukken van het formulier, of als de voorlopige weergave de gebruiker niet bevalt, kan hij terugkeren naar het invoeren van gegevens. Kortom, sommige stukjes code kunnen meerdere keren worden gebruikt. Het gebruik van functies onder deze omstandigheden is ook niet erg handig: er zijn veel invoer- en uitvoervariabelen, de functie moet te complexe acties uitvoeren, het blijkt over het algemeen onhandig en de leesbaarheid van de code neemt sterk af.
    En ik kwam op dit ontwerp.

    .
    Je bent oud.

    Voorbeelduitvoer van dit programma:

    Hallo, Sergej. Je bent 30 jaar oud.

    Als je geen rekening houdt met de stukjes code met htmlspecialchars() en (int), moet het werkingsprincipe van deze code eenvoudig en begrijpelijk zijn. htmlspecialchars() zorgt ervoor dat "speciale" HTML-tekens correct worden gecodeerd, zodat er geen kwaadaardige HTML of Javascript in uw pagina wordt ingevoegd. Het leeftijdsveld, waarvan we weten dat het een getal moet zijn, kunnen we eenvoudigweg converteren naar een geheel getal, waardoor automatisch de ongewenste tekens worden verwijderd. PHP kan dit ook automatisch doen met behulp van de filterextensie. De variabelen $_POST["naam"] en $_POST["leeftijd"] worden automatisch door PHP voor u ingesteld. Voorheen gebruikten we de superglobal variabele $_SERVER, maar hier gebruiken we ook de superglobal variabele $_POST, die alle POST-gegevens bevat. Merk dat op verzendmethode (methode) van ons formulier is POST. Als we de methode gebruikten KRIJGEN

    , dan zou onze formulierinformatie in de superglobale variabele $_GET staan.

    Als alternatief kunt u de variabele $_REQUEST gebruiken als de gegevensbron er niet toe doet. Deze variabele bevat een combinatie van GET-, POST- en COOKIE-gegevens.

    15 jaar geleden

    Volgens de HTTP-specificatie moet u de POST-methode gebruiken wanneer u het formulier gebruikt om de status van iets op de server te wijzigen. Als een pagina bijvoorbeeld een formulier heeft waarmee gebruikers hun eigen opmerkingen kunnen toevoegen, zoals deze pagina hier, moet het formulier POST gebruiken. Als u op "Opnieuw laden" of "Vernieuwen" klikt op een pagina die u via een POST hebt bereikt, is dit bijna altijd een fout - u zou niet twee keer dezelfde opmerking moeten plaatsen - Daarom zijn deze pagina's niet voorzien van een bladwijzer of in de cache opgeslagen.

    U moet de GET-methode gebruiken als uw formulier iets van de server haalt en eigenlijk niets verandert. Het formulier voor een zoekmachine zou bijvoorbeeld GET moeten gebruiken, omdat het zoeken op een website niets mag veranderen waar de klant mogelijk om geeft, en het bookmarken of cachen van de resultaten van een zoekopdracht in een zoekmachine is net zo nuttig als bookmarken of cachen. een statische HTML-pagina.

    2 jaar geleden

    Het verduidelijken waard:

    Beveiliging is hier alleen een overweging vanwege het feit dat een GET gemakkelijker te delen is dan een POST. Voorbeeld: u wilt niet dat er een wachtwoord wordt verzonden door GET, omdat de gebruiker de resulterende URL zou kunnen delen en onbedoeld zijn wachtwoord zou kunnen onthullen.

    Een GET en een POST zijn echter even gemakkelijk te onderscheppen door een goed geplaatste kwaadwillende persoon als u geen TLS/SSL inzet om de netwerkverbinding zelf te beschermen.

    Alle formulieren die via HTTP (meestal poort 80) worden verzonden, zijn onveilig, en vandaag (2017) zijn er niet veel goede redenen voor een openbare website om geen HTTPS te gebruiken (wat in feite HTTP + Transport Layer Security is).

    Als bonus minimaliseert u, als u TLS gebruikt, het risico dat uw gebruikers code (AD's) in uw verkeer krijgen die niet door u is geplaatst.

    Dit artikel gaat gedetailleerd in op het gebruik van de PHP _SELF-variabele.

    Wat is de PHP _SELF-variabele?

    De PHP _SELF-variabele retourneert de naam en het pad van het huidige bestand (ten opzichte van de documentroot). U kunt deze variabele gebruiken in het action-attribuut van het formulier. Er zijn ook enkele nuances die u moet kennen. Natuurlijk kunnen we deze nuances niet negeren.

    Laten we een paar voorbeelden bekijken.

    Echo $_SERVER["PHP_SELF"];

    1) Laten we aannemen dat uw php-bestand zich op het volgende adres bevindt:

    Http://www.uwserver.com/form-action.php

    In dit geval zal de PHP _SELF-variabele het volgende bevatten:

    "/form-action.php"

    2) Laten we aannemen dat uw PHP-bestand zich op dit adres bevindt:

    Http://www.uwserver.com/dir1/form-action.php

    PHP_SELF wordt:

    "/dir1/form-action.php"

    PHP _SELF in het actiekenmerk van het formulier. Waarom was ze daar nodig?

    Normaal gesproken wordt de PHP _SELF-variabele gebruikt in het action-attribuut van de formuliertag. Het actieattribuut specificeert het adres waarnaar de inhoud van het formulier na bevestiging wordt verzonden (de gebruiker klikt op de knop met type = "verzenden"). In de regel is dit dezelfde pagina waar het formulier vandaan kwam.

    Als u echter de naam van het bestand waarnaar in het formulier wordt verwezen, hernoemt, moet u de bestandsnaam in het action-attribuut hernoemen, anders zal het formulier niet werken.

    De PHP _SELF-variabele bespaart u onnodige correcties, omdat het pagina-adres automatisch wordt gegenereerd op basis van de bestandsnaam.

    Stel dat u een formulierbestand heeft met de naam form-action.php en u wilt dat het formulier na bevestiging naar hetzelfde bestand wordt verzonden. Meestal schrijven ze zo:

    Maar u kunt de PHP _SELF-variabele gebruiken in plaats van form-action.php. In dit geval ziet de code er als volgt uit: