Link Search Menu Expand Document

Tietokanta

Pikessä tietokantakyselyt suoritetaan \Pike\Db-luokalla, joka on on ohut wräpperi \PDO-abstraktion ympärille.

use \Pike\Db;
final class MyCtrl {
    public function __construct(Db $db) {
        $this->db = $db;
    }
    // tai..
    public function myMethod(Db $db): void {
        // tee jotain $db:llä
    }
}

Sisällysluettelo

  1. Käyttöönotto
    1. index.php
    2. MyBootstrapModule.php
  2. Tiedon insertointi, yksi rivi
    1. Vain valitut kentät
  3. Tiedon insertointi, useita rivejä
    1. Vain valitut kentät
  4. Tiedon hakeminen, yksi rivi
  5. Tiedon hakeminen, useita rivejä
  6. Tiedon päivittäminen
    1. Vain valitut kentät
  7. Tiedon poistaminen

Käyttöönotto

Esimerkki:

index.php

$myCtxInitFn = function (\Pike\AppContext $ctx, \Pike\ServiceDefaults $defaults): void {
    // MariaDb/MySQL
    $ctx->config = $defaults->makeConfig([
        'db.host'        => '127.0.0.1', // oletus '127.0.0.1'
        'db.database'    => 'mydb',      // oletus ''
        'db.user'        => 'user',      // oletus ''
        'db.pass'        => 'pass',      // oletus ''
        'db.tablePrefix' => 'pike_',     // oletus ''
        'db.charset'     => 'utf8mb4',   // oletus 'utf8mb4'
    ]);
    // Sqlite
    $ctx->config = $defaults->makeConfig([
        'db.driver'   => 'sqlite',
        'db.database' => __DIR__ . '/polku/tiedostoon.db', // Voi olla myös ':memory:'
    ]);
    //
    $ctx->db = $defaults->makeDb();
};
$app = new \Pike\App([new MyBootstrapModule], $myCtxInitFn);
$app->handleRequest(...);

MyBootstrapModule.php

final class MyBootstrapModule {
    /**
     * @param \Pike\AppContext $ctx
     */
    public function init(\Pike\AppContext $ctx): void {
        $ctx->db->open();
    }
}

Tiedon insertointi, yksi rivi

$data = (object) ['foo' => 'value 1', 'bar' => 'value 2'];
[$qList, $values, $columns] = $db->makeInsertQParts($data);
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES ({$qList})",
                             $values);
if ($numAffectedRows > 0)
    echo $this->db->lastInsertId(); // '14'
else
    ; // Tee jotain

Vain valitut kentät

$data = (object) ['foo' => 'value 1', 'bar' => 'value 2', 'baz' => 'value 3'];
$onlyTheseColumns = ['foo', 'baz'];
[$qList, $values, $columns] = $db->makeInsertQParts($data, $onlyTheseColumns);
//
$qList;   // '?,?'
$columns; // '`foo`,`baz`'
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES ({$qList})",
                             $values);

Tiedon insertointi, useita rivejä

$data = [
    (object) ['foo' => 'value1', 'bar' => 'another value'],
    (object) ['foo' => 'value2', 'bar' => 'another value2'],
];
[$qGroups, $values, $columns] = $db->makeBatchInsertQParts($data);
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES {$qGroups}",
                             $values);
if ($numAffectedRows > 0)
    echo $this->db->lastInsertId(); // '14'
else
    ; // Tee jotain

Vain valitut kentät

$data = [(object) ['foo' => 'value 1', 'bar' => 'value 2', 'baz' => 'value 3'],
         (object) ['foo' => 'value 4', 'bar' => 'value 5', 'baz' => 'value 6']];
$onlyTheseColumns = ['bar', 'baz'];
[$qGroups, $values, $columns] = $db->makeBatchInsertQParts($data, $onlyTheseColumns);
//
$qGroups; // '(?,?),(?,?)'
$columns; // '`bar`,`baz`'
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES {$qGroups}",
                             $values);

Tiedon hakeminen, yksi rivi

$row = $db->fetchOne("SELECT `foo`,`bar` FROM Products WHERE `id`=?", [1]);
if ($row)
    echo $row['foo']; // 'value'
else
    ; // $row === null|false, tee jotain

Tiedon hakeminen, useita rivejä

$rows = $db->fetchAll("SELECT `foo`,`bar` FROM Products WHERE `id`<?", [3]);
if ($rows)
    echo $rows[0]['foo']; // 'value'
else
    ; // $rows === [], tee jotain

Tiedon päivittäminen

$data = (object) ['foo' => 'value 1', 'bar' => 'value 2'];
[$columns, $values] = $db->makeUpdateQParts($data);
//
$numAffectedRows = $db->exec("UPDATE `Products` SET {$columns} WHERE `id`=?",
                             array_merge($values, [1]));
if ($numAffectedRows > 0)
    ; // ok
else
    ; // Tee jotain

Vain valitut kentät

$data = (object) ['foo' => 'value 1', 'bar' => 'value 2', 'baz' => 'value 3'];
$onlyTheseColumns = ['foo', 'bar'];
[$columns, $values] = $db->makeUpdateQParts($data, $onlyTheseColumns);
//
$columns; // '`foo`=?,`bar`=?'
//
$numAffectedRows = $db->exec("UPDATE `Products` SET {$columns} WHERE `id`=?",
                             array_merge($values, [1]));

Tiedon poistaminen

$numAffectedRows = $db->exec("DELETE FROM Products WHERE `id`=?", [1]);
if ($numAffectedRows > 0)
    ; // ok
else
    ; // tee jotain

Copyright © 2019-2021 ut4