Update website
This commit is contained in:
parent
41ce1aa076
commit
ea0eb1c6e0
4222 changed files with 721797 additions and 14 deletions
276
admin/phpMyAdmin/libraries/classes/Dbal/MysqliResult.php
Normal file
276
admin/phpMyAdmin/libraries/classes/Dbal/MysqliResult.php
Normal file
|
@ -0,0 +1,276 @@
|
|||
<?php
|
||||
/**
|
||||
* Extension independent database result
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Dbal;
|
||||
|
||||
use Generator;
|
||||
use mysqli_result;
|
||||
use PhpMyAdmin\FieldMetadata;
|
||||
use Webmozart\Assert\Assert;
|
||||
|
||||
use function array_column;
|
||||
use function is_array;
|
||||
use function is_bool;
|
||||
use function is_string;
|
||||
use function method_exists;
|
||||
|
||||
use const MYSQLI_ASSOC;
|
||||
|
||||
/**
|
||||
* Extension independent database result
|
||||
*/
|
||||
final class MysqliResult implements ResultInterface
|
||||
{
|
||||
/**
|
||||
* The result identifier produced by the DBiExtension
|
||||
*
|
||||
* @var mysqli_result|null $result
|
||||
*/
|
||||
private $result;
|
||||
|
||||
/**
|
||||
* @param mysqli_result|bool $result
|
||||
*/
|
||||
public function __construct($result)
|
||||
{
|
||||
$this->result = is_bool($result) ? null : $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a generator that traverses through the whole result set
|
||||
* and returns each row as an associative array
|
||||
*
|
||||
* @psalm-return Generator<int, array<string, string|null>, mixed, void>
|
||||
*/
|
||||
public function getIterator(): Generator
|
||||
{
|
||||
if (! $this->result) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->result->data_seek(0);
|
||||
/** @var array<string, string|null> $row */
|
||||
foreach ($this->result as $row) {
|
||||
yield $row;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next row of the result with associative keys
|
||||
*
|
||||
* @return array<string,string|null>
|
||||
*/
|
||||
public function fetchAssoc(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$row = $this->result->fetch_assoc();
|
||||
|
||||
return is_array($row) ? $row : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next row of the result with numeric keys
|
||||
*
|
||||
* @return array<int,string|null>
|
||||
*/
|
||||
public function fetchRow(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$row = $this->result->fetch_row();
|
||||
|
||||
return is_array($row) ? $row : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a single value from the given result; false on error
|
||||
*
|
||||
* @param int|string $field
|
||||
*
|
||||
* @return string|false|null
|
||||
*/
|
||||
public function fetchValue($field = 0)
|
||||
{
|
||||
if (is_string($field)) {
|
||||
$row = $this->fetchAssoc();
|
||||
} else {
|
||||
$row = $this->fetchRow();
|
||||
}
|
||||
|
||||
return $row[$field] ?? false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all rows of the result
|
||||
*
|
||||
* @return array<int, array<string,string|null>>
|
||||
*/
|
||||
public function fetchAllAssoc(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// This function should return all rows, not only the remaining rows
|
||||
$this->result->data_seek(0);
|
||||
|
||||
// Pre PHP 8.1 when compiled against libmysql doesn't support fetch_all
|
||||
if (method_exists($this->result, 'fetch_all')) {
|
||||
return $this->result->fetch_all(MYSQLI_ASSOC);
|
||||
}
|
||||
|
||||
$rows = [];
|
||||
while ($row = $this->result->fetch_assoc()) {
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns values from the first column of each row
|
||||
*
|
||||
* @return array<int, string|null>
|
||||
*/
|
||||
public function fetchAllColumn(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// This function should return all rows, not only the remaining rows
|
||||
$this->result->data_seek(0);
|
||||
|
||||
// Pre PHP 8.1 when compiled against libmysql doesn't support fetch_all
|
||||
if (method_exists($this->result, 'fetch_all')) {
|
||||
return array_column($this->result->fetch_all(), 0);
|
||||
}
|
||||
|
||||
$rows = [];
|
||||
while ($row = $this->result->fetch_row()) {
|
||||
$rows[] = $row[0];
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns values as single dimensional array where the key is the first column
|
||||
* and the value is the second column, e.g.
|
||||
* SELECT id, name FROM users
|
||||
* produces: ['123' => 'John', '124' => 'Jane']
|
||||
*
|
||||
* @return array<string, string|null>
|
||||
*/
|
||||
public function fetchAllKeyPair(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
Assert::greaterThanEq($this->result->field_count, 2);
|
||||
|
||||
// This function should return all rows, not only the remaining rows
|
||||
$this->result->data_seek(0);
|
||||
|
||||
// Pre PHP 8.1 when compiled against libmysql doesn't support fetch_all
|
||||
if (method_exists($this->result, 'fetch_all')) {
|
||||
return array_column($this->result->fetch_all(), 1, 0);
|
||||
}
|
||||
|
||||
$rows = [];
|
||||
while ($row = $this->result->fetch_row()) {
|
||||
$rows[$row[0] ?? ''] = $row[1];
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of fields in the result
|
||||
*/
|
||||
public function numFields(): int
|
||||
{
|
||||
if (! $this->result) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return $this->result->field_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of rows in the result
|
||||
*
|
||||
* @return string|int
|
||||
* @psalm-return int|numeric-string
|
||||
*/
|
||||
public function numRows()
|
||||
{
|
||||
if (! $this->result) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return $this->result->num_rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjusts the result pointer to an arbitrary row in the result
|
||||
*
|
||||
* @param int $offset offset to seek
|
||||
*
|
||||
* @return bool True if the offset exists, false otherwise
|
||||
*/
|
||||
public function seek(int $offset): bool
|
||||
{
|
||||
if (! $this->result) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->result->data_seek($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns meta info for fields in $result
|
||||
*
|
||||
* @return array<int, FieldMetadata> meta info for fields in $result
|
||||
*/
|
||||
public function getFieldsMeta(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$fields = [];
|
||||
foreach ($this->result->fetch_fields() as $k => $field) {
|
||||
$fields[$k] = new FieldMetadata($field->type, $field->flags, $field);
|
||||
}
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the names of the fields in the result
|
||||
*
|
||||
* @return array<int, string> Fields names
|
||||
*/
|
||||
public function getFieldNames(): array
|
||||
{
|
||||
if (! $this->result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
/** @var list<string> $column */
|
||||
$column = array_column($this->result->fetch_fields(), 'name');
|
||||
|
||||
return $column;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue