Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Mass delete

git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@362 7c3ca157-0c34-0410-bff1-cbf682f78f5c
  • Loading branch information...
commit 116faf2e2ceaa62c18828974b0bedb1b3a9ecc2e 1 parent 0648706
jakubvrana authored
9 functions.inc.php
View
@@ -137,13 +137,16 @@ function unique_idf($row, $indexes) {
return $return;
}
-function where() {
+function where($where = null) {
global $mysql;
+ if (!isset($where)) {
+ $where = $_GET;
+ }
$return = array();
- foreach ((array) $_GET["where"] as $key => $val) {
+ foreach ((array) $where["where"] as $key => $val) {
$return[] = idf_escape(bracket_escape($key, "back")) . " = BINARY '" . $mysql->escape_string($val) . "'"; //! enum and set
}
- foreach ((array) $_GET["null"] as $key) {
+ foreach ((array) $where["null"] as $key) {
$return[] = idf_escape(bracket_escape($key, "back")) . " IS NULL";
}
return $return;
4 index.php
View
@@ -42,8 +42,6 @@
if (isset($_GET["table"])) {
include "./table.inc.php";
- } elseif (isset($_GET["select"])) {
- include "./select.inc.php";
} elseif (isset($_GET["view"])) {
include "./view.inc.php";
} elseif (isset($_GET["schema"])) {
@@ -89,6 +87,8 @@
include "./user.inc.php";
} elseif (isset($_GET["processlist"])) {
include "./processlist.inc.php";
+ } elseif (isset($_GET["select"])) {
+ include "./select.inc.php";
} else {
$TOKENS = array();
page_header(lang('Database') . ": " . htmlspecialchars($_GET["db"]), false);
5 lang/cs.inc.php
View
@@ -162,4 +162,9 @@
'Routine' => 'Procedura',
'Grant' => 'Povolit',
'Revoke' => 'Zakázat',
+ 'Error during deleting' => 'Chyba při mazání',
+ '%d item(s) have been deleted.' => array('Byl smazán %d záznam.', 'Byly smazány %d záznamy.', 'Bylo smazáno %d záznamů.'),
+ 'all' => 'vše',
+ 'Delete selected' => 'Smazat označené',
+ 'Truncate table' => 'Promazat tabulku',
);
1  lang/en.inc.php
View
@@ -5,4 +5,5 @@
'Routine has been called, %d row(s) affected.' => array('Routine has been called, %d row affected.', 'Routine has been called, %d rows affected.'),
'%d process(es) has been killed.' => array('%d process has been killed.', '%d processes have been killed.'),
'%d row(s)' => array('%d row', '%d rows'),
+ '%d item(s) have been deleted.' => array('%d item has been deleted.', '%d items have been deleted.'),
);
115 select.inc.php
View
@@ -1,5 +1,10 @@
<?php
-page_header(lang('Select') . ": " . htmlspecialchars($_GET["select"]));
+$table_status = table_status($_GET["select"]);
+$indexes = indexes($_GET["select"]);
+$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "REGEXP", "IN", "IS NULL");
+if ($table_status["Engine"] == "MyISAM") {
+ $operators[] = "AGAINST";
+}
$fields = fields($_GET["select"]);
$rights = array();
$columns = array();
@@ -14,6 +19,76 @@
$rights += $field["privileges"];
}
+$where = array();
+foreach ($indexes as $i => $index) {
+ if ($index["type"] == "FULLTEXT" && strlen($_GET["fulltext"][$i])) {
+ $where[] = "MATCH (" . implode(", ", array_map('idf_escape', $index["columns"])) . ") AGAINST ('" . $mysql->escape_string($_GET["fulltext"][$i]) . "'" . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")";
+ }
+}
+foreach ((array) $_GET["where"] as $val) {
+ if (strlen($val["col"]) && in_array($val["op"], $operators)) {
+ if ($val["op"] == "IN") {
+ $in = process_length($val["val"]);
+ $where[] = (strlen($in) ? idf_escape($val["col"]) . " IN ($in)" : "0");
+ } elseif ($val["op"] == "AGAINST") {
+ $where[] = "MATCH (" . idf_escape($val["col"]) . ") AGAINST ('" . $mysql->escape_string($val["val"]) . "' IN BOOLEAN MODE)";
+ } else {
+ $where[] = idf_escape($val["col"]) . " $val[op]" . ($val["op"] == "IS NULL" ? "" : " '" . $mysql->escape_string($val["val"]) . "'");
+ }
+ }
+}
+$order = array();
+foreach ((array) $_GET["order"] as $key => $val) {
+ if (in_array($val, $columns, true)) {
+ $order[] = idf_escape($val) . (isset($_GET["desc"][$key]) ? " DESC" : "");
+ }
+}
+$limit = (isset($_GET["limit"]) ? $_GET["limit"] : "30");
+$from = "FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : "") . (strlen($limit) ? " LIMIT " . intval($limit) . (intval($_GET["page"]) ? " OFFSET " . ($limit * $_GET["page"]) : "") : "");
+
+if ($_POST && !$error) {
+ $result = true;
+ $deleted = 0;
+ if (isset($_POST["truncate"])) {
+ $result = $mysql->query("TRUNCATE " . idf_escape($_GET["select"]));
+ $deleted = $mysql->affected_rows;
+ } elseif (is_array($_POST["delete"])) {
+ foreach ($_POST["delete"] as $val) {
+ parse_str($val, $delete);
+ $result = $mysql->query("DELETE FROM " . idf_escape($_GET["select"]) . " WHERE " . implode(" AND ", where($delete)) . " LIMIT 1");
+ if (!$result) {
+ break;
+ }
+ $deleted += $mysql->affected_rows;
+ }
+ } elseif ($_POST["delete_selected"]) {
+ if (!$_GET["page"]) {
+ $result = $mysql->query("DELETE $from");
+ $deleted = $mysql->affected_rows;
+ } else {
+ $result1 = $mysql->query("SELECT * $from");
+ while ($row1 = $result1->fetch_assoc()) {
+ parse_str(implode("&", unique_idf($row1, $indexes)), $delete);
+ $result = $mysql->query("DELETE FROM " . idf_escape($_GET["select"]) . " WHERE " . implode(" AND ", where($delete)) . " LIMIT 1");
+ if (!$result) {
+ break;
+ }
+ $deleted += $mysql->affected_rows;
+ }
+ $result1->free();
+ }
+ }
+ if ($result) {
+ redirect(remove_from_uri("page"), lang('%d item(s) have been deleted.', $deleted));
+ }
+ $error = $mysql->error;
+}
+
+page_header(lang('Select') . ": " . htmlspecialchars($_GET["select"]));
+if ($_POST) {
+ echo "<p class='error'>" . lang('Error during deleting') . ": " . htmlspecialchars($error) . "</p>\n";
+}
+
if (isset($rights["insert"])) {
//! pass search values forth and back
echo '<p><a href="' . htmlspecialchars($SELF) . 'edit=' . urlencode($_GET['select']) . '">' . lang('New item') . "</a></p>\n";
@@ -22,8 +97,6 @@
if (!$columns) {
echo "<p class='error'>" . lang('Unable to select the table') . ($fields ? "" : ": " . $mysql->error) . ".</p>\n";
} else {
- $table_status = table_status($_GET["select"]);
- $indexes = indexes($_GET["select"]);
echo "<form action='' id='form'>\n<fieldset><legend>" . lang('Search') . "</legend>\n";
if (strlen($_GET["server"])) {
echo '<input type="hidden" name="server" value="' . htmlspecialchars($_GET["server"]) . '" />';
@@ -32,36 +105,17 @@
echo '<input type="hidden" name="select" value="' . htmlspecialchars($_GET["select"]) . '" />';
echo "\n";
- $where = array();
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->escape_string($_GET["fulltext"][$i]) . "'" . (isset($_GET["boolean"][$i]) ? " IN BOOLEAN MODE" : "") . ")";
- }
echo "(<i>" . implode("</i>, <i>", array_map('htmlspecialchars', $index["columns"])) . "</i>) AGAINST";
echo ' <input name="fulltext[' . $i . ']" value="' . htmlspecialchars($_GET["fulltext"][$i]) . '" />';
echo "<label for='boolean-$i'><input type='checkbox' name='boolean[$i]' value='1' id='boolean-$i'" . (isset($_GET["boolean"][$i]) ? " checked='checked'" : "") . " />" . lang('BOOL') . "</label>";
echo "<br />\n";
}
}
- $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "REGEXP", "IN", "IS NULL");
- if ($table_status["Engine"] == "MyISAM") {
- $operators[] = "AGAINST";
- }
$i = 0;
foreach ((array) $_GET["where"] as $val) {
if (strlen($val["col"]) && in_array($val["op"], $operators)) {
- if ($val["op"] == "IN") {
- $in = process_length($val["val"]);
- if (!strlen($in)) {
- $in = "NULL";
- }
- }
- if ($val["op"] == "AGAINST") {
- $where[] = "MATCH (" . idf_escape($val["col"]) . ") $val[op] ('" . $mysql->escape_string($val["val"]) . "' IN BOOLEAN MODE)";
- } else {
- $where[] = idf_escape($val["col"]) . " $val[op]" . ($val["op"] == "IS NULL" ? "" : ($val["op"] == "IN" ? " ($in)" : " '" . $mysql->escape_string($val["val"]) . "'"));
- }
echo "<div><select name='where[$i][col]'><option></option>" . optionlist($columns, $val["col"]) . "</select>";
echo "<select name='where[$i][op]' onchange=\"where_change(this);\">" . optionlist($operators, $val["op"]) . "</select>";
echo "<input name='where[$i][val]' value=\"" . htmlspecialchars($val["val"]) . "\" /></div>\n";
@@ -100,11 +154,9 @@ function add_row(field) {
echo "</fieldset>\n";
echo "<fieldset><legend>" . lang('Sort') . "</legend>\n";
- $order = array();
$i = 0;
foreach ((array) $_GET["order"] as $key => $val) {
if (in_array($val, $columns, true)) {
- $order[] = idf_escape($val) . (isset($_GET["desc"][$key]) ? " DESC" : "");
echo "<div><select name='order[$i]'><option></option>" . optionlist($columns, $val) . "</select>";
echo "<label><input type='checkbox' name='desc[$i]' value='1'" . (isset($_GET["desc"][$key]) ? " checked='checked'" : "") . " />" . lang('DESC') . "</label></div>\n";
$i++;
@@ -115,7 +167,6 @@ function add_row(field) {
echo "</fieldset>\n";
echo "<fieldset><legend>" . lang('Limit') . "</legend>\n";
- $limit = (isset($_GET["limit"]) ? $_GET["limit"] : "30");
echo '<div><input name="limit" size="3" value="' . htmlspecialchars($limit) . '" /></div>';
echo "</fieldset>\n";
@@ -129,7 +180,7 @@ function add_row(field) {
echo "</form>\n";
echo "<div style='clear: left;'>&nbsp;</div>\n";
- $result = $mysql->query("SELECT SQL_CALC_FOUND_ROWS * FROM " . idf_escape($_GET["select"]) . ($where ? " WHERE " . implode(" AND ", $where) : "") . ($order ? " ORDER BY " . implode(", ", $order) : "") . (strlen($limit) ? " LIMIT " . intval($limit) . " OFFSET " . ($limit * $_GET["page"]) : ""));
+ $result = $mysql->query("SELECT SQL_CALC_FOUND_ROWS * $from");
if (!$result) {
echo "<p class='error'>" . lang('Error in query') . ": " . htmlspecialchars($mysql->error) . "</p>\n";
} else {
@@ -144,19 +195,19 @@ function add_row(field) {
}
}
+ echo "<form action='' method='post'>\n";
echo "<table border='1' cellspacing='0' cellpadding='2'>\n";
for ($j=0; $row = $result->fetch_assoc(); $j++) {
if (!$j) {
- echo "<thead><tr><th>&nbsp;</th><th>" . implode("</th><th>", array_map('htmlspecialchars', array_keys($row))) . "</th></tr></thead>\n";
+ echo '<thead><tr><td><label><input type="checkbox" name="delete_selected" value="1" onclick="var elems = this.form.elements; for (var i=0; i < elems.length; i++) if (elems[i].name == \'delete[]\') elems[i].checked = this.checked;" />' . lang('all') . '</label></td><th>' . implode("</th><th>", array_map('htmlspecialchars', array_keys($row))) . "</th></tr></thead>\n";
}
- $unique_idf = '&amp;' . implode('&amp;', unique_idf($row, $indexes));
- echo '<tr><td><a href="' . htmlspecialchars($SELF) . 'edit=' . urlencode($_GET['select']) . $unique_idf . '">' . lang('edit') . "</a></td>";
- //! multiple delete by checkboxes
+ $unique_idf = implode('&amp;', unique_idf($row, $indexes));
+ echo '<tr><td><input type="checkbox" name="delete[]" value="' . $unique_idf . '" /> <a href="' . htmlspecialchars($SELF) . 'edit=' . urlencode($_GET['select']) . '&amp;' . $unique_idf . '">' . lang('edit') . "</a></td>";
foreach ($row as $key => $val) {
if (!isset($val)) {
$val = "<i>NULL</i>";
} elseif (preg_match('~blob|binary~', $fields[$key]["type"]) && preg_match('~[\\x80-\\xFF]~', $val)) {
- $val = '<a href="' . htmlspecialchars($SELF) . 'download=' . urlencode($_GET["select"]) . '&amp;field=' . urlencode($key) . $unique_idf . '">' . lang('%d byte(s)', strlen($val)) . '</a>';
+ $val = '<a href="' . htmlspecialchars($SELF) . 'download=' . urlencode($_GET["select"]) . '&amp;field=' . urlencode($key) . '&amp;' . $unique_idf . '">' . lang('%d byte(s)', strlen($val)) . '</a>';
} else {
if (!strlen(trim($val))) {
$val = "&nbsp;";
@@ -184,6 +235,8 @@ function add_row(field) {
echo "</tr>\n";
}
echo "</table>\n";
+ echo "<p><input type='hidden' name='token' value='$token' /><input type='submit' value='" . lang('Delete selected') . "' /> <input type='submit' name='truncate' value='" . lang('Truncate table') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\" /></p>\n";
+ echo "</form>\n";
if (intval($limit) && $found_rows > $limit) {
$max_page = floor(($found_rows - 1) / $limit);
function print_page($page) {
Please sign in to comment.
Something went wrong with that request. Please try again.