conversion automatique des dates et booléens
This commit is contained in:
parent
b5b1b83d46
commit
6a44ab7727
36
src/db/_private/Tbindings.php
Normal file
36
src/db/_private/Tbindings.php
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
namespace nur\sery\db\_private;
|
||||||
|
|
||||||
|
use DateTimeInterface;
|
||||||
|
use nur\sery\php\time\Date;
|
||||||
|
use nur\sery\php\time\DateTime;
|
||||||
|
use nur\sery\str;
|
||||||
|
|
||||||
|
trait Tbindings {
|
||||||
|
static function is_sqldate(string $date): bool {
|
||||||
|
return preg_match('/^\d{4}-\d{2}-\d{2}(?: \d{2}:\d{2}:\d{2})?$/', $date);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function verifixBindings(&$value): void {
|
||||||
|
if ($value instanceof Date) {
|
||||||
|
$value = $value->format('Y-m-d');
|
||||||
|
} elseif ($value instanceof DateTime) {
|
||||||
|
$value = $value->format('Y-m-d H:i:s');
|
||||||
|
} elseif ($value instanceof DateTimeInterface) {
|
||||||
|
$value = $value->format('Y-m-d H:i:s');
|
||||||
|
str::del_suffix($value, " 00:00:00");
|
||||||
|
} elseif (is_string($value)) {
|
||||||
|
if (self::is_sqldate($value)) {
|
||||||
|
# déjà dans le bon format
|
||||||
|
} elseif (Date::isa_date($value, true)) {
|
||||||
|
$value = new Date($value);
|
||||||
|
$value = $value->format('Y-m-d');
|
||||||
|
} elseif (DateTime::isa_datetime($value, true)) {
|
||||||
|
$value = new DateTime($value);
|
||||||
|
$value = $value->format('Y-m-d H:i:s');
|
||||||
|
}
|
||||||
|
} elseif (is_bool($value)) {
|
||||||
|
$value = $value? 1: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
src/db/_private/Tvalues.php
Normal file
35
src/db/_private/Tvalues.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
namespace nur\sery\db\_private;
|
||||||
|
|
||||||
|
use nur\sery\php\time\Date;
|
||||||
|
use nur\sery\php\time\DateTime;
|
||||||
|
|
||||||
|
trait Tvalues {
|
||||||
|
/**
|
||||||
|
* Tester si $date est une date/heure valide de la forme "YYYY-mm-dd HH:MM:SS"
|
||||||
|
*
|
||||||
|
* Si oui, $ms obtient les 6 éléments de la chaine
|
||||||
|
*/
|
||||||
|
static function is_datetime($date, ?array &$ms=null): bool {
|
||||||
|
return is_string($date) && preg_match('/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/', $date, $ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tester si $date est une date valide de la forme "YYYY-mm-dd [00:00:00]"
|
||||||
|
*
|
||||||
|
* Si oui, $ms obtient les 3 éléments de la chaine
|
||||||
|
*/
|
||||||
|
static function is_date($date, ?array &$ms=null): bool {
|
||||||
|
return is_string($date) && preg_match('/^(\d{4})-(\d{2})-(\d{2})(?: 00:00:00)?$/', $date, $ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
function verifixRow(array &$row) {
|
||||||
|
foreach ($row as &$value) {
|
||||||
|
if (self::is_date($value)) {
|
||||||
|
$value = new Date($value);
|
||||||
|
} elseif (self::is_datetime($value)) {
|
||||||
|
$value = new DateTime($value);
|
||||||
|
}
|
||||||
|
}; unset($value);
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@ namespace nur\sery\db\pdo;
|
|||||||
|
|
||||||
use Generator;
|
use Generator;
|
||||||
use nur\sery\cl;
|
use nur\sery\cl;
|
||||||
|
use nur\sery\db\_private\Tvalues;
|
||||||
use nur\sery\db\IDatabase;
|
use nur\sery\db\IDatabase;
|
||||||
use nur\sery\db\ITransactor;
|
use nur\sery\db\ITransactor;
|
||||||
use nur\sery\php\nur_func;
|
use nur\sery\php\nur_func;
|
||||||
@ -11,6 +12,8 @@ use nur\sery\php\time\DateTime;
|
|||||||
use nur\sery\ValueException;
|
use nur\sery\ValueException;
|
||||||
|
|
||||||
class Pdo implements IDatabase {
|
class Pdo implements IDatabase {
|
||||||
|
use Tvalues;
|
||||||
|
|
||||||
static function with($pdo, ?array $params=null): self {
|
static function with($pdo, ?array $params=null): self {
|
||||||
if ($pdo instanceof static) {
|
if ($pdo instanceof static) {
|
||||||
return $pdo;
|
return $pdo;
|
||||||
@ -219,34 +222,6 @@ class Pdo implements IDatabase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Tester si $date est une date/heure valide de la forme "YYYY-mm-dd HH:MM:SS"
|
|
||||||
*
|
|
||||||
* Si oui, $ms obtient les 6 éléments de la chaine
|
|
||||||
*/
|
|
||||||
static function is_datetime($date, ?array &$ms=null): bool {
|
|
||||||
return is_string($date) && preg_match('/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/', $date, $ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tester si $date est une date valide de la forme "YYYY-mm-dd [00:00:00]"
|
|
||||||
*
|
|
||||||
* Si oui, $ms obtient les 3 éléments de la chaine
|
|
||||||
*/
|
|
||||||
static function is_date($date, ?array &$ms=null): bool {
|
|
||||||
return is_string($date) && preg_match('/^(\d{4})-(\d{2})-(\d{2})(?: 00:00:00)?$/', $date, $ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
function verifixRow(array &$row) {
|
|
||||||
foreach ($row as &$value) {
|
|
||||||
if (self::is_date($value)) {
|
|
||||||
$value = new Date($value);
|
|
||||||
} elseif (self::is_datetime($value)) {
|
|
||||||
$value = new DateTime($value);
|
|
||||||
}
|
|
||||||
}; unset($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function get($query, ?array $params=null, bool $entireRow=false) {
|
function get($query, ?array $params=null, bool $entireRow=false) {
|
||||||
$db = $this->db();
|
$db = $this->db();
|
||||||
$query = new _query_base($query, $params);
|
$query = new _query_base($query, $params);
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace nur\sery\db\pdo;
|
namespace nur\sery\db\pdo;
|
||||||
|
|
||||||
use DateTimeInterface;
|
|
||||||
use nur\sery\db\_private\_base;
|
use nur\sery\db\_private\_base;
|
||||||
use nur\sery\php\time\Date;
|
use nur\sery\db\_private\Tbindings;
|
||||||
use nur\sery\php\time\DateTime;
|
|
||||||
use nur\sery\str;
|
|
||||||
use nur\sery\ValueException;
|
use nur\sery\ValueException;
|
||||||
|
|
||||||
class _query_base extends _base {
|
class _query_base extends _base {
|
||||||
|
use Tbindings;
|
||||||
|
|
||||||
protected static function verifix(&$sql, ?array &$bindinds=null, ?array &$meta=null): void {
|
protected static function verifix(&$sql, ?array &$bindinds=null, ?array &$meta=null): void {
|
||||||
if (is_array($sql)) {
|
if (is_array($sql)) {
|
||||||
$prefix = $sql[0] ?? null;
|
$prefix = $sql[0] ?? null;
|
||||||
@ -55,33 +54,6 @@ class _query_base extends _base {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function is_sqldate(string $date): bool {
|
|
||||||
return preg_match('/^\d{4}-\d{2}-\d{2}(?: \d{2}:\d{2}:\d{2})?$/', $date);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function verifixBindings(&$value): void {
|
|
||||||
if ($value instanceof Date) {
|
|
||||||
$value = $value->format('Y-m-d');
|
|
||||||
} elseif ($value instanceof DateTime) {
|
|
||||||
$value = $value->format('Y-m-d H:i:s');
|
|
||||||
} elseif ($value instanceof DateTimeInterface) {
|
|
||||||
$value = $value->format('Y-m-d H:i:s');
|
|
||||||
str::del_suffix($value, " 00:00:00");
|
|
||||||
} elseif (is_string($value)) {
|
|
||||||
if (self::is_sqldate($value)) {
|
|
||||||
# déjà dans le bon format
|
|
||||||
} elseif (Date::isa_date($value, true)) {
|
|
||||||
$value = new Date($value);
|
|
||||||
$value = $value->format('Y-m-d');
|
|
||||||
} elseif (DateTime::isa_datetime($value, true)) {
|
|
||||||
$value = new DateTime($value);
|
|
||||||
$value = $value->format('Y-m-d H:i:s');
|
|
||||||
}
|
|
||||||
} elseif (is_bool($value)) {
|
|
||||||
$value = $value? 1: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const DEBUG_QUERIES = false;
|
const DEBUG_QUERIES = false;
|
||||||
|
|
||||||
function useStmt(\PDO $db, ?\PDOStatement &$stmt=null, ?string &$sql=null): bool {
|
function useStmt(\PDO $db, ?\PDOStatement &$stmt=null, ?string &$sql=null): bool {
|
||||||
|
@ -3,6 +3,7 @@ namespace nur\sery\db\sqlite;
|
|||||||
|
|
||||||
use Generator;
|
use Generator;
|
||||||
use nur\sery\cl;
|
use nur\sery\cl;
|
||||||
|
use nur\sery\db\_private\Tvalues;
|
||||||
use nur\sery\db\IDatabase;
|
use nur\sery\db\IDatabase;
|
||||||
use nur\sery\db\ITransactor;
|
use nur\sery\db\ITransactor;
|
||||||
use nur\sery\php\nur_func;
|
use nur\sery\php\nur_func;
|
||||||
@ -15,6 +16,8 @@ use SQLite3Stmt;
|
|||||||
* Class Sqlite: frontend vers une base de données sqlite3
|
* Class Sqlite: frontend vers une base de données sqlite3
|
||||||
*/
|
*/
|
||||||
class Sqlite implements IDatabase {
|
class Sqlite implements IDatabase {
|
||||||
|
use Tvalues;
|
||||||
|
|
||||||
static function with($sqlite, ?array $params=null): self {
|
static function with($sqlite, ?array $params=null): self {
|
||||||
if ($sqlite instanceof static) {
|
if ($sqlite instanceof static) {
|
||||||
return $sqlite;
|
return $sqlite;
|
||||||
@ -278,7 +281,8 @@ class Sqlite implements IDatabase {
|
|||||||
try {
|
try {
|
||||||
$row = $result->fetchArray(SQLITE3_ASSOC);
|
$row = $result->fetchArray(SQLITE3_ASSOC);
|
||||||
if ($row === false) return null;
|
if ($row === false) return null;
|
||||||
elseif ($entireRow) return $row;
|
$this->verifixRow($row);
|
||||||
|
if ($entireRow) return $row;
|
||||||
else return cl::first($row);
|
else return cl::first($row);
|
||||||
} finally {
|
} finally {
|
||||||
$result->finalize();
|
$result->finalize();
|
||||||
@ -299,6 +303,7 @@ class Sqlite implements IDatabase {
|
|||||||
if ($primaryKeys !== null) $primaryKeys = cl::with($primaryKeys);
|
if ($primaryKeys !== null) $primaryKeys = cl::with($primaryKeys);
|
||||||
try {
|
try {
|
||||||
while (($row = $result->fetchArray(SQLITE3_ASSOC)) !== false) {
|
while (($row = $result->fetchArray(SQLITE3_ASSOC)) !== false) {
|
||||||
|
$this->verifixRow($row);
|
||||||
if ($primaryKeys !== null) {
|
if ($primaryKeys !== null) {
|
||||||
$key = implode("-", cl::select($row, $primaryKeys));
|
$key = implode("-", cl::select($row, $primaryKeys));
|
||||||
yield $key => $row;
|
yield $key => $row;
|
||||||
|
@ -2,11 +2,14 @@
|
|||||||
namespace nur\sery\db\sqlite;
|
namespace nur\sery\db\sqlite;
|
||||||
|
|
||||||
use nur\sery\db\_private\_base;
|
use nur\sery\db\_private\_base;
|
||||||
|
use nur\sery\db\_private\Tbindings;
|
||||||
use nur\sery\ValueException;
|
use nur\sery\ValueException;
|
||||||
use SQLite3;
|
use SQLite3;
|
||||||
use SQLite3Stmt;
|
use SQLite3Stmt;
|
||||||
|
|
||||||
class _query_base extends _base {
|
class _query_base extends _base {
|
||||||
|
use Tbindings;
|
||||||
|
|
||||||
protected static function verifix(&$sql, ?array &$bindinds=null, ?array &$meta=null): void {
|
protected static function verifix(&$sql, ?array &$bindinds=null, ?array &$meta=null): void {
|
||||||
if (is_array($sql)) {
|
if (is_array($sql)) {
|
||||||
$prefix = $sql[0] ?? null;
|
$prefix = $sql[0] ?? null;
|
||||||
@ -42,6 +45,7 @@ class _query_base extends _base {
|
|||||||
$close = true;
|
$close = true;
|
||||||
try {
|
try {
|
||||||
foreach ($this->bindings as $param => $value) {
|
foreach ($this->bindings as $param => $value) {
|
||||||
|
$this->verifixBindings($value);
|
||||||
SqliteException::check($db, $stmt->bindValue($param, $value));
|
SqliteException::check($db, $stmt->bindValue($param, $value));
|
||||||
}
|
}
|
||||||
$close = false;
|
$close = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user