home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / phpMyAdmin / tbl_replace.php < prev    next >
PHP Script  |  2008-06-23  |  13KB  |  372 lines

  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4.  * manipulation of table data like inserting, replacing and updating
  5.  *
  6.  * usally called as form action from tbl_change.php to insert or update table rows
  7.  *
  8.  * @version $Id: tbl_replace.php 11281 2008-05-18 15:53:27Z lem9 $
  9.  *
  10.  * @todo 'edit_next' tends to not work as expected if used ... at least there is no order by
  11.  *       it needs the original query and the row number and than replace the LIMIT clause
  12.  * @uses    PMA_checkParameters()
  13.  * @uses    PMA_DBI_select_db()
  14.  * @uses    PMA_DBI_query()
  15.  * @uses    PMA_DBI_fetch_row()
  16.  * @uses    PMA_DBI_get_fields_meta()
  17.  * @uses    PMA_DBI_free_result()
  18.  * @uses    PMA_DBI_try_query()
  19.  * @uses    PMA_DBI_getError()
  20.  * @uses    PMA_DBI_affected_rows()
  21.  * @uses    PMA_DBI_insert_id()
  22.  * @uses    PMA_backquote()
  23.  * @uses    PMA_getUniqueCondition()
  24.  * @uses    PMA_sqlAddslashes()
  25.  * @uses    PMA_securePath()
  26.  * @uses    PMA_sendHeaderLocation()
  27.  * @uses    str_replace()
  28.  * @uses    urlencode()
  29.  * @uses    count()
  30.  * @uses    file_exists()
  31.  * @uses    strlen()
  32.  * @uses    str_replace()
  33.  * @uses    preg_replace()
  34.  * @uses    is_array()
  35.  * @uses    $GLOBALS['db']
  36.  * @uses    $GLOBALS['table']
  37.  * @uses    $GLOBALS['goto']
  38.  * @uses    $GLOBALS['sql_query']
  39.  */
  40.  
  41. /**
  42.  * do not import request variable into global scope
  43.  *
  44.  * cannot be used as long as it could happen that the $goto file that is included
  45.  * at the end of this script is not updated to work without imported request variables
  46.  *
  47.  * @todo uncomment this if all possible included files to rely on import request variables
  48. if (! defined('PMA_NO_VARIABLES_IMPORT')) {
  49.     define('PMA_NO_VARIABLES_IMPORT', true);
  50. }
  51.  */
  52. /**
  53.  * Gets some core libraries
  54.  */
  55. require_once './libraries/common.inc.php';
  56.  
  57. // Check parameters
  58. PMA_checkParameters(array('db', 'table', 'goto'));
  59.  
  60. PMA_DBI_select_db($GLOBALS['db']);
  61.  
  62. /**
  63.  * Initializes some variables
  64.  */
  65. $goto_include = false;
  66.  
  67. if (isset($_REQUEST['insert_rows']) && is_numeric($_REQUEST['insert_rows']) && $_REQUEST['insert_rows'] != $cfg['InsertRows']) {
  68.     $cfg['InsertRows'] = $_REQUEST['insert_rows'];
  69.     $js_to_run = 'tbl_change.js';
  70.     require_once './libraries/header.inc.php';
  71.     require './tbl_change.php';
  72.     exit;
  73. }
  74.  
  75. if (isset($_REQUEST['after_insert'])
  76.  && in_array($_REQUEST['after_insert'], array('new_insert', 'same_insert', 'edit_next'))) {
  77.     $url_params['after_insert'] = $_REQUEST['after_insert'];
  78.     //$GLOBALS['goto'] = 'tbl_change.php';
  79.     $goto_include = 'tbl_change.php';
  80.  
  81.     if (isset($_REQUEST['primary_key'])) {
  82.         if ($_REQUEST['after_insert'] == 'same_insert') {
  83.             foreach ($_REQUEST['primary_key'] as $pk) {
  84.                 $url_params['primary_key'][] = $pk;
  85.             }
  86.         } elseif ($_REQUEST['after_insert'] == 'edit_next') {
  87.             foreach ($_REQUEST['primary_key'] as $pk) {
  88.                 $local_query    = 'SELECT * FROM ' . PMA_backquote($GLOBALS['db']) . '.' . PMA_backquote($GLOBALS['table'])
  89.                                 . ' WHERE ' . str_replace('` =', '` >', $pk)
  90.                                 . ' LIMIT 1;';
  91.                 $res            = PMA_DBI_query($local_query);
  92.                 $row            = PMA_DBI_fetch_row($res);
  93.                 $meta           = PMA_DBI_get_fields_meta($res);
  94.                 // must find a unique condition based on unique key,
  95.                 // not a combination of all fields
  96.                 if ($tmp = PMA_getUniqueCondition($res, count($meta), $meta, $row, true)) {
  97.                     $_SESSION['edit_next'] = $tmp;
  98.                 }
  99.                 unset($tmp);
  100.             }
  101.         }
  102.     }
  103. } elseif (! empty($GLOBALS['goto'])) {
  104.     if (! preg_match('@^[a-z_]+\.php$@', $GLOBALS['goto'])) {
  105.         // this should NOT happen
  106.         //$GLOBALS['goto'] = false;
  107.         $goto_include = false;
  108.     } else {
  109.         $goto_include = $GLOBALS['goto'];
  110.     }
  111.     if ($GLOBALS['goto'] == 'db_sql.php' && strlen($GLOBALS['table'])) {
  112.         $GLOBALS['table'] = '';
  113.     }
  114. }
  115.  
  116. if (! $goto_include) {
  117.     if (! strlen($GLOBALS['table'])) {
  118.         $goto_include = 'db_sql.php';
  119.     } else {
  120.         $goto_include = 'tbl_sql.php';
  121.     }
  122. }
  123.  
  124. // Defines the url to return in case of failure of the query
  125. if (isset($_REQUEST['err_url'])) {
  126.     $err_url = $_REQUEST['err_url'];
  127. } else {
  128.     $err_url = 'tbl_change.php' . PMA_generate_common_url($url_params);
  129. }
  130.  
  131. /**
  132.  * Prepares the update/insert of a row
  133.  */
  134. if (isset($_REQUEST['primary_key'])) {
  135.     // we were editing something => use primary key
  136.     $loop_array = (is_array($_REQUEST['primary_key']) ? $_REQUEST['primary_key'] : array($_REQUEST['primary_key']));
  137.     $using_key  = true;
  138.     $is_insert  = ($_REQUEST['submit_type'] == $GLOBALS['strInsertAsNewRow']);
  139. } else {
  140.     // new row => use indexes
  141.     $loop_array = array();
  142.     foreach ($_REQUEST['fields']['multi_edit'] as $key => $dummy) {
  143.         $loop_array[] = $key;
  144.     }
  145.     $using_key  = false;
  146.     $is_insert  = true;
  147. }
  148.  
  149. $query = array();
  150. $message = '';
  151. $value_sets = array();
  152. $func_no_param = array(
  153.     'NOW',
  154.     'CURDATE',
  155.     'CURTIME',
  156.     'UTC_DATE',
  157.     'UTC_TIME',
  158.     'UTC_TIMESTAMP',
  159.     'UNIX_TIMESTAMP',
  160.     'RAND',
  161.     'USER',
  162.     'LAST_INSERT_ID',
  163. );
  164.  
  165. foreach ($loop_array as $rowcount => $primary_key) {
  166.     // skip fields to be ignored
  167.     if (! $using_key && isset($_REQUEST['insert_ignore_' . $primary_key])) {
  168.         continue;
  169.     }
  170.  
  171.     // Defines the SET part of the sql query
  172.     $query_values = array();
  173.  
  174.     // Map multi-edit keys to single-level arrays, dependent on how we got the fields
  175.     $me_fields =
  176.         isset($_REQUEST['fields']['multi_edit'][$rowcount])
  177.         ? $_REQUEST['fields']['multi_edit'][$rowcount]
  178.         : array();
  179.     $me_fields_prev =
  180.         isset($_REQUEST['fields_prev']['multi_edit'][$rowcount])
  181.         ? $_REQUEST['fields_prev']['multi_edit'][$rowcount]
  182.         : null;
  183.     $me_funcs =
  184.         isset($_REQUEST['funcs']['multi_edit'][$rowcount])
  185.         ? $_REQUEST['funcs']['multi_edit'][$rowcount]
  186.         : null;
  187.     $me_fields_type =
  188.         isset($_REQUEST['fields_type']['multi_edit'][$rowcount])
  189.         ? $_REQUEST['fields_type']['multi_edit'][$rowcount]
  190.         : null;
  191.     $me_fields_null =
  192.         isset($_REQUEST['fields_null']['multi_edit'][$rowcount])
  193.         ? $_REQUEST['fields_null']['multi_edit'][$rowcount]
  194.         : null;
  195.     $me_fields_null_prev =
  196.         isset($_REQUEST['fields_null_prev']['multi_edit'][$rowcount])
  197.         ? $_REQUEST['fields_null_prev']['multi_edit'][$rowcount]
  198.         : null;
  199.     $me_auto_increment =
  200.         isset($_REQUEST['auto_increment']['multi_edit'][$rowcount])
  201.         ? $_REQUEST['auto_increment']['multi_edit'][$rowcount]
  202.         : null;
  203.  
  204.     foreach ($me_fields as $key => $val) {
  205.  
  206.         require './libraries/tbl_replace_fields.inc.php';
  207.  
  208.         if (empty($me_funcs[$key])) {
  209.             $cur_value = $val;
  210.         } elseif ('UNIX_TIMESTAMP' === $me_funcs[$key] && $val != "''") {
  211.             $cur_value = $me_funcs[$key] . '(' . $val . ')';
  212.         } elseif (in_array($me_funcs[$key], $func_no_param)) {
  213.             $cur_value = $me_funcs[$key] . '()';
  214.         } else {
  215.             $cur_value = $me_funcs[$key] . '(' . $val . ')';
  216.         }
  217.  
  218.         //  i n s e r t
  219.         if ($is_insert) {
  220.             // no need to add column into the valuelist
  221.             if (strlen($cur_value)) {
  222.                 $query_values[] = $cur_value;
  223.                 // first inserted row so prepare the list of fields
  224.                 if (empty($value_sets)) {
  225.                     $query_fields[] = PMA_backquote($key);
  226.                 }
  227.             }
  228.  
  229.         //  u p d a t e
  230.         } elseif (!empty($me_fields_null_prev[$key])
  231.          && !isset($me_fields_null[$key])) {
  232.             // field had the null checkbox before the update
  233.             // field no longer has the null checkbox
  234.             $query_values[] = PMA_backquote($key) . ' = ' . $cur_value;
  235.         } elseif (empty($me_funcs[$key])
  236.          && isset($me_fields_prev[$key])
  237.          && ("'" . PMA_sqlAddslashes($me_fields_prev[$key]) . "'" == $val)) {
  238.             // No change for this column and no MySQL function is used -> next column
  239.             continue;
  240.         } elseif (! empty($val)) {
  241.             // avoid setting a field to NULL when it's already NULL
  242.             // (field had the null checkbox before the update
  243.             //  field still has the null checkbox)
  244.             if (!(! empty($me_fields_null_prev[$key])
  245.              && isset($me_fields_null[$key]))) {
  246.                 $query_values[] = PMA_backquote($key) . ' = ' . $cur_value;
  247.             }
  248.         }
  249.     } // end foreach ($me_fields as $key => $val)
  250.  
  251.     if (count($query_values) > 0) {
  252.         if ($is_insert) {
  253.             $value_sets[] = implode(', ', $query_values);
  254.         } else {
  255.             // build update query
  256.             $query[] = 'UPDATE ' . PMA_backquote($GLOBALS['db']) . '.' . PMA_backquote($GLOBALS['table'])
  257.                     . ' SET ' . implode(', ', $query_values) . ' WHERE ' . $primary_key . ' LIMIT 1';
  258.  
  259.         }
  260.     }
  261. } // end foreach ($loop_array as $primary_key)
  262. unset($me_fields_prev, $me_funcs, $me_fields_type, $me_fields_null, $me_fields_null_prev,
  263.     $me_auto_increment, $cur_value, $key, $val, $loop_array, $primary_key, $using_key,
  264.     $func_no_param);
  265.  
  266.  
  267. // Builds the sql query
  268. if ($is_insert && count($value_sets) > 0) {
  269.     $query[] = 'INSERT INTO ' . PMA_backquote($GLOBALS['db']) . '.' . PMA_backquote($GLOBALS['table'])
  270.         . ' (' . implode(', ', $query_fields) . ') VALUES (' . implode('), (', $value_sets) . ')';
  271.  
  272.     unset($query_fields, $value_sets);
  273.  
  274.     $message .= $GLOBALS['strInsertedRows'] . ' ';
  275. } elseif (! empty($query)) {
  276.     $message .= $GLOBALS['strAffectedRows'] . ' ';
  277. } else {
  278.     // No change -> move back to the calling script
  279.     $message .= $GLOBALS['strNoModification'];
  280.     $js_to_run = 'functions.js';
  281.     $active_page = $goto_include;
  282.     require_once './libraries/header.inc.php';
  283.     require './' . PMA_securePath($goto_include);
  284.     exit;
  285. }
  286. unset($me_fields, $is_insert);
  287.  
  288. /**
  289.  * Executes the sql query and get the result, then move back to the calling
  290.  * page
  291.  */
  292. if (! empty($GLOBALS['sql_query'])) {
  293.     $url_params['sql_query'] = $GLOBALS['sql_query'];
  294.     $return_to_sql_query = $GLOBALS['sql_query'];
  295. }
  296. $GLOBALS['sql_query'] = implode('; ', $query) . ';';
  297. $total_affected_rows = 0;
  298. $last_message = '';
  299. $warning_message = '';
  300.  
  301. foreach ($query as $single_query) {
  302.     if ($GLOBALS['cfg']['IgnoreMultiSubmitErrors']) {
  303.         $result = PMA_DBI_try_query($single_query);
  304.     } else {
  305.         $result = PMA_DBI_query($single_query);
  306.     }
  307.     
  308.     if (! $result) {
  309.         $message .= PMA_DBI_getError();
  310.     } else {
  311.         if (@PMA_DBI_affected_rows()) {
  312.             $total_affected_rows += @PMA_DBI_affected_rows();
  313.         }
  314.  
  315.         $insert_id = PMA_DBI_insert_id();
  316.         if ($insert_id != 0) {
  317.             // insert_id is id of FIRST record inserted in one insert, so if we
  318.             // inserted multiple rows, we had to increment this
  319.  
  320.             if ($total_affected_rows > 0) {
  321.                 $insert_id = $insert_id + $total_affected_rows - 1;
  322.             }
  323.             $last_message .= '[br]' . $GLOBALS['strInsertedRowId'] . ' ' . $insert_id;
  324.         }
  325.         PMA_DBI_free_result($result);
  326.     } // end if
  327.  
  328.     foreach (PMA_DBI_get_warnings() as $warning) {
  329.         $warning_message .= $warning['Level'] . ': #' . $warning['Code'] 
  330.             . ' ' . $warning['Message'] . '[br]';
  331.     }
  332.     
  333.     unset($result);
  334. }
  335. unset($single_query, $query);
  336.  
  337. $message .= $total_affected_rows . $last_message;
  338.  
  339. if (! empty($warning_message)) {
  340.     /**
  341.      * @todo use a <div class="warning"> in PMA_showMessage() for this part of
  342.      * the message
  343.      */
  344.     $message .= '[br]' . $warning_message;
  345. }
  346. unset($warning_message, $total_affected_rows, $last_message);
  347.  
  348. if (isset($return_to_sql_query)) {
  349.     $disp_query = $GLOBALS['sql_query'];
  350.     $disp_message = $message;
  351.     unset($message);
  352.     $GLOBALS['sql_query'] = $return_to_sql_query;
  353. }
  354.  
  355. // if user asked to "Insert another new row", we need tbl_change.js
  356. // otherwise the calendar icon does not work
  357. if ($goto_include == 'tbl_change.php') {
  358.     /**
  359.      * @todo if we really need to run many different js at header time,
  360.      * $js_to_run would become an array and header.inc.php would iterate
  361.      * thru it, instead of the bunch of if/elseif it does now
  362.      */
  363.     $js_to_run = 'tbl_change.js';
  364. } else {
  365.     $js_to_run = 'functions.js';
  366. }
  367. $active_page = $goto_include;
  368. require_once './libraries/header.inc.php';
  369. require './' . PMA_securePath($goto_include);
  370. exit;
  371. ?>
  372.