Advanced Kittenry - Tietokantasovellusohjeet

Listaus- ja tietonäkymät

Viikon neljä aluksi otetaan kolmosviikon listaustesti, ja laajennetaan se täysipainoiseksi sivuksi muiden joukossa. Tehtävää on ainakin:

  • Sivupohjan ja näkymän käyttöönotto
  • Listattavat asiat kannattaa aina järjestää ORDER BY-käskyllä
  • Jos listattavia kohteita on paljon, voi olla järkevää toteuttaa joko haku tai sivutustoiminto
  • Sivulla tulee näyttää viesti, jos lista on täysin tyhjä.

Array, PHP:n lista- ja assosiaatiotaulutietorakenne

PHP:ssä listojen ja erilaisten assosiaatiotaulujen virkaa hoitaa yleiskäyttöinen array-tietotyyppi. Arraytä käytetään hieman kuin javan taulukoita, mutta avaimena voi käyttää sekä kokonaislukuja, että merkkijonoja. Esimerkki:

<?php 
  $a = array();
  $a[0] = "arvo";
  $a[1] = "toinen arvo";

Array-tietotyypistä voi lukea lisää lyhyestä PHP-syntaksioppaasta.

Listojen läpikäynti

Kontrollerissa luotuja taulukoita voi käyttää näkymässä tiedon näyttämiseen. Oletetaan että kontrolleri on asettanut muuttujaan $kissat listan kissaluokan olioita ja lähettää sen näkymälle:

<?php
  /* Kissa-luokka hakee kaikki kissat 
   * tietokannasta etsiKaikkiKissat-metodilla.
   * Nimen saa kissasta ulos getNimi()-metodilla.
   */
  $kissat' => Kissa::etsiKaikkiKissat();
  naytaNakyma('kissalista.php', array(
    'kissat' => $kissat
  ));

Nyt jos tämä muuttuja on käytettävissä näkymätiedostossa, voimme näyttää nimet näin:

<?php foreach($data->kissat as $kissa): ?>
<div class="kissa">
  Kissan nimi on
  <?php echo $kissa->getNimi(); ?>
</div>
<?php endforeach; ?>

Käyttäjän syöttämien merkkijonojen näyttäminen

Sivunäkymiä näytettäessä kannattaa varmistaa, etteivät käyttäjän syöttämät HTML-koodinpätkät, lainausmerkit yms. sotke sivujen rakennetta.

Tähän ongelmaan autttaa parhaiten htmlspecialchars-funktio:

<?php echo htmlspecialchars($muuttuja); ?>

Muut tietosivut

Listauksesta halutaan päästä usein katselemaan tarkemmin jonkin asian tietoja, siten että nämä yksityiskohtaisemmat tiedot ovat omalla sivullaan.

Nämä sivut toteutetaan omana kontrolleri/näkymä-parinaan, jotka ottavat GET-parametrina vastaan tiedon siitä mitä asiaa tarkkaanottaen halutaan sivulla näytettävän. Parametrissa välitetään tietokohteen pääavaimen arvo, eli yleensä jonkinsorttinen id-numero

Alla esimerkki linkistä tietosivulle. Usein linkit tietosivuille sijoitetaan listauksessa siihen, missä listatun asian nimi näkyy:

<a href="Kissa?id=<?php echo $kissa->getId() ?>"><?php echo $kissa->getNimi() ?></a>

Parametri otetaan vastaan $_GET-taulukosta. Koska haluamme id-numeron, kannattaa parametrina saatu merkkijono erikseen tyyppimuuntaa sellaiseksi:

$id = (int)$_GET['id'];

Kun id-numero on parsittu pyydetään malliluokkaa etsimään numeroa vastaava rivi kannasta ja palauttamaan se oliona.

Malliluokkaan täytyy tätä varten rakentaa metodi, joka hakee pääavaimen perusteella olion kannasta, tai palauttaa arvon null, jos tietoa ei löytynyt.

$kissa = Kissa::etsi($id);

if ($kissa != null) {
  naytaNakymä("kissa", array(
    'kissa' => $kissa,
  ));
} else {
  naytaNakymä("kissa", array(
    'kissa' => null
    'virheet' => array('Kissaa ei löytynyt!')
  ));
}

Kun olio on välitetty näkymälle, voidaan sen tiedot näyttää tai vaihtoehtoisesti näyttää pelkkä tyhjä virhesivu, jos haluttua oliota ei löytynyt.

Seuraavaksi:

Jos listalla näytettäviä kohteita on paljon, lisää listallesi sivutus tai hakutoiminto.

Tämän jälkeen voit toteuttaa lisäystoiminnon.