1
0
mirror of https://github.com/vrana/adminer.git synced 2025-08-07 23:27:17 +02:00

Treat tinyint(1) as boolean

Use $SELF and ENT_QUOTES for compiled images

git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@922 7c3ca157-0c34-0410-bff1-cbf682f78f5c
This commit is contained in:
jakubvrana
2009-07-28 10:09:05 +00:00
parent 201142850e
commit e1abcda063
7 changed files with 27 additions and 18 deletions

View File

@@ -382,10 +382,12 @@ class Adminer {
/** Get options to display edit field /** Get options to display edit field
* @param string table name * @param string table name
* @param array single field from fields() * @param array single field from fields()
* @return array options for <select> or empty to display <input> * @param string attributes to use inside the tag
* @param string
* @return string custom input field or empty string for default
*/ */
function editInput($table, $field) { function editInput($table, $field, $attrs, $value) {
return false; return '';
} }
/** Process sent input /** Process sent input

View File

@@ -56,7 +56,7 @@ function type_class($type) {
} }
function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) { function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) {
global $inout; global $inout, $SELF; // $SELF is used by compiled images
$column_comments = false; $column_comments = false;
foreach ($fields as $field) { foreach ($fields as $field) {
if (strlen($field["comment"])) { if (strlen($field["comment"])) {

View File

@@ -305,9 +305,9 @@ function input($field, $value, $function) {
$first = array_search("", $functions); $first = array_search("", $functions);
$onchange = ($first ? ' onchange="var f = this.form[\'function[' . addcslashes($name, "\r\n'\\") . ']\']; if (' . $first . ' > f.selectedIndex) f.selectedIndex = ' . $first . ';"' : ''); $onchange = ($first ? ' onchange="var f = this.form[\'function[' . addcslashes($name, "\r\n'\\") . ']\']; if (' . $first . ' > f.selectedIndex) f.selectedIndex = ' . $first . ';"' : '');
echo (count($functions) > 1 ? '<select name="function[' . $name . ']">' . optionlist($functions, $function) . '</select>' : "&nbsp;") . '<td>'; echo (count($functions) > 1 ? '<select name="function[' . $name . ']">' . optionlist($functions, $function) . '</select>' : "&nbsp;") . '<td>';
$options = $adminer->editInput($_GET["edit"], $field); // usage in call is without a table $input = $adminer->editInput($_GET["edit"], $field, ' name="fields[' . $name . ']"' . $onchange, $value); // usage in call is without a table
if (is_array($options)) { if (strlen($input)) {
echo '<select name="fields[' . $name . ']"' . $onchange . '>' . optionlist(($options ? $options : array("" => "")), $value, true) . '</select>'; echo $input;
} elseif ($field["type"] == "set") { //! 64 bits } elseif ($field["type"] == "set") { //! 64 bits
preg_match_all("~'((?:[^']+|'')*)'~", $field["length"], $matches); preg_match_all("~'((?:[^']+|'')*)'~", $field["length"], $matches);
foreach ($matches[1] as $i => $val) { foreach ($matches[1] as $i => $val) {

View File

@@ -14,6 +14,7 @@ Remove Delete button from Edit page - use mass operation for it
Faster multiple update, clone and delete Faster multiple update, clone and delete
Faster table list in navigation Faster table list in navigation
Use HTML Strict instead of XHTML Use HTML Strict instead of XHTML
Remove function minification for performance and customization
Fix grant ALL PRIVILEGES with GRANT OPTION Fix grant ALL PRIVILEGES with GRANT OPTION
Fix CSV import Fix CSV import
Fix work with default values (thanks to Jiri Pospisil) Fix work with default values (thanks to Jiri Pospisil)

View File

@@ -177,8 +177,8 @@ if ($_COOKIE["adminer_lang"]) {
} }
$file = str_replace('<script type="text/javascript" src="editing.js"></script>' . "\n", "", $file); $file = str_replace('<script type="text/javascript" src="editing.js"></script>' . "\n", "", $file);
$file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files $file = preg_replace_callback("~compile_file\\('([^']+)', '([^']+)'\\);~", 'compile_file', $file); // integrate static files
$replace = 'htmlspecialchars(preg_replace("~\\\\\\\\?.*~", "", $_SERVER["REQUEST_URI"])) . "?file=\\1&amp;version=' . $VERSION; $replace = 'htmlspecialchars(preg_replace("~\\\\\\\\?.*~", "", $SELF), ENT_QUOTES) . "?file=\\1&amp;version=' . $VERSION;
$file = preg_replace('~(?:\\.\\./adminer/|\\./)(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file); $file = preg_replace('~\\.\\./adminer/(default\\.css|functions\\.js|favicon\\.ico)~', '<?php echo ' . $replace . '"; ?>', $file);
$file = preg_replace('~\\.\\./adminer/((plus|cross|up|down|arrow)\\.gif)~', '" . ' . $replace, $file); $file = preg_replace('~\\.\\./adminer/((plus|cross|up|down|arrow)\\.gif)~', '" . ' . $replace, $file);
$file = str_replace("../externals/jush/", "http://jush.sourceforge.net/", $file); $file = str_replace("../externals/jush/", "http://jush.sourceforge.net/", $file);
$file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file); $file = preg_replace("~<\\?php\\s*\\?>\n?|\\?>\n?<\\?php~", '', $file);

View File

@@ -108,6 +108,7 @@ ORDER BY ORDINAL_POSITION"); //! requires MySQL 5
} }
function selectVal($val, $link, $field) { function selectVal($val, $link, $field) {
global $SELF; // used by compiled images
$return = ($val == "<i>NULL</i>" ? "&nbsp;" : $val); $return = ($val == "<i>NULL</i>" ? "&nbsp;" : $val);
if (ereg('blob|binary', $field["type"]) && !is_utf8($val)) { if (ereg('blob|binary', $field["type"]) && !is_utf8($val)) {
$return = lang('%d byte(s)', strlen($val)); $return = lang('%d byte(s)', strlen($val));
@@ -115,6 +116,9 @@ ORDER BY ORDINAL_POSITION"); //! requires MySQL 5
$return = "<img src=\"$link\" alt='$return'>"; $return = "<img src=\"$link\" alt='$return'>";
} }
} }
if ($field["full_type"] == "tinyint(1)" && $return != "&nbsp;") { // bool
$return = '<img src="' . ($val ? "../adminer/plus.gif" : "../adminer/cross.gif") . '" alt="' . htmlspecialchars($val) . '">';
}
return ($link ? "<a href=\"$link\">$return</a>" : $return); return ($link ? "<a href=\"$link\">$return</a>" : $return);
} }
@@ -268,34 +272,37 @@ ORDER BY ORDINAL_POSITION"); //! requires MySQL 5
return (isset($_GET["select"]) ? array("orig" => lang('original')) : array()) + array(""); return (isset($_GET["select"]) ? array("orig" => lang('original')) : array()) + array("");
} }
function editInput($table, $field) { function editInput($table, $field, $attrs, $value) {
global $dbh; global $dbh;
$return = null;
$foreign_keys = column_foreign_keys($table); $foreign_keys = column_foreign_keys($table);
foreach ((array) $foreign_keys[$field["field"]] as $foreign_key) { foreach ((array) $foreign_keys[$field["field"]] as $foreign_key) {
if (count($foreign_key["source"]) == 1) { if (count($foreign_key["source"]) == 1) {
$id = idf_escape($foreign_key["target"][0]); $id = idf_escape($foreign_key["target"][0]);
$name = $this->rowDescription($foreign_key["table"]); $name = $this->rowDescription($foreign_key["table"]);
if (strlen($name) && $dbh->result($dbh->query("SELECT COUNT(*) FROM " . idf_escape($foreign_key["table"]))) <= 1000) { // optionlist with more than 1000 options would be too big if (strlen($name) && $dbh->result($dbh->query("SELECT COUNT(*) FROM " . idf_escape($foreign_key["table"]))) <= 1000) { // optionlist with more than 1000 options would be too big
if ($field["null"]) { $return = array();
$result = $dbh->query("SELECT $id, $name FROM " . idf_escape($foreign_key["table"]) . " ORDER BY 2");
if ($field["null"] || !$result->num_rows) { // empty <select> is not HTML-valid
$return[""] = ""; $return[""] = "";
} }
$result = $dbh->query("SELECT $id, $name FROM " . idf_escape($foreign_key["table"]) . " ORDER BY 2");
while ($row = $result->fetch_row()) { while ($row = $result->fetch_row()) {
$return[$row[0]] = $row[1]; $return[$row[0]] = $row[1];
} }
$result->free(); $result->free();
break; return "<select$attrs>" . optionlist($return, $value, true) . "</select>";
} }
} }
} }
return $return; if ($field["full_type"] == "tinyint(1)") { // bool
return '<input type="checkbox" value="' . htmlspecialchars($value ? $value : 1) . '"' . ($value ? ' checked="checked"' : '') . "$attrs>";
}
return '';
} }
function processInput($field, $value, $function = "") { function processInput($field, $value, $function = "") {
global $dbh; global $dbh;
$return = $dbh->quote(ereg('date|timestamp', $field["type"]) ? preg_replace_callback('(' . preg_replace('~(\\\\\\$([0-9]))~', '(?P<p\\2>[0-9]+)', preg_quote(lang('$1-$3-$5'))) . ')', 'conversion_date', $value) : $value); $return = $dbh->quote(ereg('date|timestamp', $field["type"]) ? preg_replace_callback('(' . preg_replace('~(\\\\\\$([0-9]))~', '(?P<p\\2>[0-9]+)', preg_quote(lang('$1-$3-$5'))) . ')', 'conversion_date', $value) : $value);
if (!ereg('varchar|text', $field["type"]) && !strlen($value)) { if (!ereg('varchar|text', $field["type"]) && $field["full_type"] != "tinyint(1)" && !strlen($value)) {
$return = "NULL"; $return = "NULL";
} elseif (ereg('date|time', $field["type"]) && $value == "CURRENT_TIMESTAMP") { } elseif (ereg('date|time', $field["type"]) && $value == "CURRENT_TIMESTAMP") {
$return = $value; $return = $value;

View File

@@ -22,7 +22,6 @@ Download external files (version checker and JUSH) from trusted HTTPS if Adminer
? AJAX editing - select page has all data to display edit form ? AJAX editing - select page has all data to display edit form
Editor: Editor:
JavaScript data validation JavaScript data validation - columns containing word email, url, md5, sha1, ...
Joining tables - PRIMARY KEY (table, joining) Joining tables - PRIMARY KEY (table, joining)
Rank, Tree structure Rank, Tree structure
Treat tinyint(1) as bool