Tietokannat

Luennon aiheena on tietokantojen käsittely www-sovelluksessa.

Luentotaltiointi

Ongelmia videon katselussa?

PHP Data Objects (PHP)

Tietokantayhteys

Tietokantayhteys avataan seuraavasti:


// Connection string riippuu käytetystä tietokantaohjelmistosta
$dbh = new PDO("Connection string", "käyttäjätunnus", "salasana");

// sqlite:
$dbh = new PDO('sqlite:/home3/368/tjlahton/public_html/php/testi');

// PostgreSQL:
$dbh = new PDO('pgsql:dbname=testi;host=palvelin', "tunnus" , "sala");

Tietokantayhteyden avaus ei aina onnistu joten:


try {
  $dbh = new PDO('sqlite:/home3/368/tjlahton/public_html/php/testi');
}
catch ( PDOException $e ) {
  die ( $e->getMessage() );
}

Kyselyt

Tietokantayhteyden avaamisen jälkeen voidaan kantaa tehdä kyselyjä

// valmistellaan kysely ja pyydetään tulos assosiatiivisena taulukkona
$sql = $dbh->prepare('select * from test');

$ok = $sql->execute();

if ( !$ok ) { print_r( $sql->errorInfo() ); }

while ($row = $sql->fetch(PDO_FETCH_ASSOC)) {
    foreach ( $row as $key => $arvo ) {
        print $key . " = " . $arvo . "\n";
    }
}

Tietueet voi pyytää myös monessa muussa muodossa kuin assosiatiivisena taulukkona

Kyselyn suorittamisen vaiheet

  1. Kysely valmistellaan - Valmisteltu kysely suoritetaan seuraavilla suorituskerroilla tehokkaammin
  2. Kysely suoritetaan
  3. Kyselyn tulos käydään läpi

Dynaamiset kyselyt sidotuilla muuttujilla

Dynaamisissa kyselyissä sidotaan kyselyyn mukaan muuttujia


$sql = $dbh->prepare('select * from test where name = :name ');

$name = "Foo";

$sql->bindParam( ":name", $name );

$ok = $sql->execute();

if ( !$ok ) { print_r( $sql->errorInfo() ); }

while ($row = $sql->fetch(PDO_FETCH_ASSOC)) {
    foreach ( $row as $key => $arvo ) {
        print $key . " = " . $arvo . "\n";
    }

Muuttujia ei koskaan pidä sijoittaa suoraan SQL-lauseeseen!

Tietojen lisääminen, poistaminen ja muuttaminen


// poistaminen
$sql = $dbh->prepare('delete from test where avain = :avain ');

$avain = "123";

$sql->bindParam( ":avain", $avain );

$ok = $sql->execute();

if ( !$ok ) { print_r( $sql->errorInfo() ); }

print $sql->rowCount();

// muuttaminen

$sql = $dbh->prepare('update test set avain = :avain where avain = :vanha');

$avain = "111";
$vanha = "123";

$sql->bindParam( ":avain", $avain );
$sql->bindParam( ":vanha", $vanha );

$ok = $sql->execute();

if ( !$ok ) { print_r( $sql->errorInfo() ); }

print $sql->rowCount();

// lisääminen

$sql = $dbh->prepare('INSERT INTO test (avain, name) VALUES (:avain, :name)');

$avain = "100";
$name = "Foofoo";

$sql->bindParam( ":avain", $avain );
$sql->bindParam( ":name", $name );

$ok = $sql->execute();

if ( !$ok ) { print_r( $sql->errorInfo() ); }

print $sql->rowCount();

$tiedot = array(1 => "barbar", 2 => "foobar", 3 => "barfoo" );

foreach ( $tiedot as $key => $value ) {

  $avain = $key;
  $name = $value;
  $ok = $sql->execute();
  if ( !$ok ) { print_r( $sql->errorInfo() ); }

}

Esimerkki

Luodaan pieni tietokantapohjainen linkkikirjasto

Transaktiot

PDO tukee myös transaktioita

Lisätietoa

Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/luennot/luento13/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi)< http://hazor.iki.fi/>
2006-04-07 17:37:35