PHP

PHP KOULUTUSTA VUONNA 2025!

Kurssit saatavilla kautta Suomen. Tule ja varaa oma koulutustapahtumasi heti! Koulutuksen järjestää asiantuntijasi Koulutus- ja konsultointipalvelu KK Mediat.

PHP ja tietokannat: PDO

PDO (PHP Data Objects) on PHP:n laajennus, joka tarjoaa yhtenäisen ja turvallisen tavan käyttää useita eri tietokantamoottoreita – mukaan lukien MySQL. PDO:n suurin etu on sen abstraktiokerros, joka mahdollistaa tietokannan vaihdon ilman suurta koodimuutosta.

Tietokantayhteyden avaaminen ja sulkeminen


<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=testikanta", "kayttaja", "salasana");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // ...
} catch (PDOException $e) {
    error_log("Yhteysvirhe: " . $e->getMessage());
    echo "Tietokantavirhe. Yritä myöhemmin uudelleen.";
}
?>


Vinkki: Käytä aina try-catch-rakennetta PDO:n kanssa ja aseta ERRMODE_EXCEPTION – tämä helpottaa virheiden paikantamista.

Yhden arvon hakeminen


<?php
$stmt = $pdo->query("SELECT COUNT(*) AS maara FROM testitaulu");
$maara = $stmt->fetch(PDO::FETCH_ASSOC)['maara'];
echo "Rivejä yhteensä: " . $maara;
?>


Vinkki: PDO palauttaa oletuksena sekä avain- että numeropohjaiset indeksit – käytä PDO::FETCH_ASSOC, jos haluat vain nimetyt kentät ja kevyemmän muistijäljen.

Datan hakeminen ja silmukointi


<?php
$stmt = $pdo->query("SELECT t_id, t_nimi, t_hinta FROM testitaulu");
$rivit = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (count($rivit) > 0) {
    foreach ($rivit as $rivi) {
        echo $rivi['t_id'] . " - " . $rivi['t_nimi'] . " - " . $rivi['t_hinta'] . "
"; } } else { echo "Ei tuloksia."; } ?>

Vinkki: fetchAll() on helppo ja selkeä tapa lukea koko tulosjoukko, mutta vältä sitä suuren tulosjoukon palauttavissa kyselyissä. fetchAll lukee koko tulosjoukon muistiin ja voi pahimmillaan kaataa koko palvelimen. Tästä syystä perinteinen silmukkarakenne while ($row = $stmt->fetch(...)) on suorituskyvyltään parempi vaihtoehto isoilla datamäärillä.

CUD-operaatiot (Create, Update, Delete)


<?php
// INSERT
$pdo->exec("INSERT INTO testitaulu (t_nimi, t_hinta) VALUES ('Tuote A', 19.90)");

// UPDATE
$pdo->exec("UPDATE testitaulu SET t_hinta = 29.90 WHERE t_id = 1");

// DELETE
$pdo->exec("DELETE FROM testitaulu WHERE t_id = 2");
?>


Vinkki: exec() palauttaa muokattujen rivien määrän. Tarkistamalla palautusarvo aina kun haluat tarkistaa, kuinka monta riviä kysely on oikeasti muuttunut.

Prepared statement ja PDO


<?php
$stmt = $pdo->prepare("INSERT INTO testitaulu (t_nimi, t_hinta) VALUES (:nimi, :hinta)");
$stmt->execute([
    ':nimi' => "Tuote B",
    ':hinta' => 24.90
]);
?>


Vinkki: Käytä nimettyjä parametreja kuten (:nimi, :hinta) – ne parantavat luettavuutta ja ovat helppoja yhdistää mm. lomakekenttiin.

Virheenkäsittely ja debuggaus PDO:n avulla


<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=testikanta", "kayttaja", "salasana", [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    // ...
} catch (PDOException $e) {
    error_log("PDO-virhe: " . $e->getMessage());
    echo "Tietokantavirhe. Ota yhteyttä ylläpitoon.";
}
?>


Vinkki: Älä koskaan tulosta tarkkaa virheilmoitusta käyttäjälle.