CodeIgniter 4 Skjemavalidering og skjemainnsending med eksempel

โšก Smart oppsummering

CodeIgniter 4 Form Validation sjekker brukerinndata fรธr det behandles. Skjemaer bygges med skjemahjelperen, og det innebygde valideringsbiblioteket angir regler som obligatorisk, numerisk og er_unik, viser deretter feil og fyller ut faste felt pรฅ nytt nรฅr valideringen mislykkes.

  • ๐Ÿ“ former: Skjemaer lar brukere sende inn data, ofte lagret i databasen eller sendt via e-post.
  • ๐Ÿงฐ Skjemahjelper: Funksjoner som form_open, form_input og form_submit genererer standardkompatibel HTML.
  • ๐Ÿ›ก๏ธ To fronter: Klientsidevalidering er rask; serversidevalidering er sikker og kan ikke omgรฅs.
  • ๐Ÿ“ regler: set_rules definerer nรธdvendige kontroller for datatype, lengde, sanering og unikhet.
  • ๐Ÿ” Lรธpe: run()-metoden returnerer usann hvis en regel feiler, og sann nรฅr alle er godkjent.
  • โš ๏ธ feil: validation_errors() skriver ut meldingene for feltene som feilet.
  • ๐Ÿ“Œ Klebrige skjemaer: set_value() fyller ut korrekt inntastede felt pรฅ nytt etter en mislykket innsending.

CodeValidering av tenningsskjema

Skjema i CodeTennapparat 4

Skjemaer gir brukere en mรฅte รฅ samhandle med applikasjonen og sende inn data. Et skjema kan brukes til et kontaktskjema som en besรธkende pรฅ nettstedet kan fylle ut og sende informasjonen til oss. Informasjonen som mottas lagres vanligvis i databasen eller sendes via e-post.

HTML-skjemastruktur

Fรธlgende kode viser strukturen til et typisk HTML-skjema.

<form id="frmUsers" name="frmUsers" method="POST" action="create_user.php">
<input type="text" id="user_id" name="user_id">
<input type="password" id="password" name="password">

<input type="submit" value="Submit">
</form>

Her:

  • โ€ฆ er รฅpnings- og avslutningstaggene for skjemaet. Attributtene id og name angir navnet og ID-en til skjemaet. Method-attributtet angir HTTP-verbet som skal brukes, vanligvis POST.
  • spesifiserer skjemaelementene. Navneattributtet er variabelnavnet som sendes til backend-serveren for behandling.

CodeTennformhjelper

HTML er lett รฅ forstรฅ og skrive, men CodeTenner gjรธr ting enda enklere. CodeIgniter har innebygde funksjoner for รฅ lage HTML-skjemaer. La oss se pรฅ fรธlgende CodeIgniter-skjemakode som bruker skjemahjelperen til รฅ opprette et skjema:

<?php
echo form_open('create_user.php', ['id' => 'frmUsers']);

echo form_label('User Id', 'user_id');
echo form_input(['name' => 'user_id']);

echo form_label('Password', 'password');
echo form_input(['type' => 'password', 'name' => 'password']);

echo form_submit('btnSubmit', 'Create User');

echo form_close();
?>

Her:

  • echo form_open('create_user.php', ['id' => 'frmUsers']); oppretter skjemaets รฅpningskode, setter metoden til POST og setter handlingen URL til create_user.php.
  • echo form_label('Bruker-ID', 'bruker_id'); oppretter en etikett som leser bruker-ID for inndatafeltet med navnet bruker_id.
  • echo form_input(['name' => 'user_id']); oppretter et tekstfelt med navnet user_id.
  • echo form_submit('btnSubmit', 'Opprett bruker'); oppretter en send-knapp med etiketten Opprett bruker.
  • echo form_close(); lukker skjemaet.

Som du kan se, gjรธr skjemahjelpere det enkelt รฅ lage skjemaer ved hjelp av ren PHP. Ved รฅ sende attributter til skjemahjelpermetodene kan vi tilpasse HTML-koden som genereres for skjemaet. Koden ovenfor genererer fรธlgende HTML-skjemakode:

<form action="http://localhost:3000/index.php/create_user.php" id="frmUsers" method="post" accept-charset="utf-8">
<label for="user_id">User Id</label>
<input type="text" name="user_id" value=""/>

<label for="password">Password</label>
<input type="password" name="password" value=""/>

<input type="submit" name="btnSubmit" value="Create User"/>
</form>

Den stรธrste fordelen med รฅ bruke skjemahjelperen er at den genererer semantisk korrekt kode som overholder HTML-standardene. Du kan se den offisielle CodeDokumentasjon for tenneren for mer informasjon: https://codeigniter.com/user_guide/helpers/form_helper.html.

CodeEksempel pรฅ tennform

Etter รฅ ha dekket det grunnleggende om CodeIgniter, la oss gรฅ tilbake til veiledningsprosjektet vรฅrt, som vi har jobbet med gjennom hele dette CodeIgniter-opplรฆringsserienOppsummert bygger veiledningsprosjektet en app for kontaktadministrasjon som lagrer detaljene i databasen.

Opprett kontakt

I den forrige veiledningen opprettet vi ruter for applikasjonen vรฅr og enkle visninger. ร…pne application/views/contacts/create.php og endre koden for create.php som fรธlger:

<div class="column">
<h2 class="title">Create Contact</h2>
<form action="<?= base_url('contacts/store') ?>" method="POST">
<div class="field">
<label class="label">Contact Name</label>
<div class="control">
<input id="name" name="name" class="input" type="text" placeholder="Type the contact name">
</div>
</div>
<div class="field">
<label class="label">Contact Number</label>
<div class="control">
<input id="name" name="name" class="input" type="text" placeholder="Type the contact number">
</div>
</div>
<div class="field">
<label class="label">Email Address</label>
<div class="control">
<input id="email" name="email" class="input" type="email" placeholder="Type the email address">
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-link">Save Contact</button>
</div>
</div>
</form>
</div>

OBS: Koden ovenfor bruker ren HTML for รฅ opprette skjemaet. La oss nรฅ se hvordan skjemaet vรฅrt ser ut i nettleseren. Last inn fรธlgende URL inn i nettleseren din: http://localhost:3000/contacts/createHvis du har bygget veiledningsprosjektet, bรธr du se fรธlgende:

CodeIgniter opprett kontaktskjema

Skjemavalidering i CodeTenner

Validering spiller en svรฆrt kritisk rolle nรฅr man behandler data fra skjemaer. La oss si at en bruker registrerer seg pรฅ et nettsted. Vi vil sรธrge for at de fyller ut de nรธdvendige opplysningene og har en gyldig e-postadresse. Hvis vi jobber med datoverdier, vil vi sรธrge for at datointervallene er gyldige, sรฅ vi ville ikke godta en dato med 32 dager i en mรฅned.

Validering lรธser disse problemene. CodeIgniter-validering gjรธres pรฅ to fronter nรฅr man jobber med webapplikasjoner.

Klientsidevalidering gjรธres i nettleseren, vanligvis med HTML og JavaSkript. Det forbedrer ytelsen fordi alt gjรธres pรฅ klienten, sรฅ det er ikke nรธdvendig รฅ sende dataene til serveren. Ulempen er at brukeren har kontroll over det; hvis du er avhengig av JavaSkript for รฅ validere og brukeren deaktiverer JavaSkript, valideringen din vil mislykkes.

Serversidevalidering gjรธres pรฅ serveren. Ulempen er at brukeren mรฅ sende dataene til serveren og vente pรฅ svaret, noe som bruker nettverksressurser og kan forringe ytelsen. Den stรธrste fordelen er stรธrre kontroll og sikkerheten for at valideringsreglene dine fungerer selv om brukeren deaktiverer. JavaManus.

En bedre strategi er รฅ bruke klientsidevalidering som primรฆrstrategi og serversidevalidering som en reservemekanisme.

Legge til skjemavalideringsregler

CodeIgniter har et innebygd valideringsbibliotek. Biblioteket lastes inn ved รฅ bruke fรธlgende linje:

$this->load->library('form_validation');

Ocuco CodeValideringsbiblioteket for Igniter-skjemaer kan utfรธre noen av fรธlgende handlinger:

  • Se etter obligatoriske felt. Den undersรธker de innsendte verdiene og returnerer en feil hvis et felt merket som obligatorisk ikke har en verdi.
  • Validering av datatype โ€“ noen felt krever kanskje bare numeriske verdier. Hvis en ikke-numerisk verdi oppdages, returnerer biblioteket en feil og avbryter skjemainnsendingen.
  • Lengdevalidering โ€“ noen felt krever et visst minimums- eller maksimumsantall tegn. Valideringsbiblioteket hรฅndterer slike tilfeller.
  • Datarensing โ€“ biblioteket kan fjerne skadelig kode fra innsendte data av sikkerhetshensyn. Hvis de innsendte verdiene har aktive JavaSkript- eller SQL-injeksjonskode, fjerner biblioteket den skadelige koden og gjรธr den ubrukelig.
  • Valider unike databasefelt โ€“ anta at du har et registreringsskjema med en e-postadresse, og du vil forsikre deg om at adressen er unik. Biblioteket gjรธr det enkelt รฅ sjekke de innsendte dataene mot en databasetabell og et felt.

Valideringsregler angis ved hjelp av fรธlgende format:

$this->form_validation->set_rules('field','human readable field','rule',['custom message']);

Her:

  • 'felt' angir navnet pรฅ skjemafeltet som skal valideres av biblioteket.
  • ยซmenneskelig lesbart feltยป angir det menneskelig lesbare formatet til feltet, som vises tilbake til brukeren nรฅr det oppstรฅr en feil.
  • 'regel' angir valideringsregelen som skal brukes, for eksempel obligatorisk, numerisk eller minimumslengde.
  • ['tilpasset melding'] er valgfritt og kan angi en tilpasset valideringsmelding som vises nรฅr regelen mislykkes.

Fรธlgende er a CodeEksempel pรฅ tenner for validering av kontaktnummeret:

$this->form_validation->set_rules('contact_number', 'Contact Number', 'required');

Her:

  • Koden ovenfor sjekker om feltet contact_number er angitt. Hvis det ikke er angitt, returnerer den en feil som sier at feltet Contact Number er obligatorisk.

For รฅ kjรธre valideringen mot de angitte reglene, bruker vi fรธlgende funksjon i valideringsbiblioteket:

$this->form_validation->run()

Hvis koden ovenfor returnerer usann, har รฉn eller flere av reglene feilet. Hvis den returnerer sann, har alle valideringsreglene blitt bestรฅtt, og du kan fortsette med videre handlinger.

La oss se pรฅ flere eksempler pรฅ valideringsregler. Anta at du vil validere flere felt, for eksempel kontaktnavn, nummer og e-postadresse. Du kan bruke fรธlgende kode:

$rules = array(
array(
'field' => 'contact_name',
'label' => 'Contact Name',
'rules' => 'required'
),
array(
'field' => 'contact_number',
'label' => 'Contact Number',
'rules' => 'required',
'errors' => array(
'required' => 'You must provide a %s.',
),
),
array(
'field' => 'email_address',
'label' => 'Email Address',
'rules' => 'required'
)
);

$this->form_validation->set_rules($rules);

Her:

  • I eksemplet ovenfor tilbyr vi en rekke felt med regler for set_rules-funksjonen i biblioteket. Dette gjรธr det enklere nรฅr du validerer flere felt.

Unik validering

Hvis vi vil validere kontaktnummeret for รฅ sikre at vi ikke lagrer det samme nummeret to ganger, kan vi bruke fรธlgende regel:

$this->form_validation->set_rules('contact_number', 'Contact Number','required|is_unique[contacts.contact_number]');

Her:

  • | brukes til รฅ sette sammen flere regler.
  • is_unique[contacts.contact_number] sjekker om verdien for contact_number er unik mot kontaktnummer-feltverdiene i databasetabellens kontakter.

Viser feilmeldinger for skjemavalidering

Hvis det oppstรฅr en feil under behandlingen av skjemaet, kan du bruke fรธlgende kode for รฅ vise valideringsfeilene:

<?php echo validation_errors(); ?>

Her:

  • Funksjonen ovenfor returnerer alle feilene som oppsto.

Fylle inn innsendte skjemadata: Sticky Forms

Noen skjemaer har mange felt, og hvis det oppstรฅr en feil, mรฅ du sรธrge for at dataene som ble lagt til riktig, bevares. Valideringsbiblioteket har mekanismer for รฅ oppnรฅ dette ved hjelp av fรธlgende kode:

<?php echo set_value('field_name'); ?>

Her:

  • Koden ovenfor viser inndataene som brukeren skrev inn.

For en komplett referanseveiledning om metodene som er tilgjengelige i valideringsbiblioteket, se API-dokumentasjonen i den offisielle CodeBrukerveiledning for tenneren: https://codeigniter.com/userguide3/libraries/form_validation.html.

CodeEksempel pรฅ validering av tennform

Gjennom denne veiledningsserien har vi lagt til kode i veiledningsprosjektet vรฅrt, et program for kontaktadministrasjon. I denne delen skal vi laste inn valideringsbiblioteket og se hvordan vi kan bruke det i praksis i et eksempel fra den virkelige verden. Endre rutekoden som fรธlger for รฅ inkludere store-metoden:

$route['default_controller'] = 'welcome';
$route['contacts'] = 'contacts';
$route['create'] = 'contacts/create';
$route['store'] = 'contacts/store';
$route['edit/:id'] = 'contacts/edit';
$route['update/:id'] = 'contacts/update';
$route['delete/:id'] = 'contacts/delete';
$route['users'] = 'welcome/users';

La oss nรฅ laste inn skjemavalideringsbiblioteket i Kontaktkontrolleren og angi noen valideringsregler. Endre koden som vist nedenfor:

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Contacts extends CI_Controller {

public function __construct() {
parent::__construct();
$this->load->helper('url', 'form');
$this->load->library('form_validation');
}

public function index() {
$this->load->view('header');
$this->load->view('contacts/index');
$this->load->view('footer');
}

public function create() {
$this->load->view('header');
$this->load->view('contacts/create');
$this->load->view('footer');
}

public function store() {
$rules = array(
array(
'field' => 'contact_name',
'label' => 'Contact Name',
'rules' => 'required'
),
array(
'field' => 'contact_number',
'label' => 'Contact Number',
'rules' => 'required',
'errors' => array(
'required' => 'You must provide a %s.',
),
),
array(
'field' => 'email_address',
'label' => 'Email Address',
'rules' => 'required'
)
);

$this->form_validation->set_rules($rules);

if ($this->form_validation->run() == FALSE) {
$this->load->view('header');
$this->load->view('contacts/create');
$this->load->view('footer');
} else {
redirect(base_url('contacts'));
}
}

public function edit($id) {
$this->load->view('header');
$this->load->view('contacts/edit');
$this->load->view('footer');
}

public function update($id) {
$this->load->view('header');
$this->load->view('contacts/update');
$this->load->view('footer');
}

public function delete($id) {
$this->load->view('header');
$this->load->view('contacts/delete');
$this->load->view('footer');
}
}

Her:

  • $rules = array(โ€ฆ) definerer valideringsreglene.
  • $this->form_validation->set_rules($rules); angir valideringsreglene.
  • hvis ($this->form_validation->run() == FALSE) {โ€ฆ} kjรธrer valideringsreglene, og hvis de mislykkes, vises skjemaet pรฅ nytt med valideringsfeil. Hvis valideringen bestรฅr, omdirigerer vi til siden med kontaktlisten. Under normale omstendigheter ville vi skrevet dataene til databasen, noe vi gjรธr i neste veiledning om databaser.

Endre opprettingsvisningen i application/views/contacts/create.php som vist nedenfor:

<div class="column">
<h2 class="title">Create Contact</h2>
<div class="notification is-danger">
<?php echo validation_errors(); ?>
</div>
<form action="<?= base_url('contacts/store') ?>" method="POST">
<div class="field">
<label class="label">Contact Name</label>
<div class="control">
<input id="contact_name" name="contact_name" class="input" type="text" value="<?php echo set_value('contact_name'); ?>" placeholder="Type the contact name">
</div>
</div>
<div class="field">
<label class="label">Contact Number</label>
<div class="control">
<input id="contact_number" name="contact_number" class="input" type="text" value="<?php echo set_value('contact_number'); ?>" placeholder="Type the contact number">
</div>
</div>
<div class="field">
<label class="label">Email Address</label>
<div class="control">
<input id="email_address" name="email_address" class="input" type="email" value="<?php echo set_value('email_address'); ?>" placeholder="Type the email address">
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-link">Save Contact</button>
</div>
</div>
</form>
</div>

Her:

  • viser eventuelle feil som oppstรฅr under valideringsprosessen.
  • angir verdien som tidligere ble angitt, hvis noen.

Last inn fรธlgende URL i nettleseren din, og klikk deretter pรฅ Opprett kontakt uten รฅ skrive inn noen verdier:

CodeValideringsfeil for Igniter-skjema vises

Spรธrsmรฅl og svar

Klientsidevalidering kan omgรฅs ved รฅ deaktivere JavaSkript eller sending av en direkte forespรธrsel. Serversidevalidering kjรธrer der brukeren ikke har kontroll, sรฅ det er den pรฅlitelige siste forsvarslinjen.

Et fast skjema fyller ut feltene brukeren allerede har fullfรธrt etter en mislykket innsending ved hjelp av set_value(). Det sparer brukeren for รฅ mรฅtte fylle ut pรฅ nytt.ping gyldige data nรฅr bare ett felt forรฅrsaket feilen.

is_unique[table.field] sjekker den innsendte verdien mot en kolonne i databasen og feiler hvis den allerede finnes. Den brukes for felt som e-post eller brukernavn som ikke mรฅ dupliseres.

Ja. Fra en feltliste kan AI generere set_rules-matrisen med obligatoriske regler, valid_email-regler og lengderegler, samt tilpassede meldinger. RevVis reglene mot forretningslogikken og databaseskjemaet ditt.

Skjemahjelperen genererer standardkompatibel HTML, escaper attributter og holder skjemaer konsistente. Den integreres ogsรฅ med valideringshjelpere som set_value, noe som reduserer repeterende markup i visninger.

Oppsummer dette innlegget med: