Tietokannat
- Luentotaltiointi
- PHP Data Objects (PHP)
- Tietokantayhteys
- Kyselyt
- Dynaamiset kyselyt sidotuilla muuttujilla
- Tietojen lisääminen, poistaminen ja muuttaminen
- Esimerkki
- Transaktiot
- Lisätietoa
Luennon aiheena on tietokantojen käsittely www-sovelluksessa.
Luentotaltiointi
- sovellukset13.mp3 13M
- sovellukset13.wmv 28M
- sovellukset13_xvid.avi 90M
PHP Data Objects (PHP)
- PHP:n pahimpia vikoja on ollut yhtenäisen tietokantaliittymän puute. Ts. Jokaisella tietokantaohjelmistolla on ollut erilainen rajapinta.
- PDO yhtenäistää tietokantarajapinnat
- Mahdollistaa helpomman vaihtamisen tietokantaohjelmistosta toiseen
- Tulee vakiona php 5.1:n mukana
- Tukee tärkeimpia tietokantaohjelmistoja: PostgreSQL, Oracle, MySQL, Firebird, SQLite jne.
- Jos mahdollista niin kannattaa käyttää ADODB tai Pear DB abstraktiokirjastoja.
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
- Kysely valmistellaan - Valmisteltu kysely suoritetaan seuraavilla suorituskerroilla tehokkaammin
- Kysely suoritetaan
- 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
- An introduction to Service Data Objects for PHP
- Database Abstraction in PHP
- PHP:PDO Functions
- PDO
- PDO Basics
- The PHP 5 Data Object (PDO) Abstraction Layer and Oracle
- Propel
- Simplify Business Logic with PHP DataObjects
- DB Dataobject
- PEAR::DB, DataObjects, and Joins / Reflection
- Going dynamic with PHP
- PHP Object Generator (POG)
- Database Abstraction With PHP

