parent
9c813d46cb
commit
8c1f4a9503
1 changed files with 94 additions and 11 deletions
|
@ -24,27 +24,33 @@ abstract class AbstractStatement extends DBStatement
|
|||
protected $columnsType;
|
||||
|
||||
/**
|
||||
* Режим выборки установленный через setFetchMode()
|
||||
* Режим выборки установленный через setFetchMode()/fetchAll()
|
||||
* @var int
|
||||
*/
|
||||
protected $fetchMode;
|
||||
|
||||
/**
|
||||
* colno, class или object из setFetchMode()
|
||||
* colno, class или object из setFetchMode()/fetchAll()
|
||||
* @var mixed
|
||||
*/
|
||||
protected $fetchArg;
|
||||
|
||||
/**
|
||||
* constructorArgs из setFetchMode()
|
||||
* constructorArgs из setFetchMode()/fetchAll()
|
||||
* @var array
|
||||
*/
|
||||
protected $ctorArgs;
|
||||
|
||||
/**
|
||||
* Флаг успешного завершения fetch() для PDO::FETCH_COLUMN
|
||||
* @var bool
|
||||
*/
|
||||
protected $okFetchColumn;
|
||||
|
||||
abstract public function getColumnsType(): array;
|
||||
abstract protected function convToBoolean(/* mixed */ $value): bool;
|
||||
|
||||
protected function dbSetFetchMode(int $mode, ...$args): bool
|
||||
protected function setFetchVars(int $mode, ...$args): void
|
||||
{
|
||||
$this->fetchMode = $mode;
|
||||
$this->fetchArg = null;
|
||||
|
@ -53,17 +59,26 @@ abstract class AbstractStatement extends DBStatement
|
|||
switch ($mode) {
|
||||
case PDO::FETCH_CLASS:
|
||||
$this->ctorArgs = $args[1] ?? null;
|
||||
case PDO::FETCH_COLUMN:
|
||||
case PDO::FETCH_INTO:
|
||||
$this->fetchArg = $args[0];
|
||||
break;
|
||||
case PDO::FETCH_COLUMN:
|
||||
$this->fetchArg = $args[0] ?? 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected function dbSetFetchMode(int $mode, ...$args): bool
|
||||
{
|
||||
$this->setFetchVars($mode, ...$args);
|
||||
|
||||
return parent::setFetchMode($mode, ...$args);
|
||||
}
|
||||
|
||||
protected function dbFetch(int $mode, int $cursorOrientation, int $cursorOffset) /* : mixed */
|
||||
protected function dbFetch(int $mode = 0, int $orientation = PDO::FETCH_ORI_NEXT, int $offset = 0) /* : mixed */
|
||||
{
|
||||
$this->okFetchColumn = false;
|
||||
|
||||
if (0 === $mode) {
|
||||
$mode = $this->fetchMode ?? 0;
|
||||
$colNum = $this->fetchArg ?? 0;
|
||||
|
@ -73,8 +88,8 @@ abstract class AbstractStatement extends DBStatement
|
|||
|
||||
$data = parent::fetch(
|
||||
PDO::FETCH_COLUMN === $mode ? PDO::FETCH_NUM : $mode,
|
||||
$cursorOrientation,
|
||||
$cursorOffset
|
||||
$orientation,
|
||||
$offset
|
||||
);
|
||||
|
||||
if (! \is_array($data)) {
|
||||
|
@ -108,14 +123,82 @@ abstract class AbstractStatement extends DBStatement
|
|||
unset($value);
|
||||
|
||||
if (PDO::FETCH_COLUMN === $mode) {
|
||||
$data = $data[$colNum];
|
||||
$this->okFetchColumn = true;
|
||||
$data = $data[$colNum];
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
protected function dbFetchAll(int $mode = 0 /* PDO::FETCH_DEFAULT */, /* mixed */ ...$args): array
|
||||
protected function dbFetchAll(int $mode, ...$args): array
|
||||
{
|
||||
return parent::fetchAll($mode, ...$args);
|
||||
if (0 !== $mode) {
|
||||
$this->setFetchVars($mode, ...$args);
|
||||
}
|
||||
|
||||
$result = [];
|
||||
|
||||
switch ($this->fetchMode) {
|
||||
case 0: /* PDO::FETCH_DEFAULT */
|
||||
case PDO::FETCH_BOTH:
|
||||
case PDO::FETCH_NUM:
|
||||
case PDO::FETCH_ASSOC:
|
||||
case PDO::FETCH_COLUMN:
|
||||
while (false !== ($data = $this->dbFetch()) || $this->okFetchColumn) {
|
||||
$result[] = $data;
|
||||
}
|
||||
|
||||
break;
|
||||
case PDO::FETCH_KEY_PAIR:
|
||||
if (2 !== $this->columnCount()) {
|
||||
throw new PDOException('General error: PDO::FETCH_KEY_PAIR fetch mode requires the result set to contain exactly 2 columns');
|
||||
}
|
||||
|
||||
while (false !== ($data = $this->dbFetch(PDO::FETCH_NUM))) {
|
||||
$result[$data[0]] = $data[1];
|
||||
}
|
||||
|
||||
break;
|
||||
case PDO::FETCH_UNIQUE:
|
||||
case PDO::FETCH_UNIQUE | PDO::FETCH_BOTH:
|
||||
case PDO::FETCH_UNIQUE | PDO::FETCH_NUM:
|
||||
case PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC:
|
||||
$this->fetchMode ^= PDO::FETCH_UNIQUE;
|
||||
|
||||
while (false !== ($data = $this->dbFetch())) {
|
||||
$key = \array_shift($data);
|
||||
$result[$key] = $data;
|
||||
}
|
||||
|
||||
break;
|
||||
case PDO::FETCH_GROUP:
|
||||
case PDO::FETCH_GROUP | PDO::FETCH_BOTH:
|
||||
case PDO::FETCH_GROUP | PDO::FETCH_NUM:
|
||||
case PDO::FETCH_GROUP | PDO::FETCH_ASSOC:
|
||||
$this->fetchMode ^= PDO::FETCH_GROUP;
|
||||
|
||||
while (false !== ($data = $this->dbFetch())) {
|
||||
$key = \array_shift($data);
|
||||
|
||||
if (PDO::FETCH_BOTH === $this->fetchMode) {
|
||||
\array_shift($data);;
|
||||
}
|
||||
|
||||
if (! isset($result[$key])) {
|
||||
$result[$key] = [];
|
||||
}
|
||||
|
||||
$result[$key][] = $data;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new PDOException('AbstractStatement class does not support this type for fetchAll(): ' . $this->fetchMode);
|
||||
|
||||
return parent::fetchAll($mode, ...$args);
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue