HTML-formulieren in php. Een feedbackformulier maken in PHP

Eén van de meest voorkomende taken in de praktijk is het implementeren van een feedbackformulier. Je bedoelt het schrijven van de HTML-code, het ontwerpen ervan in CSS, het creëren van een PHP-script dat de van de gebruiker ontvangen gegevens verwerkt en naar onze mail stuurt, het schrijven van een JS-script dat het formulier controleert op de geschiktheid van de ingevoerde gegevens, het beschermen ons geesteskind tegen spam, zodat onze mailbox niet instort door botaanvallen.

Alle bovenstaande punten zullen in onze review worden besproken en in detail worden becommentarieerd.

Laten we dus beginnen met het maken van een feedbackformulier:

HTML

Allereerst schrijven we HTML-code, waarin de velden worden gespecificeerd die de gebruiker zal invullen. Ze zullen in de toekomst worden geformaliseerd. De formuliercode ziet er als volgt uit:

< form method= "post" action= "mail.php" > < div class = "left" > < label for = "name" >Naam: < input maxlength= "30" type= "text" name= "name" /> < label for = "phone" >Telefoon: < input maxlength= "30" type= "text" name= "phone" /> < label for = "mail" >E-mail: < input maxlength= "30" type= "text" name= "mail" /> < div class = "right" > < label for = "message" >Bericht: < textarea rows= "7" cols= "50" name= "message" > < input type= "submit" value= "Versturen" />

En visueel ziet het er nu zo uit:

Ik ben het ermee eens, tot nu toe is alles lelijk en niets duidelijk, maar we zijn nog maar net begonnen.

Laten we de bovenstaande code in detail bekijken:

  • < form method= "post" action= "mail.php" > …


    Om een ​​formulier te maken, moet u de formuliertag gebruiken. Hij is het die het begin en einde van het formulier voor de codetolk bepaalt. Het heeft, zoals elke tag, een hele reeks attributen, maar er zijn er maar twee nodig om het formulier te laten werken, dit zijn methode (de methode om een ​​verzoek naar de server te sturen, post wordt standaard gebruikt voor formulieren) en actie ( geeft het pad naar het formulierhandlerbestand aan, namelijk in Dit bestand zal een PHP-script bevatten, dat vervolgens de door de gebruiker ingevoerde waarden per e-mail naar ons stuurt. In ons geval zien we dat dit bestand mail.php heet deze bevindt zich in dezelfde sitemap als de pagina die we overwegen).
  • < input maxlength= "30" type= "text" name= "name" />


    Vervolgens hebben we input. Dit zijn eigenlijk de formuliervelden zelf waarin gebruikers de informatie zullen invoeren die we nodig hebben (type = "text" geeft aan dat dit tekst zal zijn). Het attribuut maxlength specificeert hoeveel tekens de gebruiker in een bepaald formulierveld kan invoeren. Het belangrijkste attribuut is naam: het specificeert de naam van een specifiek veld. Het is onder deze namen dat het PHP-script vervolgens de ingevoerde informatie verwerkt. Indien gewenst kunt u ook het placeholder-attribuut instellen, dat tekst in het veld weergeeft die verdwijnt wanneer de cursor erin wordt geplaatst. Een van de problemen met tijdelijke aanduiding is dat deze niet door sommige oudere browsers wordt ondersteund.
  • < label for = "name" >Naam:


    Wordt gebruikt als we tijdelijke aanduidingen hebben opgegeven. Een gewone veldhandtekening, het for-attribuut vertelt naar welk specifiek veld deze handtekening verwijst. De waarde geeft de naam aan van het veld waarin we geïnteresseerd zijn.
  • < textarea rows= "7" cols= "50" name= "message" >


    Het is net als invoer bedoeld dat de gebruiker informatie invoert, alleen is het veld dit keer afgestemd op lange berichten. Rijen specificeert de veldgrootte in rijen, kolommen in tekens. Over het algemeen bepalen ze de hoogte en breedte van ons veld.
  • < input type= "submit" value= "Versturen" />


    Type="submit" vertelt ons dat dit een knop is voor het indienen van een formulier, en value specificeert de tekst die in deze knop zal staan.
  • < div class = "right" >


    worden alleen gebruikt voor het verdere visuele ontwerp van het formulier.

CSS

Om ervoor te zorgen dat ons feedbackformulier er representatief uitziet, moet het worden opgemaakt. Om het volgende resultaat te krijgen:

Wij hebben deze code gebruikt:

formulier ( achtergrond: #f4f5f7; opvulling: 20px; ) formulier . links, vorm. rechts (weergave: inline-blok; verticaal uitlijnen: boven; breedte: 458px; ) formulier. rechts (opvulling-links: 20px;) label (weergave: blok; lettergrootte: 18px; tekst-uitlijning: midden; marge: 10px 0px 0px 0px; ) invoer, tekstgebied (rand: 1px effen #82858D; opvulling: 10px; lettergrootte: 16px; breedte: 436px; ) tekstgebied (hoogte: 98px; marge-onder: 32px;) input[type= "submit" ] (breedte: 200px; zwevend: rechts; rand: geen; achtergrond: #595B5F; kleur: #fff; teksttransformatie: hoofdletters;

Ik zie het nut niet in van het gedetailleerd beschrijven van CSS; ik vestig alleen uw aandacht op de belangrijkste punten:

  1. Het is niet nodig om voor elke tag in het formulier een ontwerp te schrijven. Probeer uw selectors zo te bouwen dat u alle benodigde elementen in een paar regels code kunt ontwerpen.
  2. Gebruik geen onnodige typetags om lijnen af ​​te breken en inkepingen te maken < br>, < p> enz. CSS met de weergave: blok en marge met opvuleigenschappen kunnen deze taken goed aan. Meer over waarom u het niet zou moeten gebruiken < br> in lay-out in het algemeen kun je lezen in het artikel Tag br, maar is het echt nodig? .
  3. Gebruik geen tabellarische indeling voor formulieren. Dit is in tegenspraak met de semantiek van deze tag, en zoekmachines zijn dol op semantische code. Om de visuele structuur van het document te vormen, hebben we alleen div-tags nodig, en de weergave-eigenschappen gespecificeerd in CSS: inline-block (rangschikt blokken op een rij) en verticaal uitlijnen: top (voorkomt dat ze over het scherm verspreid worden) , zet ze op de gewenste hoogte en voila, niets overbodigs en alles bevindt zich zoals we nodig hebben.

Voor degenen die tijd willen besparen op het ontwerpen van websites, kan ik het gebruik van CSS-frameworks aanbevelen bij het maken van websites, vooral zelfgeschreven websites. Mijn keuze in dit opzicht is Twitter Bootstrap. U kunt een les bekijken over hoe u hiermee formulieren kunt ontwerpen.

PHP

Welnu, het is tijd om ons formulier te laten werken.

We gaan naar onze hoofdmap van de site en maken daar het mail.php-bestand, waarnaar we eerder het pad hebben opgegeven in het action-attribuut van de formuliertag.

Uiteindelijk zal zijn code er als volgt uitzien:

Uw bericht is succesvol verzonden \" javascript: history.back()\" >Ga terug

" ;
if (! leeg ($_POST [ "naam" ] ) en ! leeg ($_POST [ "telefoon" ] ) en ! leeg ($_POST [ "mail" ] ) en ! leeg ($_POST [ "bericht" ] ) ) ($name = trim (strip_tags ($_POST ["naam"] ) ); $phone = trim (strip_tags ($_POST ["telefoon"] ) ); $mail = trim (strip_tags ($_POST ["mail"] ) ); $message = trim (strip_tags ($_POST ["bericht"] );mail (,, "Ik schreef je: ". $name."
Zijn nummer: " . $phone ." "
Zijn e-mail: " . $mail .
Zijn boodschap: " . $bericht, );
echo
"Uw bericht is succesvol verzonden!
U ontvangt binnenkort een antwoord

$terug "

;

\" javascript: history.back()\" >Ga terug

" ;

Uitgang ; ) else (echo; exit;) ?>

U kunt de bespreking van de HTML- en CSS-gedeelten van dit document overslaan. In de kern is dit een reguliere websitepagina die u kunt ontwerpen volgens uw wensen en behoeften. Laten we eens kijken naar het belangrijkste onderdeel: het PHP-script voor het verwerken van het formulier: $terug = " Met deze regel creëren we een link om terug te keren naar de vorige pagina. Omdat we op voorhand niet weten vanaf welke pagina de gebruiker op deze pagina komt, gebeurt dit met behulp van een kleine JS-functie. In de toekomst zullen we eenvoudigweg toegang krijgen tot deze variabele om deze weer te geven op de plaatsen die we nodig hebben. if (! leeg ($_POST [ "naam" ] ) en ! leeg ($_POST [ "telefoon" ] ) en ! leeg ($_POST [ "mail" ] ) en ! leeg ($_POST [ "bericht" ] ) ) (//intern deel van de handler

) anders (echo

Als alle velden zijn ingevuld, begint het script de gegevens in het interne gedeelte te verwerken, maar als ten minste één veld niet is ingevuld, wordt er een bericht weergegeven op het scherm van de gebruiker waarin wordt gevraagd alle velden in te vullen. velden van het formulier echo “Om een ​​bericht te verzenden, vult u alle velden in $back” en een link om terug te keren naar de vorige pagina die we met de allereerste regel hebben gemaakt.

Vervolgens plakken we in het interne deel van de formulierhandler:

$name = trim (strip_tags ($_POST ["naam"] ) );

$phone = trim(strip_tags($_POST["telefoon"]));

$mail = trim(strip_tags($_POST["mail"]));

$bericht = trim(strip_tags($_POST["bericht"]));

Daarom hebben we de door de gebruiker ingevoerde gegevens uit html-tags en extra spaties verwijderd. Hierdoor kunnen we onszelf beschermen tegen het ontvangen van kwaadaardige code in berichten die naar ons worden verzonden.

De controles kunnen ingewikkelder worden gemaakt, maar dit is naar eigen goeddunken. We hebben al minimale bescherming aan de serverzijde geïnstalleerd. De rest doen we aan de clientzijde met behulp van JS. Ik raad niet aan om de formulierbeveiliging aan de serverkant volledig op te geven ten gunste van JS, aangezien er, hoewel uiterst zeldzaam, unieke zijn waarbij JS is uitgeschakeld in de browser., Voeg na het opschonen van de tags het verzenden van een bericht toe: mail (
if (! leeg ($_POST [ "naam" ] ) en ! leeg ($_POST [ "telefoon" ] ) en ! leeg ($_POST [ "mail" ] ) en ! leeg ($_POST [ "bericht" ] ) ) ($name = trim (strip_tags ($_POST ["naam"] ) ); $phone = trim (strip_tags ($_POST ["telefoon"] ) ); $mail = trim (strip_tags ($_POST ["mail"] ) ); $message = trim (strip_tags ($_POST ["bericht"] );mail (,, "Ik schreef je: ". $name."
Zijn nummer: " . $phone ." "
"[email protected]"
'Brief van uw_site_adres' , "Schreef je: " . $naam . ") ;

Zijn boodschap: "

  1. . $ bericht
  2. "Inhoudstype:text/html;charset=windows-1251"
  3. Het is deze lijn die verantwoordelijk is voor het genereren en verzenden van het bericht naar ons. Het wordt als volgt ingevuld: < br /> [email protected]” – hier plaatst u uw e-mailadres tussen de aanhalingstekens < br /> “Brief van uw_site_adres” is het onderwerp van het bericht dat naar uw e-mail wordt verzonden. Je kunt hier alles schrijven. < br /> "Schreef je: ".$naam." < br /> Zijn nummer: ".$phone."
  4. Zijn e-mail: ".$mail."

Zijn bericht: ".$message – we vormen de berichttekst zelf. $name – we voegen de informatie in die de gebruiker heeft ingevuld door de velden uit de vorige stap te openen, tussen aanhalingstekens beschrijven we wat dit veld betekent, met de tag

We breken de lijn zodat het bericht als geheel leesbaar is. < meta http- equiv= "Content-Type" content= Content-type:text/html;charset=windows-1251 - aan het einde is er een expliciete indicatie van het gegevenstype dat in het bericht wordt verzonden en de codering ervan. /> BELANGRIJK!

Veel mensen geven niet expliciet de codering aan van het bericht dat wordt verzonden, maar bij sommige e-mailclients kan dit in de toekomst problemen veroorzaken (onleesbare e-mails worden naar de mail verzonden), dus ik raad aan om dit toch te specificeren.

Het controleren van het formulier op de juistheid van de ingevulde gegevens

Om ervoor te zorgen dat gebruikers niet per ongeluk velden missen en alles correct invullen, is het de moeite waard om de ingevoerde gegevens te controleren.

Dit kan zowel in PHP aan de serverzijde als in JS aan de clientzijde. Ik gebruik de tweede optie, omdat iemand op deze manier onmiddellijk kan achterhalen wat hij verkeerd heeft gedaan en de fout kan corrigeren zonder extra pagina-overgangen te maken.

We plakken de scriptcode in hetzelfde bestand waar we het HTML-gedeelte van het formulier hebben. Voor ons geval zal het er als volgt uitzien:

< script>function checkForm(form) ( var naam = formulier. naam. waarde; var n = naam. match(/ ^[ A- Za- zA- Jaa- z ] * [ A- Za- zA- Ja- z ] + $/ ); als (!n) (waarschuwing( "De ingevoerde naam is onjuist, corrigeer de fout"); retour vals;) var telefoon = formulier. telefoon. waarde; var p = telefoon. overeenkomen(/ ^[ 0 - 9 + ] [ 0 - 9 - ] * [ 0 - 9 - ] + $/ ); als (! p) ( alert("Telefoonnummer verkeerd ingevoerd"

);

retour vals; ) var mail = formulier. mail. waarde; var m = mail. match(/ ^[ A- Za- z0- 9 ] [ A- Za- z0- 9 \. _- ] * [ A- Za- z0- 9 _] *@ ([ A- Za- z0- 9 ] + ([ A- Za- z0- 9 - ] * [ A- Za- z0- 9 ] + ) * \ ) + [ A- Za- z] + $/ ) ; als (! m) ( alert(

< form method= "post" action= "mail.php" onSubmit= "return checkForm(this)" >

"Het ingevoerde e-mailadres is onjuist, corrigeer de fout"


);

retour vals; ) retourneert waar;

De definitie van een tekstveld omvat drie attributen:

  • naam - de naam van de variabele waarin de ingevoerde gegevens zijn opgeslagen;
  • rijen -- aantal regels in het tekstgebied;
  • cols -- aantal kolommen in het tekstgebied.

Het tekstgebied wordt getoond in Fig. 10.2.

Rijst. 10.2. Tekstgebied

Muisvriendelijke vormelementen

In andere formulierelementen selecteert de gebruiker een van de vooraf gedefinieerde opties met behulp van de muis. Ik beperk mij tot het beschrijven van selectievakjes, keuzerondjes en vervolgkeuzelijsten.

Selectievakjes worden gebruikt in situaties waarin de gebruiker een of meer opties uit een kant-en-klare set selecteert, vergelijkbaar met de manier waarop selectievakjes op vragenlijsten worden geplaatst. De syntaxis voor het definiëren van een selectievakje is:

De definitie van het selectievakje omvat drie attributen:

  • type -- elementtype (voor selectievakjes -- selectievakje);
  • waarde - de standaardwaarde die aan de variabele is toegewezen. Als het selectievakje is aangevinkt, is dit de waarde die wordt toegewezen aan de variabele met de opgegeven naam. Als het selectievakje niet is ingeschakeld, wordt het kenmerk waarde niet gebruikt.

Het selectievakje wordt getoond in Fig. 10.3.

Rijst. 10.3. Selectievakje

Schakelaar

Een keuzerondje is een soort selectievakje; het werkt vrijwel hetzelfde met één uitzondering: er kan altijd maar één schakelaar in een groep worden ingesteld. De syntaxis voor het definiëren van een keuzerondje is:

Zoals u kunt zien, is de syntaxis vrijwel hetzelfde als de definitie van een selectievakje. De definitie van de veldkeuzerondjes omvat drie attributen:

  • type -- elementtype (voor keuzerondjes);
  • naam - de naam van de variabele waarin de ingevoerde gegevens zijn opgeslagen (in dit geval de status van het element);
  • waarde - de standaardwaarde die aan de variabele is toegewezen. Als de schakelaar is aangevinkt, is dit de waarde die wordt toegewezen aan de variabele met de opgegeven naam. Als het selectievakje niet is ingeschakeld, wordt het kenmerk waarde niet gebruikt.

De schakelaar wordt getoond in Fig. 10.4.

Rijst. 10.4. Schakelaar

Vervolgkeuzelijst

Vervolgkeuzelijsten zijn vooral handig als u een lange lijst met geldige opties heeft waaruit de gebruiker er één moet selecteren. Meestal worden vervolgkeuzelijsten gebruikt bij het werken met relatief grote datasets, bijvoorbeeld bij het vermelden van Amerikaanse staten of landen. De syntaxis voor het definiëren van een vervolgkeuzelijst is:

De definitie van een verborgen veld omvat drie attributen:

  • type -- elementtype (voor verborgen velden -- verborgen);
  • naam -- de naam van de variabele waarin verborgen gegevens zijn opgeslagen;
  • waarde - de standaardwaarde die is opgeslagen in het verborgen veld.

Over het algemeen is de naam van dit element – ​​verborgen veld – enigszins onnauwkeurig. Hoewel verborgen velden in browsers niet zichtbaar zijn, kan de gebruiker eenvoudigweg de opdracht Bron bekijken uitvoeren en zien welke verborgen waarden in het formulier zijn opgeslagen.

Knop Verzenden

De knop Verzenden initieert de actie die wordt gespecificeerd door het action-attribuut van de tag

. Syntaxis van de definitie:

  • type -- elementtype (voor de knop voor het indienen van gegevens -- indienen);

Rijst. 10.6. Knop Verzenden

Reset-knop

De resetknop annuleert alle wijzigingen die aan formulierelementen zijn aangebracht. Normaal gesproken gebruikt niemand het, maar resetknoppen zijn zo gebruikelijk op formulieren op internet dat ik besloot er een beschrijving van te geven. Syntaxis van de definitie:

=" tekst _op_knop">

De knopdefinitie omvat twee attributen:

  • type -- elementtype (voor resetknop -- reset);
  • waarde - de standaardtekst die op de knop wordt weergegeven.

De resetknop ziet er precies hetzelfde uit als de verzendknop, behalve dat er meestal het woord ‘Reset’ op staat (Figuur 10.6).

Alles bij elkaar: voorbeeldformulier

Van een beschrijving van de basiscomponenten van formulieren gaan we verder met een praktisch voorbeeld: het bouwen van een formulier om door de gebruiker ingevoerde gegevens te verwerken. Stel dat u een formulier wilt maken waarin de gebruiker zijn mening over uw site kan uiten. Een voorbeeld van een dergelijk formulier wordt getoond in Listing 10.1.

Lijst 10.1. Voorbeeld van een gegevensverzamelingsformulier

Neem even de tijd om ons te vertellen wat u van onze site vindt:

Naam:


E-mail:


Hoe vaak bezoekt u onze site?:


Ik koop regelmatig de volgende producten op onze site:

Software

Kookgerei

Koksmutsen

De grootste troef van onze site is:

Productselectie

Cool ontwerp

Klantenservice

Opmerkingen:


Het uiterlijk van het formulier in de browser wordt getoond in Fig. 10.7.

Rijst. 10.7. Voorbeeld van een gegevensinvoerformulier

Alles lijkt duidelijk. De vraag rijst: hoe kunnen we de door de gebruiker ingevoerde gegevens gebruiken en er iets nuttigs mee doen? Het volgende gedeelte, “Formulieren en PHP”, is aan dit onderwerp gewijd.

Vergeet niet: alles wat eerder is gezegd is niets meer dan een introductiecursus. De verstrekte informatie omvat geenszins alle mogelijkheden die de verschillende formulieronderdelen bieden. Voor meer informatie kunt u de vele tutorials over formulieren raadplegen die op internet beschikbaar zijn, evenals boeken over HTML.

Van een voorlopige introductie tot HTML-formulieren gaan we verder met het leuke gedeelte: PHP gebruiken om gegevens te verwerken die door de gebruiker in een formulier zijn ingevoerd.

Formulieren en PHP

Het verwerken van gegevens in formulieren heeft veel gemeen met het verwerken van variabelen die in URL's worden doorgegeven, een onderwerp dat in het vorige hoofdstuk uitvoerig is behandeld.

Inleidende voorbeelden

Met de volgende praktijkvoorbeelden krijgt u verschillende aspecten van formulierverwerking in PHP snel onder de knie. Deze voorbeelden demonstreren verschillende benaderingen voor het implementeren van interactieve functies op een website.

Voorbeeld 1: Formuliergegevens doorgeven van het ene script naar het andere

Het eerste voorbeeld presenteert een typische situatie: wanneer gebruikersgegevens op de ene pagina worden ingevoerd en op een andere worden weergegeven. Listing 10.2 toont de code voor een formulier om een ​​gebruikersnaam en e-mailadres in te voeren. Wanneer de gebruiker op de verzendknop (de Go!)-knop klikt, krijgt het formulier toegang tot de pagina die wordt weergegeven in Listing 10.3. Listing 10.3 drukt op zijn beurt de variabelen $name en $mail af die bij het verzoek zijn doorgegeven.

Lijst 10.2. Eenvoudige vorm

Lijst 10-2

Geef ons wat informatie!

Jouw naam:


Uw e-mail:




Lijst 10.3. Weergave van de gegevens ingevoerd in Listing 10.1

Lijst 10-3

// Naam en e-mailadres afdrukken.



Wat er in algemene termen gebeurt, is dat de gebruiker de formuliervelden invult en op de knop Verzenden klikt. De controle wordt overgebracht naar de pagina die wordt weergegeven in Listing 10.3, waar de gegevens worden opgemaakt en vervolgens worden weergegeven. Zoals je kunt zien, is alles eenvoudig.

Er is een andere manier om formuliergegevens te verwerken, waarbij slechts één script wordt gebruikt. De nadelen van deze methode zijn onder meer de vergroting van het script en, als gevolg daarvan, problemen met bewerken en onderhoud. Er zijn echter ook voordelen: het verminderen van het aantal bestanden waarmee u moet werken. Bovendien vermindert deze optie de redundantie van foutcontroles (een onderwerp dat later in dit hoofdstuk wordt besproken). Natuurlijk is het in sommige situaties lastig om met één script te werken, maar je moet je in ieder geval bewust zijn van deze mogelijkheid. Voorbeeld 2 repliceert voorbeeld 1, maar gebruikt slechts één scenario.

Voorbeeld 2: Alternatieve formulierverwerking (met één script)

Het verwerken van formuliergegevens in één script is relatief eenvoudig. Je controleert of er waarden zijn toegewezen aan formuliervariabelen. Als de waarden zijn toegewezen, verwerkt het script ze (in ons voorbeeld worden ze eenvoudigweg weergegeven) en als dat niet het geval is, wordt het formulier weergegeven. De beslissing of een variabele al dan niet is ingesteld, wordt genomen met behulp van de functie strcmp(), beschreven in hoofdstuk 8. Een voorbeeldimplementatie van een formulier met één script wordt getoond in Listing 10.4. Houd er rekening mee dat het actiekenmerk van het formulier naar dezelfde pagina linkt waarop het formulier zelf is gedefinieerd. Het voorwaardelijke commando if controleert de status van een verborgen veldvariabele met de naam $seenform. Als de waarde $seenform niet is ingesteld, wordt het formulier in de browser weergegeven. Als dit wel is ingesteld, betekent dit dat het formulier door de gebruiker is ingevuld en dat de ingevoerde gegevens door het script zijn verwerkt (in dit voorbeeld is dat zo gewoon weergegeven in de browser).

Lijst 10.4. Gegevens invoeren op een formulier in één scenario

Lijst 10-4

// Alle aanhalingstekens binnen $form moeten worden geëscaped,

Geef ons wat informatie!

Jouw naam:


Uw e-mail:


// De waarde van de verborgen variabele $seenform wordt gebruikt voor verificatie.

if ($gezienform != "y"):

print "Hallo. $naam!. Uw e-mailadres is $email";

Houd er rekening mee dat deze optie enig ongemak met zich meebrengt, omdat de gebruiker bij het opnieuw laden van de pagina niets weet of de formuliervelden correct zijn ingevuld. De foutcontroleprocedure wordt later in dit hoofdstuk besproken, maar voor nu is het voldoende om te onthouden dat gegevensinvoer kan worden gedaan met behulp van één enkel script.

Nu u zich kunt voorstellen hoe eenvoudig formulierbewerkingen zijn, gaan we verder met een interessant voorbeeld: het automatisch verzenden van gebruikersgegevens naar een bepaald e-mailadres. Deze functie is geïmplementeerd in voorbeeld 3.

Voorbeeld 3: Gegevens automatisch per e-mail verzenden

Het is gemakkelijk om gebruikersinvoer in een browser weer te geven, maar het verwerken van gebruikersinvoer is nauwelijks zinvol. Eén manier om informatie te verwerken is door deze per e-mail te verzenden, bijvoorbeeld naar de sitebeheerder. Hoewel u de hyperlink mailto: kunt gebruiken om rechtstreeks vanuit uw browser een bericht te verzenden, moet u er rekening mee houden dat externe e-mailtoepassingen niet op elke computer zijn geconfigureerd. Daarom garandeert het verzenden van berichten vanaf een webformulier een betrouwbaardere garantie dat het bericht bij de ontvanger wordt afgeleverd.

De volgende sectie, mail(), creëert een klein formulier waarin de gebruiker informatie en opmerkingen over de site invoert. De gegevens worden vervolgens op de juiste manier geformatteerd en doorgegeven aan de standaard PHP mail()-functie. Maar voordat we verder gaan met het bouwen van het formulier, moeten we eerst rekening houden met de syntaxis van de functie mail().

De functie mail() verzendt via e-mail een bericht naar de opgegeven ontvanger. Syntaxis van de functie Mail():

Booleaanse mail (stringontvanger, stringonderwerp, stringbericht [, string extra headers])

De onderwerpparameter bevat, zoals u zou verwachten, het onderwerp van het bericht. De berichtparameter bevat de tekst van het bericht en de optionele parameter extra_header is bedoeld om aanvullende informatie (zoals HTML-opmaakkenmerken) op te nemen die met het bericht wordt verzonden.

Op UNIX-systemen gebruikt de functie mail() het hulpprogramma sendmail. In Windows werkt deze functie alleen als u een mailserver hebt geïnstalleerd of als de functie mail() is gekoppeld aan een actieve SMTP-server. Dit probleem wordt opgelost door de SMTP-variabele in het php.ini-bestand te wijzigen.

Als je al het nodige hebt gedaan en de mail()-functie werkt op jouw systeem, probeer dan het volgende fragment (uiteraard het adres [e-mailadres beveiligd] wordt vervangen door uw echte e-mailadres):

$e-mail = " [e-mailadres beveiligd]";

$subject = "Dit is het onderwerp";

$message = "Dit is het bericht";

$headers = "Van: [e-mailadres beveiligd]";

mail($email, $onderwerp, $bericht, $headers);

Hoewel je voor uitgebreide correspondentie uiteraard gespecialiseerde mailprogramma's zoals majordomo (http://www.greatcircle.com/majordomo) moet gebruiken, is in eenvoudige gevallen de PHP mail()-functie voldoende.

Dus nadat u kennis heeft gemaakt met de functie mail(), kunt u deze in de praktijk brengen. Listing 10.5 laat zien hoe u informatie van de gebruiker kunt verkrijgen en deze kunt verzenden naar een adres dat is opgegeven door de scriptbeheerder.

Lijst 10.5. Gebruikersgegevens doorsturen met de functie mail().

Lijst 10-5

// Alle aanhalingstekens binnen $form moeten worden voorzien van een escapeteken.

// anders zal er een fout optreden.

Stuur ons uw opmerkingen!

Jouw naam:


Uw e-mail:


Uw opmerkingen:


// Als het formulier nog niet eerder is weergegeven, geef het dan weer.

// De waarde van de verborgen variabele $seenform wordt gebruikt voor verificatie.

if ($gezienform != "y") :

druk "$formulier" af; anders:

// De variabele $recipient definieert de ontvanger van de formuliergegevens

$ontvanger = " [e-mailadres beveiligd]";

// Berichtonderwerp

$subject = "Gebruikersopmerkingen ($naam)";

// Extra headers $headers = "Van: $email";

// Stuur een bericht of geef een foutmelding

mail($recipient, $subject, $comments, $headers) or die("Kan geen e-mail verzenden!");

// Druk een bericht af voor de gebruiker

print "Bedankt $name dat u even de tijd heeft genomen om ons uw opmerkingen te sturen!";

Niet slecht, toch? Listing 10.5 werkt hetzelfde als Listing 10.4; eerst controleren we of het formulier al eerder is weergegeven. Als dit gebeurt, roept het programma de functie mail() aan en worden de gebruikersgegevens verzonden naar het adres dat is opgegeven door de variabele $recipient. De browser geeft vervolgens een bedankbericht aan de gebruiker weer.

De eenvoudigste uitbreiding van dit voorbeeld zou zijn om een ​​bedankbericht via e-mail te sturen (tweede oproep naar mail()). Het volgende voorbeeld ontwikkelt dit idee: de gebruiker krijgt verschillende nieuwsbrieven aangeboden om uit te kiezen. Geselecteerde stembiljetten worden per e-mail verzonden.

Voorbeeld 4: Verzenden van gevraagde informatie via e-mail

In dit voorbeeld worden verschillende selectievakjes op een formulier gemaakt, die elk overeenkomen met een ander site-informatiedocument. De gebruiker vinkt één, twee of drie vakjes aan, voert zijn adres in en de gevraagde brochures worden naar hem gemaild. Let op het gebruik van een array bij het werken met selectievakjes - dit maakt het gemakkelijker om de geselecteerde vlaggen te controleren en verbetert ook de structuur van het programma.

Informatieberichten worden in aparte bestanden opgeslagen. In ons voorbeeld worden drie tekstbestanden gebruikt:

  • site.txt - informatie over de site;
  • team.txt - informatie over getalenteerde site-ontwikkelaars;
  • events.txt - uitnodiging voor het volgende evenement.

De broncode voor het voorbeeld wordt weergegeven in Listing 10.6.

Lijst 10.6. Het verzenden van door de gebruiker gevraagde informatie

Lijst 10-5

Ontvang informatie over onze site!

Uw e-mail:


Site-architectuur

Ontwikkelingsteam

Aankomende evenementen

if ($gezienform != "y") :

druk "$formulier" af; anders:

$headers = "Van: [e-mailadres beveiligd]";

// Doorloop alle sleutel/waarde-paren

while (lijst($key, Sval) = elke ($informatie)):

// Vergelijk de huidige waarde met "y" if ($val == "y") :

// Construeer de bestandsnaam die overeenkomt met de huidige sleutel

$bestandsnaam = "$key.txt":

$subject = "$key-informatie opgevraagd";

// Bestand openen

$fd = fopen($bestandsnaam, "r");

// Stuur bericht

mail($email, $subject, $contents, $headers) or die("Kan geen e-mail verzenden!");; fclose($fd);

// Informeer de gebruiker over succesvol verzenden

print sizeof($information)." informatieve nieuwsbrieven

zijn verzonden naar $email!";

In Listing 10.6 doorlopen we de sleutel/waarde-paren in een while-lus en sturen we alleen die stembiljetten waarvan de waarde y is. Onthoud de namen van tekstbestanden zou moeten overeenkomen met arraysleutels

(site.txt, team.txt en evenementen.txt). De bestandsnaam wordt dynamisch opgebouwd op basis van de sleutel, waarna het bestand op naam wordt geopend en de inhoud ervan in de variabele ($contents) wordt geladen. De variabele $contents wordt vervolgens als parameter aan de functie mail() doorgegeven.

In het volgende voorbeeld worden gebruikersgegevens opgeslagen in een tekstbestand.

Voorbeeld 5: Gebruikersgegevens opslaan in een tekstbestand

Gebruikersgegevens worden opgeslagen in een tekstbestand voor latere statistische analyse, opzoeking, enz. - kortom, elke verwerking naar eigen goeddunken. Listing 10.7 verwerkt, net als de voorgaande voorbeelden, formuliergegevens in één enkel script. De gebruiker wordt gevraagd vier dataobjecten in te voeren: naam, e-mailadres, taal en beroep. De ingevoerde informatie wordt opgeslagen in het tekstbestand user_information.txt. Gegevensitems worden gescheiden door sluistekens (|).

Lijst 10.7. Gebruikersinformatie opslaan in een tekstbestand

// Maak een formulier

Geef ons uw persoonlijke gegevens!

Jouw naam:


Uw e-mail:


Uw voorkeurstaal:


Uw beroep:""ibr>


// Is het formulier al eerder ingevuld? if ($gezienform != "y") :

druk "$formulier" af; anders:

$fd = fopen("useMnformation.txt", "a");

// Zorg ervoor dat de ingevoerde gegevens geen

// verticale balk.

$naam = str_replace("|", "", $naam);

$email = str_replace("|", "", $email);

// Bouw een string met gebruikersgegevens

$user_row = $naam." ".$email."|".$taal." ".$job."\n";

fwrite($fd, $user_row) or die("Kan niet naar bestand schrijven!");

print "Bedankt dat u even de tijd neemt om onze korte vragenlijst in te vullen!":

Let op het fragment waarin we controleren of de gebruiker geen verticale balken (|) in zijn naam of e-mailadres heeft opgenomen. De functie str_replace() verwijdert deze tekens en vervangt ze door de lege string. Als dit niet gebeurt, worden aangepaste tekens | zou de structuur van het gegevensbestand verstoren en de juiste verwerking ervan aanzienlijk compliceren (of zelfs onmogelijk maken).

Bij het werken met relatief kleine hoeveelheden informatie is het heel goed mogelijk om tekstbestanden te gebruiken. Als er echter een groot aantal gebruikers is of de hoeveelheid informatie die wordt opgeslagen, is het beter om een ​​database te gebruiken om de in het formulier ingevoerde gegevens op te slaan en te verwerken. Dit onderwerp wordt in hoofdstuk 11 uitgebreid besproken.

Tot nu toe werd ervan uitgegaan dat de gebruiker altijd de juiste gegevens invoert en niet kwaadwillig handelt. Een zeer optimistische veronderstelling! In de volgende sectie zullen we de besproken voorbeelden verbeteren en de verificatie van de integriteit van deze formulieren organiseren. Foutcontrole zorgt er niet alleen voor dat onvolledige en onjuiste informatie wordt verwijderd, maar zorgt ook voor een efficiëntere en gebruiksvriendelijkere interface.

Foutcontrole

Het verwerken van gebruikersgegevens levert alleen zinvolle resultaten op als de gegevens de juiste structuur hebben. Er is geen manier om de juistheid van de ingevoerde gegevens te controleren, maar u kunt wel de integriteit ervan controleren (zorg er bijvoorbeeld voor dat het e-mailadres overeenkomt met een standaardsjabloon). Hoewel JavaScript-technologie vaak wordt gebruikt om gegevens te valideren, kunnen er problemen met browser-incompatibiliteit optreden. Omdat de PHP-code aan de serverzijde draait, kunt u er altijd zeker van zijn dat het valideren van de formuliergegevens het gewenste resultaat oplevert (ervan uitgaande dat uw programma correct is uiteraard).

Als er een fout in de gegevens wordt ontdekt, moet de gebruiker hiervan op de hoogte worden gesteld en worden aangeboden om correcties aan te brengen. Er zijn verschillende oplossingen mogelijk, waaronder het simpelweg weergeven van een foutmelding en het aanbieden van alternatieve opties (bijvoorbeeld als de gebruiker een naam selecteert die al door een andere gebruiker is geselecteerd). In dit gedeelte wordt de procedure beschreven voor het controleren en weergeven van berichten,

Voorbeeld 6: informatie weergeven over lege of onjuist ingevulde formuliervelden

Geen enkele website-ontwikkelaar wil een gebruiker irriteren met verwarrende gegevensfoutmeldingen - vooral als de gebruiker aanvullende informatie over een product opvraagt ​​of een aankoop doet! Om ervoor te zorgen dat de gebruiker begrijpt welke formuliervelden leeg zijn of onjuist zijn ingevuld, moeten berichten duidelijk en specifiek zijn.

Wij controleren alle formuliervelden achtereenvolgens en zorgen ervoor dat ze niet leeg blijven. Waar mogelijk wordt gecontroleerd op de juiste structuur van de ingevoerde gegevens. Als de controle succesvol is, gaan we door naar het volgende veld; Anders drukt het programma een foutmelding af, stelt een vlag in die later wordt gebruikt om het formulier opnieuw weer te geven, en gaat verder naar het volgende veld. De procedure wordt herhaald totdat alle formuliervelden zijn gecontroleerd (Lijst 10.8).

Lijst 10.8. Valideren van formuliergegevens en weergeven van foutmeldingen

Lijst 10-8

// Maak een formulier

Geef ons wat informatie!

Jouw naam:


Uw e-mail:


// Is het formulier al eerder ingevuld?

if ($gezienform != "y"):

// De gebruiker heeft het formulier ingevuld. Controleer de ingevoerde gegevens, anders:

$error_flag = "n";

// Zorg ervoor. dat het naamveld informatie bevat

if ($naam == "") :

afdrukken " *Je bent vergeten je naam in te vullen!


":

$error_flag = "y";

// Zorg ervoor. dat het adresveld informatie bevat

if ($e-mail == "") :

afdrukken " *Je bent vergeten je e-mailadres in te vullen!


"

$error_flag = "y";

// Converteer alle alfabetische tekens in het adres

// e-mail naar kleine letters

$email = strtolower(trim($email)):

// Zorg ervoor dat de syntaxis correct is

// e-mailadressen

als (! @eregi("^+".

"(+\.)+".

"()(2,4)$". $e-mail)):

afdrukken " * U heeft een ongeldig e-mailadres ingevoerd!


" :

$error_flag = "y";

// Als de foutvlag $error_flag is ingesteld.

// geef het formulier opnieuw weer

if ($error_flag == "y") : print "$form";

// Verwerk gebruikersgegevens

print "Je hebt geldige formuliergegevens ingevoerd!";

Het programma in Listing 10.8 zorgt ervoor dat de naam- en e-mailadresvelden niet leeg worden gelaten, en controleert ook of de syntaxis van het ingevoerde adres correct is. Als er bij eventuele controles fouten in het formulier worden ontdekt, geeft het programma de juiste meldingen weer En geeft het formulier opnieuw weer - met alle eerder ingevoerde informatie blijft in het formulier, waardoor het voor de gebruiker gemakkelijker wordt om correcties aan te brengen. Als u een leeg formulier weergeeft en de gebruiker vraagt ​​het opnieuw in te vullen, kan hij gaan

voor het gewenste product of dienst elders.

Dynamisch vormontwerp

Tot nu toe heb ik alle formulieren handmatig geprogrammeerd. Elke programmeur weet dat handmatig coderen slecht is omdat het de kans op fouten vergroot, om nog maar te zwijgen van onnodige tijd.

In de volgende sectie presenteer ik een scenario waarin een vervolgkeuzelijst dynamisch wordt opgebouwd op basis van de inhoud van een array. Deze techniek is echter eenvoudig

het bespaart veel tijd, zowel tijdens de initiële programmering als tijdens het daaropvolgende programma-onderhoud.

Voorbeeld 7: Een vervolgkeuzelijst samenstellen

Stel dat u een lijst heeft met websites die u een bezoeker wilt aanbevelen vanwege hun coole ontwerp. In plaats van elke rij van de lijst hard te coderen, kunt u een array maken en de inhoud ervan gebruiken om de lijst te vullen.

Listing 10.9 implementeert, net als de voorgaande voorbeelden, een optie met één script. Eerst controleren we of aan de variabele $site een waarde is toegewezen. Als de controle positief is, wordt de functie header() aangeroepen met een parameter waarin de waarde van $site wordt toegevoegd aan de string "Location:http://". Wanneer deze opdracht wordt doorgegeven, leidt de headerfunctie de browser om naar de opgegeven URL. Als de variabele $site niet is ingesteld, wordt het formulier in de browser weergegeven. De vervolgkeuzelijst is in een lus gebouwd, het aantal iteraties is afhankelijk van de grootte van de Sfavsites-array. In vermelding 10.9 heb ik vijf van mijn favoriete sites in deze reeks opgenomen. Natuurlijk kunt u zoveel van uw sites eraan toevoegen als u wilt.

Een belangrijk ding om te onthouden is dat de header()-functie moet worden aangeroepen voordat de gegevens in de browser worden weergegeven. Het kan niet zomaar op elk punt in een PHP-script worden aangeroepen. Verkeerd getimede header()-aanroepen veroorzaken zoveel problemen voor onervaren PHP-programmeurs dat ik aanbeveel deze regel vijf keer te herhalen, zodat u deze beter kunt onthouden.

Lijst 10.9. Dynamisch een vervolgkeuzelijst opbouwen

if ($site != "") :

header("Locatie: http://Ssite");

Lijst 10-9</Fit1e></p> <p><body bgcolor="#ffffff" text="#000000" Iink="#cbda74" vlink="#808040" alink="#808040"</p> <p>$favsites = array("www.k10k.com". "www.yahoo.com",</p> <p>"www.drudgereport.com",</p> <p>"www.phprecipes.com",</p> <p>"www.frogdesign.com"):</p> <p>// Maak een formulier</p> <p><form action = "Listing10-9.php" method="post"></p> <p><select name="site"></p> <p><option value = "">Kies een locatie:</p> <p>terwijl ($x< sizeof ($favsites)) :</p> <p>afdrukken " <option value="$favsites[$x]">$favsites[$x]";</p> <p><input type="submit" value="gaan!"></p> <p>Dynamisch formulierontwerp is vooral handig bij het verwerken van grote hoeveelheden gegevens die op elk moment kunnen veranderen, waardoor alle hardgecodeerde formulierinformatie verouderd raakt. Ik raad echter aan om alle statische gegevens (bijvoorbeeld een lijst met Amerikaanse staten) hard te coderen, omdat dit het programma zal versnellen.</p> <h2>Project: Een gastenboek schrijven in PHP</h2> <p>Eerst wordt een initialisatiebestand gemaakt dat enkele globale variabelen en applicatiefuncties bevat (Listing 10.10).</p> <b> <i> </i> </b><p>Lijst 10.10. <i>Het init.inc-bestand dat wordt gebruikt bij het maken van een gastenboek</i></p> <p>// Bestand: init.inc</p> <p>// Doel: globale variabelen en functies voor het gastenboekproject</p> <p>// Standaard paginatitel</p> <p>$title = "Mijn gastenboek";!}</p> <p>// Achtergrondkleur</p> <p>$bg_color = "wit": /</p> <p>// Lettertype</p> <p>$font_face = "Arial, Verdana, Times New Roman";</p> <p>// Letterkleur</p> <p>$font_color = "zwart";</p> <p>// Postdatum $post_date - date("M d y");</p> <p>// Gastenboekgegevensbestand</p> <p>$guest_file = "commentaar.txt";</p> <p>// De functie leest de gastenboekgegevens</p> <p>//en geeft ze weer in de browser</p> <p>functie view_guest($guest_file) (</p> <p>GLOBAL $font_face, $font_color;</p> <p>afdrukken "Terug naar <a href=\"index.php\">index</a>,<br><br>";</p> <p>// Als er gegevens in het gastenboekbestand staan...</p> <p>if (bestandsgrootte($guest_file) > 0):</p> <p>// Open het gegevensbestand van het gastenboek</p> <p>$fh = fopen($guest_file. "r") or die("Kan $guest_file niet openen");</p> <p>afdrukken " <table border=1 cellpadding=2 cellspacing=0 width=\"600\">";</p> <p>// Herhaal tot het einde van het bestand</p> <p>$ lijn<= fgetsdfh, 4096);</p> <p>// Splits de string in componenten</p> <p>// en wijs elke component toe aan een variabele</p> <p>list($date. $name, $email, $comments) = explode("|", $line):</p> <p>// Als de naam van de bezoeker is opgegeven, geeft u deze weer</p> <p>if ($naam != "") :</p> <p>afdrukken " <tr>":</p> <p>afdrukken " <td><font color=\"$font_co!or\"</p> <p>face=\"$font_face\">Datum:</font></td>";</p> <p>afdrukken " <td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$datum</font></td>";</p> <p>afdrukken "</tr>";</p> <p>afdrukken " <tr>";</p> <p>afdrukken " <td><font color=\"$font_color\"</p> <p>face=\"$font_face\">Naam:</font></td>";</p> <p>afdrukken " <td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$naam</font></td>";</p> <p>afdrukken "</tr>";</p> <p>afdrukken " <tr>";</p> <p>afdrukken " <td><font color=\"$font_color\"</p> <p>face=\"$font_face\">E-mail:</font></td>";</p> <p>afdrukken " <td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$e-mail</font></td>";</p> <p>afdrukken "</tr>";</p> <p>afdrukken " <tr>";</p> <p>afdrukken " <td valign=\"top\"><font color=\"$font_color\"</p> <p>face=\"$font_face\">Bericht:</font></td>";</p> <p>afdrukken " <td><font color=\"$font_color\"</p> <p>face=\"$font_face\">$commentaar</font></td>";</p> <p>afdrukken "</tr>";</p> <p>afdrukken " <tr><td colspan=\"2\"> :</td></tr>";</p> <p>afdrukken "</table>";</p> <p>// Bestand sluiten</p> <p>afdrukken " <h3>Momenteel zijn er geen berichten in het gastenboek!</h3>";</p> <p>// De functie slaat de nieuwe informatie op in het gegevensbestand</p> <p>function add_guest($name, $email, $comments) (</p> <p>GLOBAL $post_date, $guest_file;</p> <p>// Formatteer de invoergegevens,</p> <p>$contents = "$post_date|$name|$email |$comments\n";</p> <p>// Gegevensbestand openen</p> <p>$fh = fopen($guest_file. "a") of dieC"Kan $guest_file niet openen!");</p> <p>// Schrijf gegevens naar bestand</p> <p>$wr = fwrite($fh, $contents) or die("Kon niet schrijven naar $guest_file!");</p> <p>// Sluit het bestand fclose($fh);</p> <p>Vervolgens worden er nog drie bestanden aangemaakt: het index.php-linkbestand, het add_guest.php-bestand om de gastenboekinformatie weer te geven, en het view_guest.php-bestand om nieuwe gegevens in te voeren. Het index.php-bestand (Listing 10.11) toont eenvoudigweg twee links om de basisfuncties van een gastenboek uit te voeren: het bekijken en toevoegen van nieuwe gegevens. Deze links kunnen eenvoudig worden opgenomen in een site met een complexere structuur.</p> <i> </i><p><b>Lijst 10.11.</b> Index.php-bestand met links voor het bekijken en toevoegen van nieuwe gegevens aan het gastenboek</p> <p>INCLUDE("init.inc");</p> <p><title><?=$page_title;?>

Bekijk het gastenboek!

Teken het gastenboek!

Het bestand view_guest.php (Listing 10.12) toont alle gastenboekinformatie die in het gegevensbestand is opgeslagen.

Lijst 10.12. Bestand view_guest.php

INCLUDE("init.inc");

vi ew_guest($guest_file);

Het add_guest.php bestand (Listing 10.13) vraagt ​​de gebruiker om nieuwe informatie om toe te voegen aan het gastenboek. De ingevoerde gegevens worden vastgelegd in een gegevensbestand.

Lijst 10.13. Bestand add_guest.php

INCLUDE("init.inc");

<?=$page_title:?>

// Als het formulier nog niet is weergegeven, vraag dan gegevens op bij de gebruiker

if (! $gezienform):



Opmerking:


// Het formulier is al weergegeven - voeg gegevens toe aan een tekstbestand.

add_guest($naam, $e-mail, $commentaar);

afdrukken "

Uw opmerkingen zijn toegevoegd aan het gastenboek.

Klik hier om terug te keren naar de index.

";

De belangrijkste voordelen van modulaire applicatieontwikkeling zijn onder meer het gemak van aanpassing aan andere systemen. Stel dat u besluit over te schakelen van het opslaan van gegevens in een tekstbestand naar het gebruik van een database. Wijzig gewoon de inhoud van add_guest() en view_guest(), en uw gastenboek zal gaan werken met de database.

In afb. Figuur 10.8 laat zien hoe het gastenboek eruit ziet na het opslaan van een aantal vermeldingen.

Rijst. 10.8. Bekijk het gastenboek (view_guest.php)

De informatie getoond in Afb. 10.8, wordt in de volgende vorm in het gegevensbestand opgeslagen:

29 okt 00|Michele| [e-mailadres beveiligd]|Ik hou van kaas!

29 okt 00|Nino| [e-mailadres beveiligd]|Geweldige website!

Resultaten

Het verwerken van formuliergegevens is een van de sterkste punten van PHP, omdat het eenvoud en betrouwbaarheid combineert met een van de belangrijkste aspecten van elke website: interactiviteit. Dit hoofdstuk behandelde een breed scala aan onderwerpen gerelateerd aan formulieren en de rol van PHP bij het verwerken van formuliergegevens, waaronder:

  • algemene informatie over formuliersyntaxis;
  • formuliergegevens doorgeven tussen PHP-scripts;
  • formulieren verwerken in één script;
  • functie mail();
  • het verzenden van formuliergegevens per e-mail;
  • automatische verwerking van gebruikersverzoeken om informatie;
  • het opslaan van gebruikersgegevens in een tekstbestand;
  • foutcontrole;
  • dynamisch ontwerp van vormen.

Als u met een aanzienlijke hoeveelheid informatie gaat werken, zou een van de eerste stappen op dit pad de integratie van de database in de sitestructuur moeten zijn. Dit onderwerp wordt in het volgende hoofdstuk behandeld.

Kortom, methoden worden gebruikt om parameters door te geven NA) retourneert waar; KRIJGEN.
Het belangrijkste verschil tussen de methoden NA) retourneert waar; KRIJGEN ligt in de manier waarop informatie wordt overgedragen. In methode KRIJGEN parameters worden doorgegeven via de adresbalk ( URL), d.w.z. V HTTP-request header, terwijl je in de methode bent NA parameters worden door het lichaam doorgegeven HTTP-verzoek en worden op geen enkele manier weergegeven in de adresbalk.

1. Knoppen – Label

Label vereist.
Parameters:
gehandicapt– blokkeert de toegang en wijziging van een element.
type– knoptype
waarde– De waarde van de knop die naar de server wordt verzonden of wordt gelezen met sprips.


Parameter GEHANDICAPT
Blokkeert de toegang en wijziging van de knop. In dit geval wordt het grijs weergegeven en kan het niet door de gebruiker worden geactiveerd. Bovendien kan een dergelijke knop niet worden gefocust door op de toets te drukken Tab, muis of andere methode. Deze knopstatus kan echter via scripts worden gewijzigd.

Parameter TYPE
Definieert het knoptype, dat het gedrag ervan op het formulier bepaalt. De verschillende soorten knoppen verschillen qua uiterlijk op geen enkele manier, maar elke knop heeft zijn eigen functies. Standaardwaarde: knop.
Argumenten:
knop– Normale knop.
opnieuw instellen– Een knop om de ingevoerde formuliergegevens te wissen en de waarden terug te zetten naar hun oorspronkelijke staat.

Verzenden – Knop voor het verzenden van formuliergegevens naar de server.

Parameter WAARDE Definieert de knopwaarde die naar de server wordt verzonden. Een paar " naam=waarde", waarbij de naam wordt gespecificeerd door de naamparameter van de tag

1.1. Knop (invoertype=knop)
1.2. Knop met afbeelding (invoertype=afbeelding)

Knoppen met afbeeldingen lijken qua werking op een knop Indienen, maar vertegenwoordigen een tekening. Om dit te doen, zetten we type=afbeelding) retourneert waar; src="afbeelding.gif".

Wanneer de gebruiker ergens op de afbeelding klikt, wordt het bijbehorende formulier met twee extra variabelen naar de server verzonden sub_x) retourneert waar; sub_y. Ze bevatten de coördinaten van de gebruiker die op de afbeelding klikt. Ervaren programmeurs zullen misschien opmerken dat de namen van variabelen die door de browser worden verzonden eigenlijk een punt bevatten in plaats van een onderstrepingsteken, maar PHP converteert de punt automatisch naar een onderstrepingsteken.

1.3. Knop Formulier indienen (invoertype=verzenden)

Dient om het formulier bij het script in te dienen. Wanneer u een knop maakt om een ​​formulier in te dienen, moet u 2 kenmerken opgeven: type = "verzenden") retourneert waar; value="Knoptekst" !}. Het naamattribuut is vereist als er niet één knop is, maar meerdere, en deze allemaal zijn gemaakt voor verschillende bewerkingen, bijvoorbeeld de knoppen “Opslaan”, “Verwijderen”, “Bewerken”, enz. Nadat u op de knop hebt geklikt, wordt aan het script de tekenreeks naam=knoptekst doorgegeven.


Geen PHP-script vereist.

1.4. Een reeks knoppen (verzenden) voor het selecteren van een actieoptie
2. Resetknop

Wanneer u op de resetknop drukt ( opnieuw instellen), worden alle formulierelementen ingesteld op de staat die is opgegeven in de standaardattributen, en wordt het formulier niet verzonden.


Geen PHP-script vereist.

3. Selectievakje

Selectievakjes bieden de gebruiker een aantal opties en maken willekeurige selectie mogelijk (geen, één of meer).

Wit
Groente
Blauw
Rood
Zwart
$go) ( echo $index." - > ".$go."
"; }; };

4. Schakelaar (radio)

Radioschakelaars bieden de gebruiker een aantal opties, maar laten er slechts één selecteren.
Voorbeeld 1.

Wit
Groente
Blauw
Rood
Zwart

Voorbeeld 2.
// eerste set knoppen
// tweede set knoppen
// derde set knoppen
\n"; ?>

5. Tekstveld (tekst)

Bij het maken van een normaal tekstveld met grootte en maximaal toegestane lengte maximale lengte tekens, het type attribuut neemt de waarde over tekst. Als de parameter is opgegeven waarde, waarna het veld de waarde weergeeft die in de variabele is opgegeven. Vergeet bij het aanmaken van een veld niet de veldnaam op te geven, want... dit attribuut is vereist.

6. Wachtwoordveld

Precies hetzelfde als een tekstveld, behalve dat de door de gebruiker getypte tekens niet op het scherm worden weergegeven.

7. Verborgen tekstveld (verborgen)

Hiermee kunt u bepaalde service-informatie aan het script doorgeven zonder deze op de pagina weer te geven.

8. Dropdownlijst (selecteren)

Label . Labels kunt u de inhoud van de lijst en de parameter bepalen waarde definieert de waarde van de tekenreeks. Indien in een label opgegeven parameter gekozen, dan wordt de rij in eerste instantie geselecteerd. De parameter size geeft aan hoeveel regels de lijst zal beslaan. Als maat gelijk aan 1 , dan is de lijst een vervolgkeuzelijst. Als attribuut is opgegeven meerdere, dan mag u meerdere elementen uit de lijst selecteren. Maar dit schema wordt praktisch niet gebruikt, en wanneer maat = 1 heeft geen zin.

Als u een vervolgkeuzelijst met een voorspelbare volgorde wilt maken. Bijvoorbeeld een lijst met jaren van 2000 tot en met 2050. Vervolgens wordt de volgende techniek gebruikt.

9. Meerregelig tekstinvoerveld (tekstgebied)

Met een tekstinvoerveld met meerdere regels kunt u niet slechts één regel, maar meerdere regels tegelijk verzenden. Indien nodig kunt u het attribuut opgeven alleen-lezen, dat het bewerken, verwijderen en wijzigen van tekst verbiedt, d.w.z. de tekst is alleen-lezen. Als het nodig is dat de tekst in eerste instantie in een meerregelig invoerveld wordt weergegeven, moet deze tussen de tags worden geplaatst .
Er is een parameter wrap– taak van regeleinden. Mogelijke waarden:
uit– schakelt regelterugloop uit;
virtueel– toont regeleinden, maar verzendt de tekst zoals deze is ingevoerd;
fysiek– regeleinden blijven in hun oorspronkelijke vorm.
Standaardtag

Om ervoor te zorgen dat een tekstveld met meerdere regels voldoet aan de HTML-opmaak (regelomloop met behulp van de tag
of
), gebruik dan de functie nl2br():

10. Knop voor het uploaden van bestanden (bladeren)

Dient voor het implementeren van het uploaden van bestanden naar de server. Wanneer u een tekstveld maakt, moet u ook het veldtype opgeven type Hoe "bestand".

Bestand uploaden:

Manieren waarop de browser met de server communiceert

Methoden geboden door het protocol HTTP, Een beetje. Dit is belangrijke informatie. Er zijn geen andere manieren. In de praktijk worden er twee gebruikt:
KRIJGEN– dit is wanneer gegevens worden overgedragen in de adresbalk, bijvoorbeeld wanneer de gebruiker op een link klikt.
NA– wanneer hij op een knop op het formulier drukt.

GET-methode

Om gegevens door te geven met behulp van de methode KRIJGEN het is niet nodig om een ​​formulier op de HTML-pagina te maken (gebruik formulieren voor verzoeken met behulp van de KRIJGEN niemand houdt je tegen) - alleen een link naar het document met de toevoeging van een queryreeks, die eruit kan zien als variabele=waarde. Paren worden aaneengeschakeld met behulp van het ampersand &, en de tekenreeks wordt aan de pagina-URL toegevoegd met behulp van een vraagteken " ? ».
Maar u hoeft geen sleutel=waarde-paren te gebruiken als u slechts één variabele moet doorgeven. Om dit te doen, moet u de WAARDE (niet de naam) van de variabele na het vraagteken schrijven.
Voordeel Het op deze manier doorgeven van parameters is dat clients die de methode niet kunnen gebruiken NA(bijvoorbeeld zoekmachines) kunnen, simpelweg door de link te volgen, nog steeds parameters aan het script doorgeven en de inhoud ontvangen.
Gebrek is dat de gebruiker simpelweg door de parameters in de adresbalk te wijzigen het script op een onvoorspelbare manier kan omdraaien en dit creëert een enorm beveiligingslek, gecombineerd met ongedefinieerde variabelen en register_globals aan of iemand kan de waarde van een belangrijke variabele achterhalen (bijvoorbeeld Identiteitskaart-sessies), gewoon door naar het beeldscherm te kijken.
:
- voor toegang tot openbare pagina's met doorgeefparameters (verbeterde functionaliteit)
- overdracht van informatie die geen invloed heeft op het beveiligingsniveau
:
- voor toegang tot beveiligde pagina's met parameteroverdracht
- het doorgeven van informatie die van invloed is op het veiligheidsniveau
- om informatie te verzenden die niet door de gebruiker kan worden gewijzigd (sommige verzenden de tekst van SQL-query's).

POST-methode

Geef gegevens door met behulp van de methode NA Dit is alleen mogelijk via een formulier op een HTML-pagina. Belangrijkste verschil NA van KRIJGEN het feit dat de gegevens niet in de verzoekheader maar in de hoofdtekst worden verzonden, waardoor de gebruiker deze niet ziet. U kunt het alleen wijzigen door het formulier zelf te wijzigen.
Voordeel:
- grotere veiligheid en functionaliteit van verzoeken met behulp van formulieren met behulp van de POST-methode.
Gebrek:
- minder beschikbaarheid.
Waar moet je het voor gebruiken?:
- voor het verzenden van een grote hoeveelheid informatie (tekst, bestanden..);
- om belangrijke informatie door te geven;
- om de toegang te beperken (gebruik bijvoorbeeld alleen het formulier voor navigatie - een optie die niet voor alle robotprogramma's of contentgrabbers beschikbaar is).
Waar het niet voor gebruikt mag worden:

PHP kan een bestand accepteren dat met elke browser is gedownload. Hierdoor is het mogelijk om zowel tekst- als binaire bestanden te uploaden. Gecombineerd met PHP-authenticatie en bestandssysteemfuncties heeft u volledige controle over wie bestanden mag uploaden en wat u met het bestand moet doen nadat het is geüpload.
De bestandsuploadpagina kan worden geïmplementeerd met behulp van een speciaal formulier dat er ongeveer zo uitziet:

//Formulier voor het uploaden van bestanden

Stuur dit bestand:

In het bovenstaande voorbeeld "URL" moet worden vervangen door een link naar een PHP-script. Verborgen veld MAX_FILE_SIZE(waarde moet worden opgegeven in bytes) moet voorafgaan aan het bestandsselectieveld en de waarde ervan is de maximaal toegestane bestandsgrootte die kan worden geaccepteerd. Zorg er ook voor dat u in de formulierkenmerken opgeeft enctype=”multipart/form-data”, anders worden bestanden niet naar de server geüpload.
Aandacht
Optie MAX_FILE_SIZE is een browseraanbeveling, zelfs als PHP ook op deze voorwaarde zou controleren. Het omzeilen van deze beperking aan de browserkant is vrij eenvoudig, dus u moet niet op deze functie vertrouwen om alle grotere bestanden te blokkeren. Er is echter geen manier om de maximale groottebeperking van PHP te omzeilen. U moet hoe dan ook de formuliervariabele toevoegen MAX_FILE_SIZE, omdat het voorkomt dat gebruikers angstig wachten tijdens het overbrengen van grote bestanden, om er vervolgens achter te komen dat het bestand te groot is en dat de overdracht feitelijk is mislukt.

Hoe definieer ik een verzoekmethode?

Direct:

Getenv("REQUEST_METHOD");

zal terugkeren KRIJGEN of NA.

Welke methode moet worden gebruikt?

Als het formulier wordt gebruikt om bepaalde informatie op te vragen, bijvoorbeeld tijdens een zoekopdracht, moet het via deze methode worden verzonden KRIJGEN. Om de pagina up-to-date te houden, kunt u er een bladwijzer voor maken en/of de link naar een vriend sturen.
Als er als gevolg van het indienen van een formulier gegevens op de server worden geschreven of gewijzigd, moeten deze via deze methode worden verzonden NA, en het is absoluut noodzakelijk om, na verwerking van het formulier, de browser om te leiden met behulp van de methode KRIJGEN. Ook, NA kan nodig zijn als u een grote hoeveelheid gegevens naar de server moet overbrengen (bijv KRIJGEN dit is zeer beperkt), evenals of de verzonden gegevens niet in de adresbalk mogen worden “getoond” (bijvoorbeeld bij het invoeren van een login en wachtwoord).
In ieder geval na verwerking NA U moet de browser altijd omleiden naar een pagina, zelfs dezelfde, maar zonder de formuliergegevens, zodat deze niet opnieuw worden geregistreerd wanneer de pagina wordt vernieuwd.

Hoe kan ik gegevens rechtstreeks vanuit de hoofdtekst van een PHP-programma naar een ander bestand overbrengen met behulp van de GET- en POST-methoden?

Een voorbeeld om te demonstreren dat gegevens gelijktijdig worden verzonden met behulp van de POST- en GET-methoden en een antwoord ontvangen van de server.

Vaak kunt u op websites pagina's vinden waarop HTML-formulieren zijn geplaatst. Webformulieren zijn een handige manier om informatie van bezoekers van uw site te ontvangen. Een voorbeeld hiervan is het gastenboek, waarin feedback wordt gegeven aan bezoekers en site-ontwikkelaars. Formulieren zijn ook handig voor site-ontwikkelaars bij het ontwikkelen van een CMS, waardoor ze de belangrijkste eigenschap van de site kunnen behouden: relevantie. Dit artikel is gewijd aan de basisprincipes van het maken van HTML-formulieren, de verwerking ervan en manieren om gegevens van schermformulieren naar PHP-scripts over te dragen.

1) Maak een eenvoudig formulier

Labels

) retourneert waar;
definieer het begin en einde van het formulier. Startformuliertag
bevat twee attributen: actie) retourneert waar; methode. Het action-attribuut bevat de script-URL die moet worden aangeroepen om het script te verwerken. Attribuut methode vertelt de browser welk type HTTP-verzoek moet worden gebruikt om het formulier in te dienen; mogelijke waarden NA) retourneert waar; KRIJGEN.

Opmerking

Het belangrijkste verschil tussen de POST- en GET-methoden is de manier waarop informatie wordt overgedragen. Bij de GET-methode worden parameters via de adresbalk doorgegeven, d.w.z. hoofdzakelijk in de HTTP-verzoekheader, terwijl bij de POST-methode de parameters worden verzonden via de hoofdtekst van het HTTP-verzoek en op geen enkele manier worden weerspiegeld in de adresbalk.

$text = nl2br($_POST["mijntekst"]);
?>

Taak: Stel dat u een vervolgkeuzelijst moet maken met de jaren van 2000 tot 2050.
Oplossing: U moet een HTML-formulier maken met een SELECT-element en een PHP-script voor het verwerken van het formulier.

Discussie:

Laten we eerst twee bestanden maken: formulier.html) retourneert waar; actie.php. In bestand formulier.html bevat een HTML-formulier met een vervolgkeuzelijst. Bovendien kunnen de waarden in de lijst op twee manieren worden gespecificeerd:

I. Handmatige gegevensinvoer:

II. Gegevens invoeren via een lus:

Zoals je kunt zien, is het tweede voorbeeld met een lus compacter. Ik denk dat het niet nodig is om het handler-script voor dit formulier aan te bieden, omdat het op precies dezelfde manier wordt verwerkt als een tekstveld, d.w.z. lijstwaarden kunnen worden opgehaald uit een superglobale array.

$_POST

Beschrijving:




Bestand overbrengen Dit html-formulier bevat een element bladeren , waarmee een dialoogvenster wordt geopend waarin u een bestand kunt selecteren dat u naar de server wilt uploaden. Wanneer u op de knop drukt

"Bestand overbrengen" actie.php, wordt het bestand doorgegeven aan het handlerscript.

Vervolgens moet u een handlerscript schrijven . Voordat we de handler schrijven, moeten we beslissen in welke map we het bestand zullen kopiëren:
{
if(isset($_FILES [ "mijnbestand" ]))
// Als het bestand bestaat $catalog = "../afbeelding/" ; // Onze catalogus
{
if (is_dir($catalog)) // Als een dergelijke map bestaat
$mijnbestand = $_FILES [ "mijnbestand" ][ "tmp_naam" ];
// Tijdelijk bestand $mijnbestandsnaam = $_FILES [ "mijnbestand" ][ "naam" ]; // Bestandsnaam if(! kopie ($mijnbestand, $catalog)) echo "Fout bij kopiëren van bestand"
}
. $mijnbestandsnaam // Als het kopiëren van het bestand mislukt
}
?>

Opmerking

anders mkdir ("../image/" );

// Als zo'n map niet bestaat, zullen we deze aanmaken

Als u erop vertrouwt dat gebruikers bestanden naar uw server uploaden, moet u uiterst voorzichtig zijn. Aanvallers kunnen ‘slechte’ code insluiten in een afbeelding of bestand en deze naar de server sturen. In dergelijke gevallen moet u het downloaden van bestanden strikt controleren. Dit voorbeeld demonstreert het maken van een map en het kopiëren van een bestand naar die map op de server. Ik wil ook graag een voorbeeld demonstreren met het element Dit voorbeeld demonstreert het maken van een map en het kopiëren van een bestand naar die map op de server. selectievakje Ik denk dat het niet nodig is om het handler-script voor dit formulier aan te bieden, omdat het op precies dezelfde manier wordt verwerkt als een tekstveld, d.w.z. lijstwaarden kunnen worden opgehaald uit een superglobale array. Dit element verschilt enigszins van andere elementen doordat het niet een van de elementen is


’a niet is geselecteerd, dan is de superglobale variabele
zal een lege waarde retourneren:
Blauw

Wit Kiezen
if (!empty($_POST [ "mijnkleur" ])) echo $_POST [ "mijnkleur" ]; // Als er minimaal 1 element is geselecteerd;
?>




anders echo