1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
<?php
/**
* Handles DB Multi-table query
*/
declare(strict_types=1);
namespace PhpMyAdmin\Database;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\ConfigStorage\RelationCleanup;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Operations;
use PhpMyAdmin\ParseAnalyze;
use PhpMyAdmin\Sql;
use PhpMyAdmin\Template;
use PhpMyAdmin\Transformations;
use PhpMyAdmin\Url;
use function array_keys;
use function md5;
/**
* Class to handle database Multi-table querying
*/
class MultiTableQuery
{
/**
* DatabaseInterface instance
*
* @var DatabaseInterface
*/
private $dbi;
/**
* Database name
*
* @var string
*/
private $db;
/**
* Default number of columns
*
* @var int
*/
private $defaultNoOfColumns;
/**
* Table names
*
* @var array
*/
private $tables;
/** @var Template */
public $template;
/**
* @param DatabaseInterface $dbi DatabaseInterface instance
* @param Template $template Template instance
* @param string $dbName Database name
* @param int $defaultNoOfColumns Default number of columns
*/
public function __construct(
DatabaseInterface $dbi,
Template $template,
$dbName,
$defaultNoOfColumns = 3
) {
$this->dbi = $dbi;
$this->db = $dbName;
$this->defaultNoOfColumns = $defaultNoOfColumns;
$this->template = $template;
$this->tables = $this->dbi->getTables($this->db);
}
/**
* Get Multi-Table query page HTML
*
* @return string Multi-Table query page HTML
*/
public function getFormHtml()
{
$tables = [];
foreach ($this->tables as $table) {
$tables[$table]['hash'] = md5($table);
$tables[$table]['columns'] = array_keys(
$this->dbi->getColumns($this->db, $table)
);
}
return $this->template->render('database/multi_table_query/form', [
'db' => $this->db,
'tables' => $tables,
'default_no_of_columns' => $this->defaultNoOfColumns,
]);
}
/**
* Displays multi-table query results
*
* @param string $sqlQuery The query to parse
* @param string $db The current database
*/
public static function displayResults($sqlQuery, $db): string
{
global $dbi;
[, $db] = ParseAnalyze::sqlQuery($sqlQuery, $db);
$goto = Url::getFromRoute('/database/multi-table-query');
$relation = new Relation($dbi);
$sql = new Sql(
$dbi,
$relation,
new RelationCleanup($dbi, $relation),
new Operations($dbi, $relation),
new Transformations(),
new Template()
);
return $sql->executeQueryAndSendQueryResponse(
null, // analyzed_sql_results
false, // is_gotofile
$db, // db
null, // table
null, // find_real_end
null, // sql_query_for_bookmark - see below
null, // extra_data
null, // message_to_show
null, // sql_data
$goto, // goto
null, // disp_query
null, // disp_message
$sqlQuery, // sql_query
null // complete_query
);
}
}
|