SELECT

Ausführen eines Queries

Die Abfrage über ein einfaches Statements hat den Vorteile der guten Lesbarkeit. Das statement wird als Zeichenkette direkt an die Datenbank übergeben. Für einfache Abfragen ist dieser Ansatz schnell und leicht umzusetzen.

/**
 * Datenquelle/DataSource erstellen
 */
$dsn=new \Alvine\Persistence\Provider\MySQL\DataSource
    ($host, $port, $database, $table, $user, $password, $parameter);
/**
 * Datenobjekt mit der Verbindung zum Datenbankserver
 */
$dataObject=new \Alvine\Persistence\Relation\DataObject
    ($dsn, new \Alvine\Types\Map\SimpleMap());

/**
 * Ausführen des Queries
 */
$result=$dataObject->execute(
    "SELECT * FROM `example-1` ".
    " WHERE `ISBN`='978-3-86680-192-9'");

/**
 * Es wird folgende SQL-Anweisung auf dem Server ausgeführt:
 * SELECT * FROM `example-1` WHERE `ISBN`='978-3-86680-192-9'
 */
if($result->containErrors()) {
    echo "FEHLER\r\n";
    echo (string) $result->getErrors();
    exit(1);
}

/**
 * Das Ergebnis des Queries ist eine Collection der einzelnen Ergebnisse.
 */
foreach($result AS $resultSet) {
    $data=$resultSet->getData();
    print_r($data);

    /**
     * Dies ergibt folgende Ausgabe
     * 
     * Array
     * (
     *     [0] => Array
     *         (
     *             [ISBN] => 978-3-86680-192-9
     *             [title] => Stadt und Landkreis Hof
     *             [record] => 2016-12-12 00:00:00
     *             [book-count] => 99
     *             [ID] => 1
     *         )
     * 
     * )
     */
}

Definiertes Select

Die Abfrage über definierte Statements - im Gegensatz zu den einfachen Statements - hat mehrere Vorteile. Zum einen können die einzelnen Felder über Objekte abgebildet werden und zum anderen werden diese Abfragen mittels Prepared Statements an die Datenbank gesendet. Dadurch wird die Gefahr von SQL-Injections gemildert.

/**
 * Datenquelle/DataSource erstellen
 */
$dsn=new \Alvine\Persistence\Provider\MySQL\DataSource
    ($host, $port, $database, $table, $user, $password, $parameter);
/**
 * Datenobjekt mit der Verbindung zum Datenbankserver
 */
$dataObject=new \Alvine\Persistence\Relation\DataObject
    ($dsn, new \Alvine\Types\Map\SimpleMap());

$definition=new \Alvine\Persistence\Relation\Definition();

$indexField=new \Alvine\Persistence\Relation\Field\Varchar('example-1', 'ISBN');
$titleField=new \Alvine\Persistence\Relation\Field\Varchar('example-1', 'title');

/** 
 * Über einen LeseHook, kann der Wert des Feldes 
 * nach dem Lesen bearbeitet werden 
 */
$titleField->addReadHook(function($value) {
    return \str_pad($value, 45, '.');
});

$definition->append($indexField);
$definition->append($titleField);
$definition->append(new \Alvine\Persistence\Relation\Field\Integer
    ('example-1', 'book-count'));
$definition->append(new \Alvine\Persistence\Relation\Field\Date
    ('example-1', 'record'));

/**
 * Ein Definiertes Statement bietet zum einen eine 
 * höhere Sicherheit und zum anderen eine optimierte Performance.
 */
$statement=new \Alvine\Persistence\Relation\SQL\Select\DefinedStatement
    ($definition);

/**
 * Where-Abfrage definieren
 */
$statement->where(new \Alvine\Persistence\Relation\SQL\Where
    ($indexField));

/**
 * Abfragen lassen sich gruppieren
 */
$statement->groupBy(new \Alvine\Persistence\Relation\SQL\GroupBy
    ($indexField));

/**
 * Auch Limits lassen sich über ein Objekt definieren
 */
$statement->limit(new \Alvine\Persistence\Relation\SQL\Limit(0, 1));

/**
 * Für das WHERE-Statement müssen 
 * Werte zugewiesen werden.
 */
$records=new \Alvine\Persistence\Relation\Records();
$records->append(
    new \Alvine\Persistence\Relation\Record(
        ['ISBN'=>$searchISBN]));

$query=new \Alvine\Persistence\Relation\Query
    ($statement, $records);

/**
 * Ausführen des Queries
 */
$result=$dataObject->execute($query);
/**
 * Es wird folgende SQL-Anweisung auf dem Server ausgeführt:
 * SELECT `example-1`.`ISBN`,`example-1`.`title`,
 *        `example-1`.`book-count`,
 *        `example-1`.`record` FROM `example-1` 
 * WHERE `example-1`.`ISBN`='978-3-86680-192-9' 
 * GROUP BY `example-1`.`ISBN` 
 * LIMIT 0,1
 */

if($result->containErrors()) {
    echo "FEHLER\r\n";
    echo (string) $result->getErrors();
    exit(1);
}

/**
 * Das Ergebnis des Queries ist eine Collection.
 */
foreach($result AS $resultSet) {
    $data=$resultSet->getData();
    print_r($data);

    /**
     * Dies ergibt folgende Ausgabe
     * 
     * [0] => Array
     *   (
     *       [ISBN] => 978-3-86680-192-9
     *       [title] => Stadt und Landkreis Hof......................
     *       [book-count] => 99
     *       [record] => Alvine\Date\DateTime Object
     *           (
     *               [nanosecond:protected] => 
     *               [second:protected] => 0
     *               [minute:protected] => 0
     *               [hour:protected] => 0
     *               [day:protected] => 12
     *               [month:protected] => 12
     *               [year:protected] => 2016
     *               [mask:protected] => 126
     *               [properties:protected] => Array
     *                   (
     *                   )
     *
     *               [hash:protected] => 
     *           )
     *
     *   )
     */
}

a6365393-9606-4ce7-bda9-6c2e9ddba78f

/**
 * Datenquelle/DataSource erstellen
 */
$dsn=new \Alvine\Persistence\Provider\MySQL\DataSource
    ($host, $port, $database, $table, $user, $password, $parameter);
/**
 * Datenobjekt mit der Verbindung zum Datenbankserver
 */
$dataObject=new \Alvine\Persistence\Relation\SQL\DataObject
    ($dsn, new \Alvine\Types\Map\SimpleMap());

$data=[
    ['example-1', 'ISBN'],
    ['example-1', 'title'],
    ['example-1', 'record', 
        '\Alvine\Persistence\Relation\Field\Date'],
    ['example-1', 'book-count', 
        '\Alvine\Persistence\Relation\Field\Integer'],
];

$definition=\Alvine\Persistence\Relation\Definition::getInstanceFromArray($data);

/**
 * Ein Definiertes Statement bietet zum einen eine höhere Sicherheit 
 * und zum anderen eine optimierte Performance.
 */
$statement=new \Alvine\Persistence\Relation\SQL\Select\DefinedStatement
    (\Alvine\Persistence\Relation\Definition::getInstanceFromArray($data));

/**
 * Where-Abfrage definieren und das erste Feld aus
 * der Definition verwenden
 */
$statement->where(new \Alvine\Persistence\Relation\SQL\Where
    ($definition->rewind()));

/**
 * Auch Limits lassen sich über ein Objekt definieren
 */
$statement->limit(1);

/**
 * Für das WHERE-Statement müssen 
 * Werte zugewiesen werden.
 */
$records=new \Alvine\Persistence\Relation\Records();
$records->append(new \Alvine\Persistence\Relation\Record(['ISBN'=>$searchISBN]));

$query = new \Alvine\Persistence\Relation\Query($statement, $records);

/**
 * Ausführen des Queries
 */
$result=$dataObject->execute($query);
/**
 * Es wird folgende SQL-Anweisung auf dem Server ausgeführt:
 * SELECT `example-1`.`ISBN`,`example-1`.`title`,`example-1`.`record`,
 *        `example-1`.`book-count` 
 * FROM   `example-1` 
 * WHERE  `example-1`.`ISBN`='978-3-86680-192-9' 
 * LIMIT  1
 */

if($result->containErrors()) {
    echo "FEHLER\r\n";
    echo (string) $result->getErrors();
    exit(1);
}

/**
 * Das Ergebnis des Queries ist eine Collection.
 */
foreach($result AS $resultSet) {
    $data=$resultSet->getData();
    print_r($data);

    /**
     * Dies ergibt folgende Ausgabe
     * 
     * [0] => Array
     *   (
     *       [ISBN] => 978-3-86680-192-9
     *       [title] => Stadt und Landkreis Hof......................
     *       [book-count] => 99
     *       [record] => Alvine\Date\DateTime Object
     *           (
     *               [nanosecond:protected] => 
     *               [second:protected] => 0
     *               [minute:protected] => 0
     *               [hour:protected] => 0
     *               [day:protected] => 12
     *               [month:protected] => 12
     *               [year:protected] => 2016
     *               [mask:protected] => 126
     *               [properties:protected] => Array
     *                   (
     *                   )
     *
     *               [hash:protected] => 
     *           )
     *
     *   )
     */
}


/** EXAMPLE:END * */
echo "\n".$profiler->record('end')->getDuration();