Terve,
<?php class Rekisterointi { public $tunnus; public function __construct($tunnus = NULL) { if(isset($tunnus)) { if(strlen($tunnus) < 4) { throw new Exception("Tunnus on liian lyhyt"); } else { if(strlen($tunnus) > 32) { throw new Exception("Tunnus on liian pitkä"); } else { if(!filter_var($tunnus, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" => "/^\w{4,32}$/")))) { throw new Exception("Tunnus sisältää virheellisiä merkkejä"); } } } } else { throw new Exception("Tunnus-kenttä on tyhjä"); } } } ?>
Koodin suoritus keskeytyy ensimmäiseen virheeseen. Mitäs jos haluan, että käyttäjälle näytetään nuo kaikki virheilmoitukset tunnukseen liittyen.
Korvaamalla throw new Exception():in echolla.
Ota se poikkeus kiinni try-catch-rakenteella. Katso esimerkki PHP:n sivuilta.
Metabolix kirjoitti:
Ota se poikkeus kiinni try-catch-rakenteella. Katso esimerkki PHP:n sivuilta.
ööh... siis jos laitan sivulle seuraavan koodin:
$tunnus = $_POST["tunnus"]; try { $rek = new Rekisterointi($tunnus); } catch(Exception $e) { echo $e->getMessage(); }
Niin tuohan lopettaa koodin suorittamisen ensimmäiseen poikkeukseen ja tulostaa vain ensimmäisen poikkeuksen virheilmoituksen.
-----
EDIT. Esimerkki on ehkä vähän huono ja hätäinen, koska ei tuo koodi heitä kuin yhden virheen joka tapauksessa. Tarkoitus on kuitenkin tarkistaa tunnuksen lisäksi salasana samaan malliin konstruktorissa. Tällöin siis virhe heitetään mahdollisesti viallisesta tunnuksesta ja salasanasta. Nuo kummatkin virheet olisi siis tarkoitus näyttää käyttäjälle tyyliin:
* Virheellinen tunnus
* Virheellinen salasana
Ei suinkaan, tuo nimenomaan jatkaa suoritusta ensimmäisen poikkeuksen jälkeenkin – ei tietenkään samasta kohdasta vaan käsittelyn jälkeen. Ilman käsittelyä ensimmäinen virhe kaataisi koko skriptin.
Jos haluat yhteen virheilmoitukseen monta tietoa, kerää ensin tiedot kasaan ja heitä poikkeus vasta funktion lopusta.
Noniin kiitoksia. Selkesi taas yksi asia lisää.
Semmoisen voisi sielä kysyä, että voisko noita virheitä kerätä jollain tapaa taulukkoon ja catch-lohkossa tulostaa sitten tämän taulukon?
(Muuten, tuo Rekisterointi on luokan nimenä aika outo; jos on tarkoitus rekisteröidä uusi käyttäjä, loogisempi paikka olisi esimerkiksi staattinen funktio Kayttaja::rekisteroi.)
Voit laajentaa tuota esittämääni systeemiä niin, että tallennatkin ilmoitukset taulukkoon ja lopuksi, jos taulukko ei ole tyhjä, heität oman poikkeuksen, joka voi esimerkiksi huolehtia koottujen virheilmoitusten kokoamisesta yhtenäiseksi tekstiksi. PHP:ssä voi heittää vain yksittäisiä Exception-olioita (tai sen perillisiä), joten taulukkoa varten täytyy joka tapauksessa keksiä jotain erikoisempaa. Kukaan ei toki pakota käyttämään poikkeuksia, vaan yhtä hyvin voi palauttaa funktiosta virhekoodeja tai -ilmoituksia.
(Tai Rekisterointi -> Rekisteroija. Käyttäjä-oliolla ei varmaankaan tarvitse olla oikeuksia rekisteröidä itseään [ehkäpä metodi rekisteroidy?])
Salakalassa ei liene muuta virheen mahdollisuutta kuin lyhyys? Jos ja kun haluat useampia virheitä samasta asiasta niin helpointa lienee tosiaan unohtaa poikkeukset ja luoda jokin tarkistushelpperi, joka tarkistaa ja taulukoi virheet, jotka sitten tulostelet Näkymässä (View). Ellet sitten tee käyttäjänimelle ja salasanalle omia luokkia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.