From ae372aabbafdd4ed838907f524f598282535f155 Mon Sep 17 00:00:00 2001 From: jakubvrana Date: Tue, 10 Jul 2007 13:30:42 +0000 Subject: [PATCH] Database abstraction git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@97 7c3ca157-0c34-0410-bff1-cbf682f78f5c --- abstraction.inc.php | 124 +++++++++++++++++++++++++++++++++++--------- auth.inc.php | 13 ++--- call.inc.php | 42 ++++++--------- connect.inc.php | 4 +- create.inc.php | 17 +++--- database.inc.php | 24 ++++----- design.inc.php | 17 +++--- download.inc.php | 2 +- dump.inc.php | 62 +++++++++++----------- edit.inc.php | 11 ++-- functions.inc.php | 78 +++++++++++++++------------- index.php | 11 ++-- indexes.inc.php | 4 +- lang.inc.php | 2 + select.inc.php | 24 ++++----- sql.inc.php | 25 +++++---- table.inc.php | 18 +++---- view.inc.php | 2 +- 18 files changed, 276 insertions(+), 204 deletions(-) diff --git a/abstraction.inc.php b/abstraction.inc.php index f84f61d6..e90819d6 100644 --- a/abstraction.inc.php +++ b/abstraction.inc.php @@ -1,42 +1,116 @@ init(); + } + + function connect($server, $username, $password) { + return $this->real_connect( + (strlen($server) ? $server : ini_get("mysqli.default_host")), + (strlen("$server$username") ? $username : ini_get("mysqli.default_user")), + (strlen("$server$username$password") ? $password : ini_get("mysqli.default_pw")) + ); + } + + function result($result, $offset, $field = 0) { + $result->data_seek($offset); + $row = $result->fetch_array(); return $row[$field]; } } - $mysql = mysqli_init(); + + $mysql = new Min_MySQLi; + } elseif (extension_loaded("mysql")) { class Min_MySQL { - var $_link; - function real_connect($server, $username, $password) { return $this->_link = mysql_connect($server, $username, $password, false, 131072); } - function query($query) { return new Min_MySQLResult(mysql_query($query, $this->_link)); } - function result($result, $row, $field = 0) { return mysql_result($result->_result, $row, $field); } - function error() { return mysql_error($this->_link); } - function affected_rows() { return mysql_affected_rows($this->_link); } - function select_db($database) { return mysql_select_db($database, $this->_link); } - function real_escape_string($string) { return mysql_real_escape_string($string, $this->_link); } - function get_server_info() { return mysql_get_server_info($this->_link); } + var $_link, $_result, $server_info, $affected_rows, $error; - function fetch_field($result, $offset = null) { - $row = mysql_fetch_field($result, $offset); + function connect($server, $username, $password) { + $this->_link = @mysql_pconnect( + (strlen($server) ? $server : ini_get("mysql.default_host")), + (strlen("$server$username") ? $username : ini_get("mysql.default_user")), + (strlen("$server$username$password") ? $password : ini_get("mysql.default_password")), + 131072 // CLIENT_MULTI_RESULTS for CALL + ); + if ($this->_link) { + $this->server_info = mysql_get_server_info($this->_link); + } + return (bool) $this->_link; + } + + function query($query) { + $result = mysql_query($query, $this->_link); + if (!$result) { + $this->error = mysql_error($this->_link); + return false; + } elseif ($result === true) { + $this->affected_rows = mysql_affected_rows($this->_link); + return true; + } + return new Min_MySQLResult($result); + } + + function multi_query($query) { + return $this->_result = $this->query($query); + } + + function store_result() { + return $this->_result; + } + + function next_result() { + return false; + } + + function result($result, $offset, $field = 0) { + return mysql_result($result->_result, $offset, $field); + } + + function select_db($database) { + return mysql_select_db($database, $this->_link); + } + + function real_escape_string($string) { + return mysql_real_escape_string($string, $this->_link); + } + } + + class Min_MySQLResult { + var $_result, $_offset, $num_rows; + + function Min_MySQLResult($result) { + $this->_result = $result; + $this->_offset = 0; + $this->num_rows = mysql_num_rows($result); + } + + function fetch_assoc() { + return mysql_fetch_assoc($this->_result); + } + + function fetch_row() { + return mysql_fetch_row($this->_result); + } + + function fetch_field() { + $row = mysql_fetch_field($this->_result, $this->_offset++); $row->orgtable = $row->table; $row->orgname = $row->name; $row->charsetnr = ($row->blob ? 63 : 0); return $row; } + + function free() { + return mysql_free_result($this->_result); + } } - class Min_MySQLResult { - var $_result; - function Min_MySQLResult($result) { $this->_result = $result; } - function fetch_assoc() { return mysql_fetch_assoc($this->_result); } - function fetch_row() { return mysql_fetch_row($this->_result); } - function free_result() { return mysql_free_result($this->_result); } - function num_rows() { return mysql_num_rows($this->_result); } - } - $mysql = new Min_MySQL; -} else { + $mysql = new Min_MySQL; + +} else { + page_header(lang('No MySQL extension')); + echo "

" . lang('None of supported PHP extensions (%s) are available.', 'mysqli, mysql') . "

\n"; + page_footer("auth"); + exit; } diff --git a/auth.inc.php b/auth.inc.php index e15ec934..1b622e2a 100644 --- a/auth.inc.php +++ b/auth.inc.php @@ -14,14 +14,7 @@ if (isset($_POST["server"])) { $_SESSION["tokens"][$_GET["server"]] = array(); } -$username = $_SESSION["usernames"][$_GET["server"]]; -$password = $_SESSION["passwords"][$_GET["server"]]; -if (isset($_GET["logout"]) || !@mysql_connect( - (strlen($_GET["server"]) ? $_GET["server"] : ini_get("mysql.default_host")), - (strlen("$_GET[server]$username") ? $username : ini_get("mysql.default_user")), - (strlen("$_GET[server]$username$password") ? $password : ini_get("mysql.default_password")), - false, 131072 // CLIENT_MULTI_RESULTS for CALL -)) { +if (isset($_GET["logout"]) || !$mysql->connect($_GET["server"], $_SESSION["usernames"][$_GET["server"]], $_SESSION["passwords"][$_GET["server"]])) { page_header(lang('Login')); if (isset($_GET["logout"])) { echo "

" . lang('Logout successful.') . "

\n"; @@ -32,7 +25,7 @@ if (isset($_GET["logout"]) || !@mysql_connect(
- +
:" maxlength="60" />
:
:" maxlength="16" />
:
$val) { // expired session @@ -60,4 +53,4 @@ if (isset($_GET["logout"]) || !@mysql_connect( page_footer("auth"); exit; } -mysql_query("SET SQL_QUOTE_SHOW_CREATE=1"); +$mysql->query("SET SQL_QUOTE_SHOW_CREATE=1"); diff --git a/call.inc.php b/call.inc.php index 9e206c9e..f1f29e77 100644 --- a/call.inc.php +++ b/call.inc.php @@ -1,10 +1,13 @@ result($mysql->query("SHOW CREATE " . (isset($_GET["callf"]) ? "FUNCTION" : "PROCEDURE") . " " . idf_escape($_GET["call"])), 0, 2); preg_match("~\\($pattern(?:\\s*,$pattern)*~is", $create, $match); $in = array(); $out = array(); @@ -26,43 +29,32 @@ foreach ($matches as $i => $match) { } $params[$i] = $field; } + if ($_POST) { $call = array(); foreach ($params as $key => $field) { if (in_array($key, $in)) { $val = process_input($key, $field); if (isset($out[$key])) { - mysql_query("SET @" . idf_escape($field["field"]) . " = " . $val); + $mysql->query("SET @" . idf_escape($field["field"]) . " = " . $val); } } $call[] = (isset($out[$key]) ? "@" . idf_escape($field["field"]) : $val); } - $result = mysql_query((isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($_GET["call"]) . "(" . implode(", ", $call) . ")"); + $result = $mysql->multi_query((isset($_GET["callf"]) ? "SELECT" : "CALL") . " " . idf_escape($_GET["call"]) . "(" . implode(", ", $call) . ")"); if (!$result) { - $error = mysql_error(); - } elseif ($result === true) { - $message = lang('Routine has been called, %d row(s) affected.', mysql_affected_rows()); - if (!$out) { - redirect(substr($SELF, 0, -1), $message); - } - } -} - -page_header(lang('Call') . ": " . htmlspecialchars($_GET["call"])); - -if ($_POST) { - if (!$result) { - echo "

" . lang('Error during calling') . ": " . htmlspecialchars($error) . "

\n"; + echo "

" . lang('Error during calling') . ": " . htmlspecialchars($mysql->error) . "

\n"; } else { - if ($result === true) { - echo "

$message

\n"; - } else { - select($result); - echo "
\n"; - } + do { + $result = $mysql->store_result(); + if (is_object($result)) { + select($result); + } else { + echo "

" . lang('Routine has been called, %d row(s) affected.', $mysql->affected_rows) . "

\n"; + } + } while ($mysql->next_result()); if ($out) { - select(mysql_query("SELECT " . implode(", ", $out))); - echo "
\n"; + select($mysql->query("SELECT " . implode(", ", $out))); } } } diff --git a/connect.inc.php b/connect.inc.php index 33deffb2..95d7499b 100644 --- a/connect.inc.php +++ b/connect.inc.php @@ -1,5 +1,5 @@ select_db($_GET["db"]) : isset($_GET["sql"]) || isset($_GET["dump"]) || isset($_GET["database"]))) { page_header(lang('Select database')); if (strlen($_GET["db"])) { echo "

" . lang('Invalid database.') . "

\n"; @@ -9,4 +9,4 @@ if (!(strlen($_GET["db"]) ? mysql_select_db($_GET["db"]) : isset($_GET["sql"]) | page_footer("db"); exit; } -mysql_query("SET CHARACTER SET utf8"); +$mysql->query("SET CHARACTER SET utf8"); diff --git a/create.inc.php b/create.inc.php index de1fdec0..f30eb96d 100644 --- a/create.inc.php +++ b/create.inc.php @@ -29,10 +29,10 @@ if ($_POST && !$error && !$_POST["add"]) { . idf_escape($field["field"]) . " $field[type]" . ($field["length"] ? "($field[length])" : "") . (preg_match('~int|float|double|decimal~', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "") - . (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " COLLATE '" . mysql_real_escape_string($field["collation"]) . "'" : "") + . (preg_match('~char|text|enum|set~', $field["type"]) && $field["collation"] ? " COLLATE '" . $mysql->real_escape_string($field["collation"]) . "'" : "") . ($field["null"] ? "" : " NOT NULL") . ($key == $_POST["auto_increment"] ? " AUTO_INCREMENT$auto_increment_index" : "") - . " COMMENT '" . mysql_real_escape_string($field["comment"]) . "'" + . " COMMENT '" . $mysql->real_escape_string($field["comment"]) . "'" . (strlen($_GET["create"]) && !strlen($field["orig"]) ? $after : "") ; $after = "AFTER " . idf_escape($field["field"]); @@ -40,9 +40,9 @@ if ($_POST && !$error && !$_POST["add"]) { $fields[] = "DROP " . idf_escape($field["orig"]); } } - $status = ($_POST["Engine"] ? " ENGINE='" . mysql_real_escape_string($_POST["Engine"]) . "'" : "") - . ($_POST["Collation"] ? " COLLATE '" . mysql_real_escape_string($_POST["Collation"]) . "'" : "") - . " COMMENT='" . mysql_real_escape_string($_POST["Comment"]) . "'" + $status = ($_POST["Engine"] ? " ENGINE='" . $mysql->real_escape_string($_POST["Engine"]) . "'" : "") + . ($_POST["Collation"] ? " COLLATE '" . $mysql->real_escape_string($_POST["Collation"]) . "'" : "") + . " COMMENT='" . $mysql->real_escape_string($_POST["Comment"]) . "'" ; if (strlen($_GET["create"])) { $query = "ALTER TABLE " . idf_escape($_GET["create"]) . " " . implode(", ", $fields) . ", RENAME TO " . idf_escape($_POST["name"]) . ", $status"; @@ -52,10 +52,10 @@ if ($_POST && !$error && !$_POST["add"]) { $message = lang('Table has been created.'); } } - if (mysql_query($query)) { + if ($mysql->query($query)) { redirect(($_POST["drop"] ? substr($SELF, 0, -1) : $SELF . "table=" . urlencode($_POST["name"])), $message); } - $error = mysql_error(); + $error = $mysql->error; } page_header(strlen($_GET["create"]) ? lang('Alter table') . ': ' . htmlspecialchars($_GET["create"]) : lang('Create table')); @@ -72,7 +72,8 @@ if ($_POST) { $row["fields"][$row["auto_increment"]]["auto_increment"] = true; } } elseif (strlen($_GET["create"])) { - $row = mysql_fetch_assoc(mysql_query("SHOW TABLE STATUS LIKE '" . mysql_real_escape_string($_GET["create"]) . "'")); + $result = $mysql->query("SHOW TABLE STATUS LIKE '" . $mysql->real_escape_string($_GET["create"]) . "'"); + $row = $result->fetch_assoc(); $row["name"] = $_GET["create"]; $row["fields"] = array_values(fields($_GET["create"])); } else { diff --git a/database.inc.php b/database.inc.php index 4ade3f30..e42e7054 100644 --- a/database.inc.php +++ b/database.inc.php @@ -1,30 +1,30 @@ query("DROP DATABASE " . idf_escape($_GET["db"]))) { redirect(substr(preg_replace('~(\\?)db=[^&]*&|&db=[^&]*~', '\\1', $SELF), 0, -1), lang('Database has been dropped.')); } } elseif ($_GET["db"] !== $_POST["name"]) { - if (mysql_query("CREATE DATABASE " . idf_escape($_POST["name"]) . ($_POST["collation"] ? " COLLATE '" . mysql_real_escape_string($_POST["collation"]) . "'" : ""))) { + if ($mysql->query("CREATE DATABASE " . idf_escape($_POST["name"]) . ($_POST["collation"] ? " COLLATE '" . $mysql->real_escape_string($_POST["collation"]) . "'" : ""))) { if (!strlen($_GET["db"])) { redirect(preg_replace('~(\\?)db=[^&]*&|&db=[^&]*~', '\\1', $SELF) . "db=" . urlencode($_POST["name"]), lang('Database has been created.')); } - $result = mysql_query("SHOW TABLES"); - while ($row = mysql_fetch_row($result)) { - if (!mysql_query("RENAME TABLE " . idf_escape($row[0]) . " TO " . idf_escape($_POST["name"]) . "." . idf_escape($row[0]))) { + $result = $mysql->query("SHOW TABLES"); + while ($row = $result->fetch_row()) { + if (!$mysql->query("RENAME TABLE " . idf_escape($row[0]) . " TO " . idf_escape($_POST["name"]) . "." . idf_escape($row[0]))) { break; } } - mysql_free_result($result); + $result->free(); if (!$row) { - mysql_query("DROP DATABASE " . idf_escape($_GET["db"])); + $mysql->query("DROP DATABASE " . idf_escape($_GET["db"])); redirect(preg_replace('~(\\?)db=[^&]*&|&db=[^&]*~', '\\1', $SELF) . "db=" . urlencode($_POST["name"]), lang('Database has been renamed.')); } } - } elseif (!$_POST["collation"] || mysql_query("ALTER DATABASE " . idf_escape($_POST["name"]) . " COLLATE '" . mysql_real_escape_string($_POST["collation"]) . "'")) { + } elseif (!$_POST["collation"] || $mysql->query("ALTER DATABASE " . idf_escape($_POST["name"]) . " COLLATE '" . $mysql->real_escape_string($_POST["collation"]) . "'")) { redirect(substr($SELF, 0, -1), ($_POST["collation"] ? lang('Database has been altered.') : null)); } - $error = mysql_error(); + $error = $mysql->error; } page_header(strlen($_GET["db"]) ? lang('Alter database') . ": " . htmlspecialchars($_GET["db"]) : lang('Create database')); @@ -36,11 +36,11 @@ if ($_POST) { } else { $name = $_GET["db"]; $collate = array(); - if (strlen($_GET["db"]) && ($result = mysql_query("SHOW CREATE DATABASE " . idf_escape($_GET["db"])))) { - if (preg_match('~ COLLATE ([^ ]+)~', mysql_result($result, 0, 1), $match)) { + if (strlen($_GET["db"]) && ($result = $mysql->query("SHOW CREATE DATABASE " . idf_escape($_GET["db"])))) { + if (preg_match('~ COLLATE ([^ ]+)~', $mysql->result($result, 0, 1), $match)) { $collate = $match[1]; } - mysql_free_result($result); + $result->free(); } } ?> diff --git a/design.inc.php b/design.inc.php index 24c8901b..f7fe8bdc 100644 --- a/design.inc.php +++ b/design.inc.php @@ -16,6 +16,7 @@ H1 { font-size: 150%; margin: 0; } H2 { font-size: 150%; margin-top: 0; } FIELDSET { float: left; padding: .5em; margin: 0; } PRE { margin: 0; margin: .12em 0; } +TABLE { margin-bottom: 1em; } .error { color: Red; } .message { color: Green; } #menu { position: absolute; top: 8px; left: 8px; width: 15em; overflow: auto; white-space: nowrap; } @@ -38,7 +39,7 @@ PRE { margin: 0; margin: .12em 0; } } function page_footer($missing = false) { - global $SELF; + global $SELF, $mysql; ?> @@ -56,30 +57,30 @@ function page_footer($missing = false) {

query("SHOW TABLE STATUS"); + if (!$result->num_rows) { echo "

" . lang('No tables.') . "

\n"; } else { echo "

\n"; - while ($row = mysql_fetch_assoc($result)) { + while ($row = $result->fetch_assoc()) { echo '' . lang('select') . ' '; echo '' . htmlspecialchars($row["Name"]) . "
\n"; } echo "

\n"; } echo '

' . lang('Create new table') . "

\n"; - mysql_free_result($result); + $result->free(); } } ?> diff --git a/download.inc.php b/download.inc.php index 6d4748e0..3a6c7cbb 100644 --- a/download.inc.php +++ b/download.inc.php @@ -1,3 +1,3 @@ result($mysql->query("SELECT " . idf_escape($_GET["field"]) . " FROM " . idf_escape($_GET["download"]) . " WHERE " . implode(" AND ", where()) . " LIMIT 1"), 0); diff --git a/dump.inc.php b/dump.inc.php index 2ab61cb2..385c3b8b 100644 --- a/dump.inc.php +++ b/dump.inc.php @@ -2,65 +2,63 @@ header("Content-Type: text/plain; charset=utf-8"); function dump($db) { + global $mysql; static $routines; - static $version; if (!isset($routines)) { - $version = mysql_get_server_info(); $routines = array(); - if ($version >= 5) { + if ($mysql->server_info >= 5) { foreach (array("FUNCTION", "PROCEDURE") as $routine) { - $result = mysql_query("SHOW $routine STATUS"); - while ($row = mysql_fetch_assoc($result)) { + $result = $mysql->query("SHOW $routine STATUS"); + while ($row = $result->fetch_assoc()) { if (!strlen($_GET["db"]) || $row["Db"] === $_GET["db"]) { - $routines[$row["Db"]][] = mysql_result(mysql_query("SHOW CREATE $routine " . idf_escape($row["Db"]) . "." . idf_escape($row["Name"])), 0, 2) . ";;\n\n"; + $routines[$row["Db"]][] = $mysql->result($mysql->query("SHOW CREATE $routine " . idf_escape($row["Db"]) . "." . idf_escape($row["Name"])), 0, 2) . ";;\n\n"; } } - mysql_free_result($result); + $result->free(); } } } - $result = mysql_query("SHOW CREATE DATABASE " . idf_escape($db)); + $result = $mysql->query("SHOW CREATE DATABASE " . idf_escape($db)); if ($result) { - echo mysql_result($result, 0, 1) . ";\n"; - mysql_free_result($result); + echo $mysql->result($result, 0, 1) . ";\n"; + $result->free(); } echo "USE " . idf_escape($db) . ";\n"; echo "SET CHARACTER SET utf8;\n\n"; - $result = mysql_query("SHOW TABLE STATUS"); - while ($row = mysql_fetch_assoc($result)) { - $result1 = mysql_query("SHOW CREATE TABLE " . idf_escape($row["Name"])); + $result = $mysql->query("SHOW TABLE STATUS"); + while ($row = $result->fetch_assoc()) { + $result1 = $mysql->query("SHOW CREATE TABLE " . idf_escape($row["Name"])); if ($result1) { - echo mysql_result($result1, 0, 1) . ";\n"; - mysql_free_result($result1); + echo $mysql->result($result1, 0, 1) . ";\n"; + $result1->free(); if (isset($row["Engine"])) { - $result1 = mysql_query("SELECT * FROM " . idf_escape($row["Name"])); //! enum and set as numbers + $result1 = $mysql->query("SELECT * FROM " . idf_escape($row["Name"])); //! enum and set as numbers if ($result1) { - while ($row1 = mysql_fetch_row($result1)) { - echo "INSERT INTO " . idf_escape($row["Name"]) . " VALUES ('" . implode("', '", array_map('mysql_real_escape_string', $row1)) . "');\n"; + while ($row1 = $result1->fetch_row()) { + echo "INSERT INTO " . idf_escape($row["Name"]) . " VALUES ('" . implode("', '", array_map(array($mysql, 'real_escape_string'), $row1)) . "');\n"; } - mysql_free_result($result1); + $result1->free(); } } echo "\n"; } } - mysql_free_result($result); + $result->free(); - if ($version >= 5) { - $result = mysql_query("SHOW TRIGGERS"); - $triggers = mysql_num_rows($result); - if ($triggers || $routines[$db]) { + if ($mysql->server_info >= 5) { + $result = $mysql->query("SHOW TRIGGERS"); + if ($result->num_rows || $routines[$db]) { echo "DELIMITER ;;\n\n"; } - while ($row = mysql_fetch_assoc($result)) { + while ($row = $result->fetch_assoc()) { echo "CREATE TRIGGER " . idf_escape($row["Trigger"]) . " $row[Timing] $row[Event] ON " . idf_escape($row["Table"]) . " FOR EACH ROW $row[Statement];;\n\n"; } - mysql_free_result($result); echo implode("", (array) $routines[$db]); - if ($triggers || $routines[$db]) { + if ($result->num_rows || $routines[$db]) { echo "DELIMITER ;\n\n"; } + $result->free(); } echo "\n\n"; @@ -69,13 +67,13 @@ function dump($db) { if (strlen($_GET["db"])) { dump($_GET["db"]); } else { - $result = mysql_query("SHOW DATABASES"); - while ($row = mysql_fetch_assoc($result)) { - if ($row["Database"] != "information_schema" || mysql_get_server_info() < 5) { - if (mysql_select_db($row["Database"])) { + $result = $mysql->query("SHOW DATABASES"); + while ($row = $result->fetch_assoc()) { + if ($row["Database"] != "information_schema" || $mysql->server_info < 5) { + if ($mysql->select_db($row["Database"])) { dump($row["Database"]); } } } - mysql_free_result($result); + $result->free(); } diff --git a/edit.inc.php b/edit.inc.php index 621c0da2..72665cf4 100644 --- a/edit.inc.php +++ b/edit.inc.php @@ -30,10 +30,10 @@ if ($_POST && !$error) { $message = lang('Item has been inserted.'); } } - if (!$set || mysql_query($query)) { + if (!$set || $mysql->query($query)) { redirect($SELF . (isset($_GET["default"]) ? "table=" : ($_POST["insert"] ? "edit=" : "select=")) . urlencode($_GET["edit"]), ($set ? $message : null)); } - $error = mysql_error(); + $error = $mysql->error; } page_header((isset($_GET["default"]) ? lang('Default values') : ($_GET["where"] ? lang('Edit') : lang('Insert'))) . ": " . htmlspecialchars($_GET["edit"])); @@ -50,7 +50,12 @@ if ($_POST) { $select[] = ($field["type"] == "enum" || $field["type"] == "set" ? "1*" . idf_escape($name) . " AS " : "") . idf_escape($name); } } - $data = ($select ? mysql_fetch_assoc(mysql_query("SELECT " . implode(", ", $select) . " FROM " . idf_escape($_GET["edit"]) . " WHERE " . implode(" AND ", $where) . " LIMIT 1")) : array()); + if ($select) { + $result = $mysql->query("SELECT " . implode(", ", $select) . " FROM " . idf_escape($_GET["edit"]) . " WHERE " . implode(" AND ", $where) . " LIMIT 1"); + $data = $result->fetch_assoc(); + } else { + $data = array(); + } } else { unset($data); } diff --git a/functions.inc.php b/functions.inc.php index ac19d82d..8ae44956 100644 --- a/functions.inc.php +++ b/functions.inc.php @@ -30,10 +30,11 @@ function optionlist($options, $selected = array(), $not_vals = false) { } function fields($table) { + global $mysql; $return = array(); - $result = mysql_query("SHOW FULL COLUMNS FROM " . idf_escape($table)); + $result = $mysql->query("SHOW FULL COLUMNS FROM " . idf_escape($table)); if ($result) { - while ($row = mysql_fetch_assoc($result)) { + while ($row = $result->fetch_assoc()) { preg_match('~^([^(]+)(?:\\((.+)\\))?( unsigned)?( zerofill)?$~', $row["Type"], $match); $return[$row["Field"]] = array( "field" => $row["Field"], @@ -48,29 +49,31 @@ function fields($table) { "comment" => $row["Comment"], ); } - mysql_free_result($result); + $result->free(); } return $return; } function indexes($table) { + global $mysql; $return = array(); - $result = mysql_query("SHOW INDEX FROM " . idf_escape($table)); - while ($row = mysql_fetch_assoc($result)) { + $result = $mysql->query("SHOW INDEX FROM " . idf_escape($table)); + while ($row = $result->fetch_assoc()) { $return[$row["Key_name"]]["type"] = ($row["Key_name"] == "PRIMARY" ? "PRIMARY" : ($row["Index_type"] == "FULLTEXT" ? "FULLTEXT" : ($row["Non_unique"] ? "INDEX" : "UNIQUE"))); $return[$row["Key_name"]]["columns"][$row["Seq_in_index"]] = $row["Column_name"]; } - mysql_free_result($result); + $result->free(); return $return; } function foreign_keys($table) { + global $mysql; static $pattern = '~`((?:[^`]*|``)+)`~'; $return = array(); - $result = mysql_query("SHOW CREATE TABLE " . idf_escape($table)); + $result = $mysql->query("SHOW CREATE TABLE " . idf_escape($table)); if ($result) { - $create_table = mysql_result($result, 0, 1); - mysql_free_result($result); + $create_table = $mysql->result($result, 0, 1); + $result->free(); preg_match_all('~FOREIGN KEY \\((.+)\\) REFERENCES (?:`(.+)`\\.)?`(.+)` \\((.+)\\)~', $create_table, $matches, PREG_SET_ORDER); foreach ($matches as $match) { preg_match_all($pattern, $match[1], $source); @@ -102,9 +105,10 @@ function unique_idf($row, $indexes) { } function where() { + global $mysql; $return = array(); foreach ((array) $_GET["where"] as $key => $val) { - $return[] = idf_escape(bracket_escape($key, "back")) . " = BINARY '" . mysql_real_escape_string($val) . "'"; //! enum and set + $return[] = idf_escape(bracket_escape($key, "back")) . " = BINARY '" . $mysql->real_escape_string($val) . "'"; //! enum and set } foreach ((array) $_GET["null"] as $key) { $return[] = idf_escape(bracket_escape($key, "back")) . " IS NULL"; @@ -113,24 +117,26 @@ function where() { } function collations() { + global $mysql; $return = array(); - $result = mysql_query("SHOW COLLATION"); - while ($row = mysql_fetch_assoc($result)) { + $result = $mysql->query("SHOW COLLATION"); + while ($row = $result->fetch_assoc()) { $return[$row["Charset"]][] = $row["Collation"]; } - mysql_free_result($result); + $result->free(); return $return; } function engines() { + global $mysql; $return = array(); - $result = mysql_query("SHOW ENGINES"); - while ($row = mysql_fetch_assoc($result)) { + $result = $mysql->query("SHOW ENGINES"); + while ($row = $result->fetch_assoc()) { if ($row["Support"] == "YES" || $row["Support"] == "DEFAULT") { $return[] = $row["Engine"]; } } - mysql_free_result($result); + $result->free(); return $return; } @@ -180,11 +186,11 @@ function get_file($key) { } function select($result) { - if (!mysql_num_rows($result)) { + if (!$result->num_rows) { echo "

" . lang('No rows.') . "

\n"; } else { echo "\n"; - for ($i=0; $row = mysql_fetch_row($result); $i++) { + for ($i=0; $row = $result->fetch_row(); $i++) { if (!$i) { echo ""; $links = array(); @@ -192,25 +198,24 @@ function select($result) { $columns = array(); $blobs = array(); for ($j=0; $j < count($row); $j++) { - $field = mysql_fetch_field($result, $j); - //! table and column aliases - if (strlen($field->table) && $field->primary_key) { - $links[$j] = $field->table; - if (!isset($indexes[$field->table])) { - $indexes[$field->table] = array(); - foreach (indexes($field->table) as $index) { + $field = $result->fetch_field(); + if (strlen($field->orgtable) && $field->primary_key) { + $links[$j] = $field->orgtable; + if (!isset($indexes[$field->orgtable])) { + $indexes[$field->orgtable] = array(); + foreach (indexes($field->orgtable) as $index) { if ($index["type"] == "PRIMARY") { - $indexes[$field->table] = array_flip($index["columns"]); + $indexes[$field->orgtable] = array_flip($index["columns"]); break; } } - $columns[$field->table] = $indexes[$field->table]; + $columns[$field->orgtable] = $indexes[$field->orgtable]; } - unset($columns[$field->table][$field->name]); - $indexes[$field->table][$field->name] = $j; - $links[$j] = $field->table; + unset($columns[$field->orgtable][$field->orgname]); + $indexes[$field->orgtable][$field->orgname] = $j; + $links[$j] = $field->orgtable; } - if ($field->blob) { + if ($field->charsetnr == 63) { $blobs[$j] = true; } echo ""; @@ -237,7 +242,7 @@ function select($result) { } echo "
" . htmlspecialchars($field->name) . "
\n"; } - mysql_free_result($result); + $result->free(); } function input($name, $field, $value) { @@ -283,22 +288,23 @@ function input($name, $field, $value) { } function process_input($name, $field) { + global $mysql; $name = bracket_escape($name); $return = $_POST["fields"][$name]; if (preg_match('~char|text|set|binary|blob~', $field["type"]) ? $_POST["null"][$name] : !strlen($return)) { $return = "NULL"; } elseif ($field["type"] == "enum") { - $return = (isset($_GET["default"]) ? "'" . mysql_real_escape_string($return) . "'" : intval($return)); + $return = (isset($_GET["default"]) ? "'" . $mysql->real_escape_string($return) . "'" : intval($return)); } elseif ($field["type"] == "set") { - $return = (isset($_GET["default"]) ? "'" . implode(",", array_map('mysql_real_escape_string', (array) $return)) . "'" : array_sum((array) $return)); + $return = (isset($_GET["default"]) ? "'" . implode(",", array_map(array($mysql, 'real_escape_string'), (array) $return)) . "'" : array_sum((array) $return)); } elseif (preg_match('~binary|blob~', $field["type"])) { $file = get_file($name); if (!is_string($file) && !$field["null"]) { return false; //! report errors, also empty $_POST (too big POST data, not only FILES) } - $return = "_binary'" . (is_string($file) ? mysql_real_escape_string($file) : "") . "'"; + $return = "_binary'" . (is_string($file) ? $mysql->real_escape_string($file) : "") . "'"; } else { - $return = "'" . mysql_real_escape_string($return) . "'"; + $return = "'" . $mysql->real_escape_string($return) . "'"; } return $return; } diff --git a/index.php b/index.php index af6f606b..add9ea7c 100644 --- a/index.php +++ b/index.php @@ -8,6 +8,7 @@ $TOKENS = &$_SESSION["tokens"][$_GET["server"]][preg_replace('~([?&]sql=)upload~ include "./functions.inc.php"; include "./lang.inc.php"; include "./design.inc.php"; +include "./abstraction.inc.php"; include "./auth.inc.php"; include "./connect.inc.php"; @@ -49,12 +50,12 @@ if (isset($_GET["dump"])) { $TOKENS = array(); page_header(htmlspecialchars(lang('Database') . ": " . $_GET["db"])); echo '

' . lang('Alter database') . "

\n"; - if (mysql_get_server_info() >= 5) { - $result = mysql_query("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = '" . mysql_real_escape_string($_GET["db"]) . "'"); - if (mysql_num_rows($result)) { + if ($mysql->server_info >= 5) { + $result = $mysql->query("SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = '" . $mysql->real_escape_string($_GET["db"]) . "'"); + if ($result->num_rows) { echo "

" . lang('Routines') . "

\n"; echo "\n"; - while ($row = mysql_fetch_assoc($result)) { + while ($row = $result->fetch_assoc()) { echo ""; echo ""; echo ''; @@ -63,7 +64,7 @@ if (isset($_GET["dump"])) { } echo "
" . htmlspecialchars($row["ROUTINE_TYPE"]) . "' . htmlspecialchars($row["ROUTINE_NAME"]) . '
\n"; } - mysql_free_result($result); + $result->free(); } } } diff --git a/indexes.inc.php b/indexes.inc.php index 58b1144f..8d7ab651 100644 --- a/indexes.inc.php +++ b/indexes.inc.php @@ -27,10 +27,10 @@ if ($_POST && !$error && !$_POST["add"]) { foreach ($indexes as $name => $existing) { $alter[] = "DROP INDEX " . idf_escape($name); } - if (!$alter || mysql_query("ALTER TABLE " . idf_escape($_GET["indexes"]) . " " . implode(", ", $alter))) { + if (!$alter || $mysql->query("ALTER TABLE " . idf_escape($_GET["indexes"]) . " " . implode(", ", $alter))) { redirect($SELF . "table=" . urlencode($_GET["indexes"]), ($alter ? lang('Indexes has been altered.') : null)); } - $error = mysql_error(); + $error = $mysql->error; } page_header(lang('Indexes') . ': ' . htmlspecialchars($_GET["indexes"])); diff --git a/lang.inc.php b/lang.inc.php index 6e1d014a..8177528f 100644 --- a/lang.inc.php +++ b/lang.inc.php @@ -100,6 +100,8 @@ function lang($idf = null, $number = null) { 'Routine has been called, %d row(s) affected.' => array('Procedura byla zavolána, byl změněn %d záznam.', 'Procedura byla zavolána, byly změněny %d záznamy.', 'Procedura byla zavolána, bylo změněno %d záznamů.'), 'Call' => 'Zavolat', 'Error during calling' => 'Chyba při volání', + 'No MySQL extension' => 'Žádná MySQL extenze', + 'None of supported PHP extensions (%s) are available.' => 'Není dostupná žádná z podporovaných PHP extenzí (%s).', ), ); if (!isset($idf)) { diff --git a/select.inc.php b/select.inc.php index 1b0d7425..4570bbb3 100644 --- a/select.inc.php +++ b/select.inc.php @@ -15,7 +15,7 @@ if (isset($rights["insert"])) { } if (!$columns) { - echo "

" . lang('Unable to select the table') . ($fields ? "" : ": " . mysql_error()) . ".

\n"; + echo "

" . lang('Unable to select the table') . ($fields ? "" : ": " . $mysql->error) . ".

\n"; } else { $indexes = indexes($_GET["select"]); echo "
\n
" . lang('Search') . "\n"; @@ -30,7 +30,7 @@ if (!$columns) { foreach ($indexes as $i => $index) { if ($index["type"] == "FULLTEXT") { if (strlen($_GET["fulltext"][$i])) { - $where[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST ('" . mysql_real_escape_string($_GET["fulltext"][$i]) . "'" . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")"; + $where[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST ('" . $mysql->real_escape_string($_GET["fulltext"][$i]) . "'" . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")"; } echo "(" . implode(", ", $index["columns"]) . ") AGAINST"; echo ' '; @@ -42,7 +42,7 @@ if (!$columns) { $i = 0; foreach ((array) $_GET["where"] as $val) { if (strlen($val["col"]) && in_array($val["op"], $operators)) { - $where[] = idf_escape($val["col"]) . " $val[op]" . ($val["op"] != "IS NULL" ? " '" . mysql_real_escape_string($val["val"]) . "'" : ""); + $where[] = idf_escape($val["col"]) . " $val[op]" . ($val["op"] != "IS NULL" ? " '" . $mysql->real_escape_string($val["val"]) . "'" : ""); echo "
"; echo ""; echo "
\n"; @@ -90,11 +90,11 @@ for (var i=0; > i; i++) { echo "\n"; echo "
\n"; - $result = mysql_query("SELECT SQL_CALC_FOUND_ROWS " . implode(", ", array_map('idf_escape', $columns)) . " FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : "") . (strlen($limit) ? " LIMIT " . intval($limit) . " OFFSET " . ($limit * $_GET["page"]) : "")); - if (!mysql_num_rows($result)) { + $result = $mysql->query("SELECT SQL_CALC_FOUND_ROWS " . implode(", ", array_map('idf_escape', $columns)) . " FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : "") . (strlen($limit) ? " LIMIT " . intval($limit) . " OFFSET " . ($limit * $_GET["page"]) : "")); + if (!$result->num_rows) { echo "

" . lang('No rows.') . "

\n"; } else { - $found_rows = mysql_result(mysql_query(" SELECT FOUND_ROWS()"), 0); // space for mysql.trace_mode + $found_rows = $mysql->result($mysql->query(" SELECT FOUND_ROWS()"), 0); // space for mysql.trace_mode $foreign_keys = array(); foreach (foreign_keys($_GET["select"]) as $foreign_key) { foreach ($foreign_key[2] as $val) { @@ -102,20 +102,20 @@ for (var i=0; > i; i++) { } } $childs = array(); - if (mysql_get_server_info() >= 5) { + if ($mysql->server_info >= 5) { // would be possible in earlier versions too, but only by examining all tables (in all databases) - $result1 = mysql_query("SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '" . mysql_real_escape_string($_GET["db"]) . "' AND REFERENCED_TABLE_NAME = '" . mysql_real_escape_string($_GET["select"]) . "' ORDER BY ORDINAL_POSITION"); - while ($row1 = mysql_fetch_assoc($result1)) { + $result1 = $mysql->query("SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '" . $mysql->real_escape_string($_GET["db"]) . "' AND REFERENCED_TABLE_NAME = '" . $mysql->real_escape_string($_GET["select"]) . "' ORDER BY ORDINAL_POSITION"); + while ($row1 = $result1->fetch_assoc()) { $childs[$row1["CONSTRAINT_NAME"]][0] = $row1["TABLE_SCHEMA"]; $childs[$row1["CONSTRAINT_NAME"]][1] = $row1["TABLE_NAME"]; $childs[$row1["CONSTRAINT_NAME"]][2][] = $row1["REFERENCED_COLUMN_NAME"]; $childs[$row1["CONSTRAINT_NAME"]][3][] = $row1["COLUMN_NAME"]; } - mysql_free_result($result1); + $result1->free(); } echo "\n"; - for ($j=0; $row = mysql_fetch_assoc($result); $j++) { + for ($j=0; $row = $result->fetch_assoc(); $j++) { if (!$j) { echo "\n"; } @@ -161,5 +161,5 @@ for (var i=0; > i; i++) { echo "

\n"; } } - mysql_free_result($result); + $result->free(); } diff --git a/sql.inc.php b/sql.inc.php index 55ab1825..f39e3cf0 100644 --- a/sql.inc.php +++ b/sql.inc.php @@ -18,21 +18,20 @@ if ($_POST && $error) { } else { $empty = false; echo "
" . htmlspecialchars(substr($query, 0, $match[0][1])) . "
\n"; - $result = mysql_query(substr($query, 0, $match[0][1])); + if (!$mysql->multi_query(substr($query, 0, $match[0][1]))) { + echo "

" . lang('Error in query') . ": " . htmlspecialchars($mysql->error) . "

\n"; + } else{ + do { + $result = $mysql->store_result(); + if (is_object($result)) { + select($result); + } else { + echo "

" . lang('Query executed OK, %d row(s) affected.', $mysql->affected_rows) . "

\n"; + } + } while ($mysql->next_result()); + } $query = substr($query, $match[0][1] + strlen($match[0][0])); $offset = 0; - if (!$result) { - echo "

" . lang('Error in query') . ": " . htmlspecialchars(mysql_error()) . "

\n"; - } elseif ($result === true) { - /* more secure but less user-friendly - if (token_delete()) { - $token = token(); - } - */ - echo "

" . lang('Query executed OK, %d row(s) affected.', mysql_affected_rows()) . "

\n"; - } else { - select($result); - } } } } diff --git a/table.inc.php b/table.inc.php index 958231e9..d75c520d 100644 --- a/table.inc.php +++ b/table.inc.php @@ -1,20 +1,20 @@ query("SHOW COLUMNS FROM " . idf_escape($_GET["table"])); if (!$result) { - echo "

" . lang('Unable to show the table definition') . ": " . mysql_error() . ".

\n"; + echo "

" . lang('Unable to show the table definition') . ": " . $mysql->error . ".

\n"; } else { $auto_increment_only = true; echo "
" . implode("", array_map('htmlspecialchars', array_keys($row))) . "" . lang('Action') . "
\n"; - while ($row = mysql_fetch_assoc($result)) { + while ($row = $result->fetch_assoc()) { if (!$row["auto_increment"]) { $auto_increment_only = false; } echo "\n"; } echo "
" . htmlspecialchars($row["Field"]) . "$row[Type]" . ($row["Null"] == "YES" ? " NULL" : "") . "
\n"; - mysql_free_result($result); + $result->free(); echo "

"; echo '' . lang('Alter table') . ''; @@ -44,15 +44,15 @@ if (!$result) { } } -if (mysql_get_server_info() >= 5) { - $result = mysql_query("SHOW TRIGGERS LIKE '" . mysql_real_escape_string($_GET["table"]) . "'"); - if (mysql_num_rows($result)) { +if ($mysql->server_info >= 5) { + $result = $mysql->query("SHOW TRIGGERS LIKE '" . $mysql->real_escape_string($_GET["table"]) . "'"); + if ($result->num_rows) { echo "

" . lang('Triggers') . "

\n"; echo "\n"; - while ($row = mysql_fetch_assoc($result)) { + while ($row = $result->fetch_assoc()) { echo "\n"; } echo "
$row[Timing]$row[Event]
" . htmlspecialchars($row["Statement"]) . "
\n"; } - mysql_free_result($result); + $result->free(); } diff --git a/view.inc.php b/view.inc.php index 7721dc94..a4c5ce66 100644 --- a/view.inc.php +++ b/view.inc.php @@ -1,3 +1,3 @@ " . htmlspecialchars(preg_replace('~^.* AS ~U', '', mysql_result(mysql_query("SHOW CREATE VIEW " . idf_escape($_GET["view"])), 0, 1))) . "\n"; +echo "
" . htmlspecialchars(preg_replace('~^.* AS ~U', '', $mysql->result($mysql->query("SHOW CREATE VIEW " . idf_escape($_GET["view"])), 0, 1))) . "
\n";