![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/laminas/laminas-db/src/Adapter/Driver/Mysqli/ |
<?php namespace Laminas\Db\Adapter\Driver\Mysqli; use Iterator; use Laminas\Db\Adapter\Driver\ResultInterface; use Laminas\Db\Adapter\Exception; use mysqli; use mysqli_result; use mysqli_stmt; // phpcs:ignore SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse use ReturnTypeWillChange; use function array_fill; use function call_user_func_array; use function count; class Result implements Iterator, ResultInterface { /** @var mysqli|mysqli_result|mysqli_stmt */ protected $resource; /** @var bool */ protected $isBuffered; /** * Cursor position * * @var int */ protected $position = 0; /** * Number of known rows * * @var int */ protected $numberOfRows = -1; /** * Is the current() operation already complete for this pointer position? * * @var bool */ protected $currentComplete = false; /** @var bool */ protected $nextComplete = false; /** @var mixed */ protected $currentData; /** @var array */ protected $statementBindValues = ['keys' => null, 'values' => []]; /** @var mixed */ protected $generatedValue; /** * Initialize * * @param mixed $resource * @param mixed $generatedValue * @param bool|null $isBuffered * @return $this Provides a fluent interface * @throws Exception\InvalidArgumentException */ public function initialize($resource, $generatedValue, $isBuffered = null) { if ( ! $resource instanceof mysqli && ! $resource instanceof mysqli_result && ! $resource instanceof mysqli_stmt ) { throw new Exception\InvalidArgumentException('Invalid resource provided.'); } if ($isBuffered !== null) { $this->isBuffered = $isBuffered; } else { if ( $resource instanceof mysqli || $resource instanceof mysqli_result || $resource instanceof mysqli_stmt && $resource->num_rows !== 0 ) { $this->isBuffered = true; } } $this->resource = $resource; $this->generatedValue = $generatedValue; return $this; } /** * Force buffering * * @throws Exception\RuntimeException */ public function buffer() { if ($this->resource instanceof mysqli_stmt && $this->isBuffered !== true) { if ($this->position > 0) { throw new Exception\RuntimeException('Cannot buffer a result set that has started iteration.'); } $this->resource->store_result(); $this->isBuffered = true; } } /** * Check if is buffered * * @return bool|null */ public function isBuffered() { return $this->isBuffered; } /** * Return the resource * * @return mixed */ public function getResource() { return $this->resource; } /** * Is query result? * * @return bool */ public function isQueryResult() { return $this->resource->field_count > 0; } /** * Get affected rows * * @return int */ public function getAffectedRows() { if ($this->resource instanceof mysqli || $this->resource instanceof mysqli_stmt) { return $this->resource->affected_rows; } return $this->resource->num_rows; } /** * Current * * @return mixed */ #[ReturnTypeWillChange] public function current() { if ($this->currentComplete) { return $this->currentData; } if ($this->resource instanceof mysqli_stmt) { $this->loadDataFromMysqliStatement(); return $this->currentData; } else { $this->loadFromMysqliResult(); return $this->currentData; } } /** * Mysqli's binding and returning of statement values * * Mysqli requires you to bind variables to the extension in order to * get data out. These values have to be references: * * @see http://php.net/manual/en/mysqli-stmt.bind-result.php * * @throws Exception\RuntimeException * @return bool */ protected function loadDataFromMysqliStatement() { // build the default reference based bind structure, if it does not already exist if ($this->statementBindValues['keys'] === null) { $this->statementBindValues['keys'] = []; $resultResource = $this->resource->result_metadata(); foreach ($resultResource->fetch_fields() as $col) { $this->statementBindValues['keys'][] = $col->name; } $this->statementBindValues['values'] = array_fill(0, count($this->statementBindValues['keys']), null); $refs = []; foreach ($this->statementBindValues['values'] as $i => &$f) { $refs[$i] = &$f; } call_user_func_array([$this->resource, 'bind_result'], $this->statementBindValues['values']); } if (($r = $this->resource->fetch()) === null) { if (! $this->isBuffered) { $this->resource->close(); } return false; } elseif ($r === false) { throw new Exception\RuntimeException($this->resource->error); } // dereference for ($i = 0, $count = count($this->statementBindValues['keys']); $i < $count; $i++) { $this->currentData[$this->statementBindValues['keys'][$i]] = $this->statementBindValues['values'][$i]; } $this->currentComplete = true; $this->nextComplete = true; $this->position++; return true; } /** * Load from mysqli result * * @return bool */ protected function loadFromMysqliResult() { $this->currentData = null; if (($data = $this->resource->fetch_assoc()) === null) { return false; } $this->position++; $this->currentData = $data; $this->currentComplete = true; $this->nextComplete = true; $this->position++; return true; } /** * Next * * @return void */ #[ReturnTypeWillChange] public function next() { $this->currentComplete = false; if ($this->nextComplete === false) { $this->position++; } $this->nextComplete = false; } /** * Key * * @return mixed */ #[ReturnTypeWillChange] public function key() { return $this->position; } /** * Rewind * * @throws Exception\RuntimeException * @return void */ #[ReturnTypeWillChange] public function rewind() { if (0 !== $this->position && false === $this->isBuffered) { throw new Exception\RuntimeException('Unbuffered results cannot be rewound for multiple iterations'); } $this->resource->data_seek(0); // works for both mysqli_result & mysqli_stmt $this->currentComplete = false; $this->position = 0; } /** * Valid * * @return bool */ #[ReturnTypeWillChange] public function valid() { if ($this->currentComplete) { return true; } if ($this->resource instanceof mysqli_stmt) { return $this->loadDataFromMysqliStatement(); } return $this->loadFromMysqliResult(); } /** * Count * * @throws Exception\RuntimeException * @return int */ #[ReturnTypeWillChange] public function count() { if ($this->isBuffered === false) { throw new Exception\RuntimeException('Row count is not available in unbuffered result sets.'); } return $this->resource->num_rows; } /** * Get field count * * @return int */ public function getFieldCount() { return $this->resource->field_count; } /** * Get generated value * * @return mixed|null */ public function getGeneratedValue() { return $this->generatedValue; } }