Use same code for generating INSERT and UPDATE queries (also fixes bug #953250).
This commit is contained in:
@@ -7,6 +7,8 @@ $Source$
|
|||||||
|
|
||||||
2004-05-13 Michal Čihař <michal@cihar.com>
|
2004-05-13 Michal Čihař <michal@cihar.com>
|
||||||
* libraries/export/sql.php: Minor optimalisations.
|
* libraries/export/sql.php: Minor optimalisations.
|
||||||
|
* sql.php, tbl_replace.php, libraries/display_tbl.lib.php: Use same code
|
||||||
|
for generating INSERT and UPDATE queries (also fixes bug #953250).
|
||||||
|
|
||||||
2004-05-12 Marc Delisle <lem9@users.sourceforge.net>
|
2004-05-12 Marc Delisle <lem9@users.sourceforge.net>
|
||||||
* db_details_structure.php: bug #951143, undefined $header_url_qry
|
* db_details_structure.php: bug #951143, undefined $header_url_qry
|
||||||
|
@@ -1867,7 +1867,7 @@ function PMA_displayTable(&$dt_result, &$the_disp_mode, $analyzed_sql)
|
|||||||
echo ' <input type="submit" name="submit_mult" value="' . htmlspecialchars($GLOBALS['strExport']) . '" title="' . $GLOBALS['strExport'] . '" />' . "\n";
|
echo ' <input type="submit" name="submit_mult" value="' . htmlspecialchars($GLOBALS['strExport']) . '" title="' . $GLOBALS['strExport'] . '" />' . "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
echo '<input type="hidden" name="sql_query" value="' . $encoded_sql_query . '" />' . "\n";
|
echo '<input type="hidden" name="sql_query" value="' . htmlspecialchars($sql_query) . '" />' . "\n";
|
||||||
echo '<input type="hidden" name="pos" value="' . $pos . '" />' . "\n";
|
echo '<input type="hidden" name="pos" value="' . $pos . '" />' . "\n";
|
||||||
echo '<input type="hidden" name="url_query" value="' . $GLOBALS['url_query'] . '" />' . "\n";
|
echo '<input type="hidden" name="url_query" value="' . $GLOBALS['url_query'] . '" />' . "\n";
|
||||||
echo '<br />' . "\n";
|
echo '<br />' . "\n";
|
||||||
|
2
sql.php
2
sql.php
@@ -651,6 +651,8 @@ else {
|
|||||||
$GLOBALS['sql_limit_to_append'] = $tmp_sql_limit_to_append;
|
$GLOBALS['sql_limit_to_append'] = $tmp_sql_limit_to_append;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$goto = 'sql.php';
|
||||||
|
|
||||||
// Displays the results in a table
|
// Displays the results in a table
|
||||||
require_once('./libraries/display_tbl.lib.php');
|
require_once('./libraries/display_tbl.lib.php');
|
||||||
if (empty($disp_mode)) {
|
if (empty($disp_mode)) {
|
||||||
|
195
tbl_replace.php
195
tbl_replace.php
@@ -85,132 +85,111 @@ if (isset($funcs)) {
|
|||||||
$seen_binary = FALSE;
|
$seen_binary = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepares the update of a row
|
* Prepares the update/insert of a row
|
||||||
*/
|
*/
|
||||||
if (isset($primary_key) && ($submit_type != $strInsertAsNewRow)) {
|
if (isset($primary_key)) {
|
||||||
|
// we were editing something => use primary key
|
||||||
$loop_array = (is_array($primary_key) ? $primary_key : array(0 => $primary_key));
|
$loop_array = (is_array($primary_key) ? $primary_key : array(0 => $primary_key));
|
||||||
PMA_DBI_select_db($db);
|
$using_key = TRUE;
|
||||||
$query = array();
|
$is_insert = ($submit_type == $strInsertAsNewRow);
|
||||||
$message = '';
|
} else {
|
||||||
|
// new row => use indexes
|
||||||
|
$loop_array = array();
|
||||||
|
for ($i = 0; $i < $cfg['InsertRows']; $i++) $loop_array[$i] = $i;
|
||||||
|
$using_key = FALSE;
|
||||||
|
$is_insert = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
foreach($loop_array AS $primary_key_index => $enc_primary_key) {
|
PMA_DBI_select_db($db);
|
||||||
// Restore the "primary key" to a convenient format
|
$query = array();
|
||||||
$primary_key = urldecode($enc_primary_key);
|
$message = '';
|
||||||
|
|
||||||
// Defines the SET part of the sql query
|
foreach($loop_array AS $primary_key_index => $enc_primary_key) {
|
||||||
$valuelist = '';
|
// skip fields to be ignored
|
||||||
|
if (!$using_key && isset($GLOBALS['insert_ignore_' . $enc_primary_key])) continue;
|
||||||
|
|
||||||
|
// Restore the "primary key" to a convenient format
|
||||||
|
$primary_key = urldecode($enc_primary_key);
|
||||||
|
|
||||||
// Map multi-edit keys to single-level arrays, dependent on how we got the fields
|
// Defines the SET part of the sql query
|
||||||
$me_fields = (isset($fields['multi_edit']) && isset($fields['multi_edit'][$enc_primary_key]) ? $fields['multi_edit'][$enc_primary_key] : (isset($fields) ? $fields : null));
|
$valuelist = '';
|
||||||
$me_fields_prev = (isset($fields_prev['multi_edit']) && isset($fields_prev['multi_edit'][$enc_primary_key]) ? $fields_prev['multi_edit'][$enc_primary_key] : (isset($fields_prev) ? $fields_prev : null));
|
$fieldlist = '';
|
||||||
$me_funcs = (isset($funcs['multi_edit']) && isset($funcs['multi_edit'][$enc_primary_key]) ? $funcs['multi_edit'][$enc_primary_key] : (isset($funcs) ? $funcs : null));
|
|
||||||
$me_fields_type = (isset($fields_type['multi_edit']) && isset($fields_type['multi_edit'][$enc_primary_key]) ? $fields_type['multi_edit'][$enc_primary_key] : (isset($fields_type) ? $fields_type : null));
|
|
||||||
$me_fields_null = (isset($fields_null['multi_edit']) && isset($fields_null['multi_edit'][$enc_primary_key]) ? $fields_null['multi_edit'][$enc_primary_key] : (isset($fields_null) ? $fields_null : null));
|
|
||||||
|
|
||||||
foreach($me_fields AS $key => $val) {
|
// Map multi-edit keys to single-level arrays, dependent on how we got the fields
|
||||||
$encoded_key = $key;
|
$me_fields = isset($fields['multi_edit']) && isset($fields['multi_edit'][$enc_primary_key]) ? $fields['multi_edit'][$enc_primary_key] : null;
|
||||||
$key = urldecode($key);
|
$me_fields_prev = isset($fields_prev['multi_edit']) && isset($fields_prev['multi_edit'][$enc_primary_key]) ? $fields_prev['multi_edit'][$enc_primary_key] : null;
|
||||||
|
$me_funcs = isset($funcs['multi_edit']) && isset($funcs['multi_edit'][$enc_primary_key]) ? $funcs['multi_edit'][$enc_primary_key] : null;
|
||||||
|
$me_fields_type = isset($fields_type['multi_edit']) && isset($fields_type['multi_edit'][$enc_primary_key]) ? $fields_type['multi_edit'][$enc_primary_key] : null;
|
||||||
|
$me_fields_null = isset($fields_null['multi_edit']) && isset($fields_null['multi_edit'][$enc_primary_key]) ? $fields_null['multi_edit'][$enc_primary_key] : null;
|
||||||
|
|
||||||
require('./tbl_replace_fields.php');
|
foreach($me_fields AS $encoded_key => $val) {
|
||||||
|
$key = urldecode($encoded_key);
|
||||||
|
$fieldlist .= PMA_backquote($key) . ', ';
|
||||||
|
|
||||||
// No change for this column and no MySQL function is used -> next column
|
require('./tbl_replace_fields.php');
|
||||||
if (empty($me_funcs[$encoded_key])
|
|
||||||
&& isset($me_fields_prev) && isset($me_fields_prev[$encoded_key])
|
|
||||||
&& ("'" . PMA_sqlAddslashes(urldecode($me_fields_prev[$encoded_key])) . "'" == $val)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (!empty($val)) {
|
|
||||||
if (empty($me_funcs[$encoded_key])) {
|
|
||||||
$valuelist .= PMA_backquote($key) . ' = ' . $val . ', ';
|
|
||||||
} else if ($val == '\'\''
|
|
||||||
&& (preg_match('@^(NOW|CURDATE|CURTIME|UNIX_TIMESTAMP|RAND|USER|LAST_INSERT_ID)$@', $me_funcs[$encoded_key]))) {
|
|
||||||
$valuelist .= PMA_backquote($key) . ' = ' . $me_funcs[$encoded_key] . '(), ';
|
|
||||||
} else {
|
|
||||||
$valuelist .= PMA_backquote($key) . ' = ' . $me_funcs[$encoded_key] . "($val), ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // end while
|
|
||||||
|
|
||||||
// Builds the sql update query
|
if (empty($me_funcs[$encoded_key])) {
|
||||||
$valuelist = preg_replace('@, $@', '', $valuelist);
|
$cur_value = $val . ', ';
|
||||||
if (!empty($valuelist)) {
|
} else if ($val == '\'\''
|
||||||
$query[] = 'UPDATE ' . PMA_backquote($table) . ' SET ' . $valuelist . ' WHERE' . $primary_key
|
&& (preg_match('@^(NOW|CURDATE|CURTIME|UNIX_TIMESTAMP|RAND|USER|LAST_INSERT_ID)$@', $me_funcs[$encoded_key]))) {
|
||||||
. ' LIMIT 1';
|
$cur_value = $me_funcs[$encoded_key] . '(), ';
|
||||||
|
|
||||||
// lem9: why a line break here?
|
|
||||||
//$message = $strAffectedRows . ' <br />';
|
|
||||||
$message = $strAffectedRows . ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($valuelist) && empty($query)) {
|
|
||||||
// No change -> move back to the calling script
|
|
||||||
$message = $strNoModification;
|
|
||||||
if ($is_gotofile) {
|
|
||||||
$js_to_run = 'functions.js';
|
|
||||||
require_once('./header.inc.php');
|
|
||||||
require('./' . preg_replace('@\.\.*@', '.', $goto));
|
|
||||||
} else {
|
} else {
|
||||||
PMA_sendHeaderLocation($cfg['PmaAbsoluteUri'] . $goto . '&disp_message=' . urlencode($message) . '&disp_query=');
|
$cur_value = $me_funcs[$encoded_key] . '(' . $val . '), ';
|
||||||
|
|
||||||
}
|
}
|
||||||
exit();
|
|
||||||
}
|
if ($is_insert) {
|
||||||
} // end row update
|
// insert, no need to add column
|
||||||
|
$valuelist .= $cur_value;
|
||||||
|
} else if (empty($me_funcs[$encoded_key])
|
||||||
|
&& isset($me_fields_prev) && isset($me_fields_prev[$encoded_key])
|
||||||
|
&& ("'" . PMA_sqlAddslashes(urldecode($me_fields_prev[$encoded_key])) . "'" == $val)) {
|
||||||
|
// No change for this column and no MySQL function is used -> next column
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (!empty($val)) {
|
||||||
|
$valuelist .= PMA_backquote($key) . ' = ' . $cur_value;
|
||||||
|
}
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
// get rid of last ,
|
||||||
/**
|
$valuelist = preg_replace('@, $@', '', $valuelist);
|
||||||
* Prepares the insert of a row
|
|
||||||
*/
|
// Builds the sql query
|
||||||
else {
|
if ($is_insert) {
|
||||||
$loop_array = (isset($primary_key) && is_array($primary_key) ? $primary_key : array(0 => (isset($primary_key) ? $primary_key : null)));
|
if (empty($query)) {
|
||||||
$message = '';
|
// first inserted row -> prepare template
|
||||||
PMA_DBI_select_db($db);
|
|
||||||
|
|
||||||
for ($i = 0; $i < $cfg['InsertRows']; $i++) {
|
|
||||||
if (!isset($fields['multi_edit'][$i])) break;
|
|
||||||
if (isset($GLOBALS['insert_ignore_' . $i])) continue;
|
|
||||||
|
|
||||||
$enc_primary_key = $i;
|
|
||||||
$fieldlist = '';
|
|
||||||
$valuelist = '';
|
|
||||||
|
|
||||||
$me_fields = (isset($fields['multi_edit']) && isset($fields['multi_edit'][$i]) ? $fields['multi_edit'][$i] : (isset($fields) ? $fields : null));
|
|
||||||
$me_fields_prev = (isset($fields_prev['multi_edit']) && isset($fields_prev['multi_edit'][$i]) ? $fields_prev['multi_edit'][$i] : (isset($fields_prev) ? $fields_prev : null));
|
|
||||||
$me_funcs = (isset($funcs['multi_edit']) && isset($funcs['multi_edit'][$i]) ? $funcs['multi_edit'][$i] : (isset($funcs) ? $funcs : null));
|
|
||||||
$me_fields_type = (isset($fields_type['multi_edit']) && isset($fields_type['multi_edit'][$i]) ? $fields_type['multi_edit'][$i] : (isset($fields_type) ? $fields_type : null));
|
|
||||||
$me_fields_null = (isset($fields_null['multi_edit']) && isset($fields_null['multi_edit'][$i]) ? $fields_null['multi_edit'][$i] : (isset($fields_null) ? $fields_null : null));
|
|
||||||
|
|
||||||
foreach($me_fields AS $key => $val) {
|
|
||||||
$encoded_key = $key;
|
|
||||||
$key = urldecode($key);
|
|
||||||
$fieldlist .= PMA_backquote($key) . ', ';
|
|
||||||
|
|
||||||
require('./tbl_replace_fields.php');
|
|
||||||
|
|
||||||
if (empty($me_funcs[$encoded_key])) {
|
|
||||||
$valuelist .= $val . ', ';
|
|
||||||
} else if (($val == '\'\''
|
|
||||||
&& preg_match('@^(UNIX_TIMESTAMP|RAND|LAST_INSERT_ID)$@', $me_funcs[$encoded_key]))
|
|
||||||
|| preg_match('@^(NOW|CURDATE|CURTIME|USER)$@', $me_funcs[$encoded_key])) {
|
|
||||||
$valuelist .= $me_funcs[$encoded_key] . '(), ';
|
|
||||||
} else {
|
|
||||||
$valuelist .= $me_funcs[$encoded_key] . '(' . $val . '), ';
|
|
||||||
}
|
|
||||||
} // end while
|
|
||||||
|
|
||||||
// Builds the sql insert query
|
|
||||||
if (!isset($query)) {
|
|
||||||
$fieldlist = preg_replace('@, $@', '', $fieldlist);
|
$fieldlist = preg_replace('@, $@', '', $fieldlist);
|
||||||
$query = array('INSERT INTO ' . PMA_backquote($table) . ' (' . $fieldlist . ') VALUES ');
|
$query = array('INSERT INTO ' . PMA_backquote($table) . ' (' . $fieldlist . ') VALUES ');
|
||||||
}
|
}
|
||||||
$valuelist = preg_replace('@, $@', '', $valuelist);
|
// append current values
|
||||||
$query[0] .= '(' . $valuelist . '), ';
|
$query[0] .= '(' . $valuelist . '), ';
|
||||||
$message = $strInsertedRows . ' ';
|
$message = $strInsertedRows . ' ';
|
||||||
}
|
} elseif (!empty($valuelist)) {
|
||||||
$query[0] = preg_replace('@, $@', '', $query[0]);
|
// build update query
|
||||||
} // end row insertion
|
$query[] = 'UPDATE ' . PMA_backquote($table) . ' SET ' . $valuelist . ' WHERE' . $primary_key . ' LIMIT 1';
|
||||||
|
|
||||||
|
$message = $strAffectedRows . ' ';
|
||||||
|
}
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
// trim last , from insert query
|
||||||
|
if ($is_insert) {
|
||||||
|
$query[0] = preg_replace('@, $@', '', $query[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($valuelist) && empty($query)) {
|
||||||
|
// No change -> move back to the calling script
|
||||||
|
$message = $strNoModification;
|
||||||
|
if ($is_gotofile) {
|
||||||
|
$js_to_run = 'functions.js';
|
||||||
|
require_once('./header.inc.php');
|
||||||
|
require('./' . preg_replace('@\.\.*@', '.', $goto));
|
||||||
|
} else {
|
||||||
|
PMA_sendHeaderLocation($cfg['PmaAbsoluteUri'] . $goto . '&disp_message=' . urlencode($message) . '&disp_query=');
|
||||||
|
|
||||||
|
}
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the sql query and get the result, then move back to the calling
|
* Executes the sql query and get the result, then move back to the calling
|
||||||
|
Reference in New Issue
Block a user