Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php | oliot | virheiden käsittely

Sivun loppuun

Cartter [11.02.2010 17:10:16]

#

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.

Jokotai [11.02.2010 17:15:21]

#

Korvaamalla throw new Exception():in echolla.

Metabolix [11.02.2010 17:18:58]

#

Ota se poikkeus kiinni try-catch-rakenteella. Katso esimerkki PHP:n sivuilta.

Cartter [11.02.2010 17:28:40]

#

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

Metabolix [11.02.2010 18:46:53]

#

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.

<?php
$tunnusvirhe = $salasanavirhe = null;
if (huono tunnus) {
  $tunnusvirhe = "Huono tunnus!";
}
if (huono salasana) {
  $salasanavirhe = "Huono salasana!";
}
if ($tunnusvirhe !== null || $salasanavirhe !== null) {
  throw new Exception("$tunnusvirhe, $salasanavirhe");
}

Cartter [11.02.2010 23:09:49]

#

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?

Metabolix [12.02.2010 09:25:05]

#

(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.

tsuriga [12.02.2010 13:29:08]

#

(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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta