76 lines
2.1 KiB
PHP
76 lines
2.1 KiB
PHP
|
<?php
|
||
|
namespace nur\m\base;
|
||
|
|
||
|
use nur\A;
|
||
|
use nur\m\IConn;
|
||
|
use nur\m\IQueryLogger;
|
||
|
|
||
|
/**
|
||
|
* Class AbstractConn
|
||
|
*/
|
||
|
abstract class AbstractConn implements IConn {
|
||
|
static function fix_sql_with_seq_bindings(string &$sql, ?array $bindings): void {
|
||
|
if ($bindings !== null) {
|
||
|
# si une des valeurs est un tableau séquentiel, il faut binder sur chaque
|
||
|
# valeur du tableau. ici, on corrige la requête
|
||
|
foreach ($bindings as $name => $values) {
|
||
|
if (A::is_seq($values)) {
|
||
|
$count = count($values);
|
||
|
$names = [];
|
||
|
for ($i = 0; $i < $count; $i++) {
|
||
|
$names[] = ":${name}_${i}";
|
||
|
}
|
||
|
$names = implode(", ", $names);
|
||
|
$sql = str_replace(":$name", "($names)", $sql);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** @var IQueryLogger */
|
||
|
protected $queryLogger;
|
||
|
|
||
|
/**
|
||
|
* spécifier une instance de IQueryLogger permettant le suivi des requêtes
|
||
|
* exécutées par cet objet.
|
||
|
*
|
||
|
* retourner l'instance spécifiée.
|
||
|
*/
|
||
|
function setQueryLogger(IQueryLogger $queryLogger): IQueryLogger {
|
||
|
$this->queryLogger = $queryLogger;
|
||
|
return $queryLogger;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* supprimer l'instance de IQueryLogger configurée avec {@link setQueryLogger()}.
|
||
|
* retourner l'instance qui a été supprimée, ou null s'il n'y en avait pas.
|
||
|
*
|
||
|
* @return IQueryLogger
|
||
|
*/
|
||
|
function resetQueryLogger(): ?IQueryLogger {
|
||
|
$query_logger = $this->queryLogger;
|
||
|
$this->queryLogger = null;
|
||
|
return $query_logger;
|
||
|
}
|
||
|
|
||
|
function all(string $sql, ?array $filter=null): array {
|
||
|
return $this->query()->select($sql, $filter)->all();
|
||
|
}
|
||
|
|
||
|
function allVals(?string $name, string $sql, ?array $filter=null): array {
|
||
|
return rows::vals($this->all($sql, $filter), $name);
|
||
|
}
|
||
|
|
||
|
function first(string $sql, ?array $filter=null): ?array {
|
||
|
return $this->query()->select($sql, $filter)->first();
|
||
|
}
|
||
|
|
||
|
function firstVal(?string $name, string $sql, ?array $filter=null, $default=null) {
|
||
|
return rows::val($this->first($sql, $filter), $name, $default);
|
||
|
}
|
||
|
|
||
|
function update(string $sql, ?array $filter=null): int {
|
||
|
return $this->query()->update($sql, $filter)->execute(true)->numRows();
|
||
|
}
|
||
|
}
|