Sähköisten asiointipalveluiden toteuttaminen

Sorakuilu

PHP, PDO luokka

Lähde: Zetcoden pdo-opas

Termejä

PDO on yhteys PHP:n ja tietokantapalvelimen välillä

PDOStatement on valmisteltu kysely (prepared statement) ja kun se on suoritettu, saadaan tulokseksi assosiatiivinen tulosjoukko

PDOException on PDOn virhe

MySQL tietokanta ja PDO

Esimerkkinä käytetään PDO:ta MySQL-tietokannan kanssa. PDO-luokka toimii myös muissa tietokantaympäristöissä.

Luo ensin MySQL-ympäristöösi alla olevan SQL:n avulla esimerkkitaulu

DROP TABLE IF EXISTS countries; CREATE TABLE countries(id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), population INT); INSERT INTO countries(name, population) VALUES('China', 1382050000); INSERT INTO countries(name, population) VALUES('India', 1313210000); INSERT INTO countries(name, population) VALUES('USA', 324666000); INSERT INTO countries(name, population) VALUES('Indonesia', 260581000); INSERT INTO countries(name, population) VALUES('Brazil', 207221000); INSERT INTO countries(name, population) VALUES('Pakistan', 196626000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000); INSERT INTO countries(name, population) VALUES('Nigeria', 186988000); INSERT INTO countries(name, population) VALUES('Russia', 146838000); INSERT INTO countries(name, population) VALUES('Japan', 126830000);

Ylläolevat komennot luovat taulun countries ja syöttävät siihen esimerkkitietoja.

Ota yhteys tietokantaan

connection.php

Aluksi otetaan yhteys tietokantaan

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd);

Seuraavat muuttujat luovat yhteyden (connection string) tietokantaan. $dsn on tietolähteen nimi, se koostuu tietokantaympäristön ja skeeman (oman tietokannan) nimistä. Tietokantaympäristö on xampissa ja muissa ympäristöissä localhost, jos ohjelmakoodi on samassa ympäristössä. Muissa ympäristöissä viitataan ympäristön nimeen. mydb on se skeema (mysql ympäristössä database), joka sinulla on käytettävissä (skeema tulee olla luotuna joko magnesiumille tai xamppia käytettäessä sen tietokantaan.

Viimeisenä on komento, jolla luodaan uusi PDO olio (yhteys PHP:n ja tietokantapalvelimen välille). Välitämme olion konstruktorille tietolähteen, käyttäjätunnuksen ja salasanan. Huomaa, että tietokantaan tulee luoda aina erikseen käyttäjätunnukset, salasanat ja määritellä oikeudet käyttäjille, ympäristön salasanoja ei tietoturvasyistä saa käyttää.

$pdo = new PDO($dsn, $user, $passwd);

PHP PDO ja exec - komennon suorittaminen

PDO exec() suorittaa SQL-lauseen ja palauttaa tiedon siitä, kuinka moneen riviin komento vaikutti. KOmento on yksinkertainen ja toimii niissä tapauksissa, joissa käyttäjän syötteitä ei sijoiteta SQL-lauseeseen.

affected_rows.php

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $id = 12; $nrows = $pdo->exec("DELETE FROM countries WHERE id IN (1, 2, 3)"); echo "The statement affected $nrows rows\n";

Alla oleva lause poistaa kolme riviä, viimeinen lause tulostaa, moneenko riviin vaikutettiin.

$nrows = $pdo->exec("DELETE FROM countries WHERE id IN (1, 2, 3)"); echo "The statement deleted $nrows rows\n";

PHP PDO ja fetch ja fetchAll-hakujen tyyli

Tuloksia palauttavien metodien fetch ja fetchAll parametri tyyli kontrolloi, millä tavalla seuraava rivi palautetaan käyttäjälle. Tulokset voidaan palauttaa indeksoituina taulukoina, assosiatiivisinä taulukoina, molemmat taulukot yhdistettyinä tai olioina,

Esimerkiksi:

fetch_style_num.php

Tässä esimerkissä saamme käyttöön dataa indeksoituna taulukkona.

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT * FROM countries"); $rows = $stm->fetchAll(PDO::FETCH_NUM); foreach($rows as $row) { printf("$row[0] $row[1] $row[2]\n"); }

Alla valitaan kaikki tietueet ja kentät countries taulusta.

$stm = $pdo->query("SELECT * FROM countries");

Käytämme PDO:FETCH_NUM tyyliä fetchAll()metodiin.

$rows = $stm->fetchAll(PDO::FETCH_NUM);

Luemme taulukon riveittäin ja tulostamme kentät . Kenttien sisältöön viitataan taulukon indeksien avulla.

foreach($rows as $row) { printf("$row[0] $row[1] $row[2]\n"); }

fetch_style_assoc.php

Tässä esimerkissä haemme datan assosiatiivisena taulukkona.

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->query("SELECT * FROM countries"); $rows = $stm->fetchAll(PDO::FETCH_ASSOC); foreach($rows as $row) { printf("{$row['id']} {$row['name']} {$row['population']}\n"); }

fetchAll() -metodissa käytämme PDO::FETCH_ASSOC -tyyliä.

$rows = $stm->fetchAll(PDO::FETCH_ASSOC);

PHP PDO ja parametrien sitominen (binding)

SQL -lauseet rakennetaan usein dynaamiseisti. Käyttäjä antaa joitain syötteitä ja tämän syötteen avulla rakennetaan lauseet.

PDO on metodit bindParam() ja bindValue(), joilla voidaan luoda parametrejöä sisältäviä kyselyitä.

PDO mahdolistaa datan sitomisen joko klysymysmerkkien tai paikannimien (named placeholders) avulla.

parameterized_query.php

Esimerkissä käytämme bindValue() -metodia luomaan kyselyn ja kysymysmerkkejä merkitsemään paikkoja parametreille.

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "root"; $passwd = "andrea"; $pdo = new PDO($dsn, $user, $passwd); $id = 12; $stm = $pdo->prepare("SELECT * FROM countries WHERE id = ?"); $stm->bindValue(1, $id); $stm->execute(); $row = $stm->fetch(PDO::FETCH_ASSOC); echo "Id: " . $row['id'] . PHP_EOL; echo "Name: " . $row['name'] . PHP_EOL; echo "Population: " . $row['population'] . PHP_EOL;

Tässä käyttäjän syöte.

$id = 11;

select- lause hakee tietyn rivin taulusta. Sidomme arvon bindValue()-metodilla kysymysmerkin osoittamaan paikkaan.

Toisessa esimerkissä käytämme bindParam()-metodia.

$stm = $pdo->prepare("SELECT * FROM countries WHERE id = ?"); $stm->bindValue(1, $id);//kolmanneksi parametriksi voi laittaa parametrin tietotyypin, tässä PDO::PARAM_INT, 1 viittaa kysymysmerkkiin $stm->execute();

parameterized_query2.php

Esimerkki valitsee ja tulostaa tietyn rivin.

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user11"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $id = 12; $stm = $pdo->prepare("SELECT * FROM countries WHERE id = :id"); $stm->bindParam(":id", $id, PDO::PARAM_INT); $stm->execute(); $row = $stm->fetch(PDO::FETCH_ASSOC); echo "Id: " . $row['id'] . PHP_EOL; echo "Name: " . $row['name'] . PHP_EOL; echo "Population: " . $row['population'] . PHP_EOL;

Huomannet ilmaisu PHP_EOL. Se vastaa aikaisemmin käyttämäämme (Windowsissa toimivaa) merkintää \n, mutta toimii muissakin ympäristöissä.

Suorittamisessa käytämme nimettyä valitsinta (placeholder) (:id) ja bindParam()-metodia.

$stm = $pdo->prepare("SELECT * FROM countries WHERE id = :id"); $stm->bindParam(":id", $id, PDO::PARAM_INT); $stm->execute();

parameterized_query3.php

Tässä esimerkissä parametrit annetaan taulukkomuodossa.

<?php $name = "Suomi"; $population = 5521236; $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $stm = $pdo->prepare("INSERT INTO countries(name, population) VALUES(?,?);"); $stm ->execute(array($name,$population));

PHP PDO ja viimeksi lisätyn rivin Id

PDO lastInsertId() -metodi palauttaa viimeksi lisätyn rivin id:n

create_table.php

Esimerkissä luomme uuden taulun ja lisäämme siihen muutaman tietueen. Kun taulu on luotu, haemme viimeksi lisätyn tietueen id:n lastInsertId() -metodilla.

<?php $dsn = "mysql:host=localhost;dbname=mydb"; $user = "user12"; $passwd = "12user"; $pdo = new PDO($dsn, $user, $passwd); $sql = "CREATE TABLE words(id INT PRIMARY KEY AUTO_INCREMENT, word VARCHAR(255))"; $ret = $pdo->exec($sql); $pdo->exec("INSERT INTO words(word) VALUES ('pen')"); $pdo->exec("INSERT INTO words(word) VALUES ('bum')"); $pdo->exec("INSERT INTO words(word) VALUES ('hum')"); $pdo->exec("INSERT INTO words(word) VALUES ('den')"); $rowid = $pdo->lastInsertId(); echo "Viimeksi lisätyn rivin id is: $rowid\n";

Kuinka PDO:ta käytetään luokkien yhteydessä, phpdelusions.netin materiaali