$name\n"; print_r($val); echo "\n"; } else { echo "$name::$val::
\n"; } } if (! function_exists('array_search')) { /* {{{ */ function array_search($needle, $haystack) { foreach ($haystack as $key => $value) { if ($needle == $value) return $key; } return false; } } /* }}} */ class phpMyEdit { var $hn; // hostname var $un; // user name var $pw; // password var $db; // database var $tb; // table var $key; // Name of field which is the unique key var $key_type; // Type of key field (int/real/string/date etc) var $key_delim; var $inc; // no of records to display (SELECT ... LIMIT $fm, $inc) var $fm; // first record to display var $fl; // is the filter row displayed (boolean) var $options; // Options for users: A(dd) C(hange) D(elete) F(ilter) U(nsorted) var $fdd; // field definitions var $qfn; // value of all filters used during the last pass var $sfn; // sort field number (- = descending sort order) var $rec; // no. of record selected for editing var $prev, $next; // navigation buttons var $sw; // filter display/hide button var $labels; // labels for buttons, etc (multilingual) var $operation; // operation to do: Add, Change, Delete var $saveadd; var $moreeadd; var $savechange; var $savedelete; var $fds; // sql field names var $num_fds; // number of fields var $logtable; // name of optional logtable function myquery($qry, $line = 0) /* {{{ */ { global $debug_query; if ($debug_query) echo "

qry at $line: $qry

\n"; $this->elog("qry: $qry",$line); $ret = @mysql_db_query($this->db,$qry); if (! $ret) { $this->elog(mysql_errno().": ".mysql_error().' in '.$qry,__LINE__); } return $ret; } /* }}} */ function htmldisplay($field,$str,$usemask=true,$usecodec=true) /* {{{ */ { // undo the add slashes $str = stripslashes($str); // if there's a field mask, use it as first arg to sprintf if (isset($field['mask']) && $usemask) $str = sprintf($field['mask'],$str); if ($usecodec) { // if db codec is in effect, use it if (isset($field['dbdecode'])) { $str = htmlspecialchars(eval('return '.$field['dbdecode'].'(\''.$str.'\');')); } else { $str = htmlspecialchars($str); } } return $str; } /* }}} */ function encode($field,$str) /* {{{ */ { if (isset($field['dbencode'])) { return eval( 'return ' .$field['dbencode'] .'(\''.$str.'\');'); } else { return $str; } } /* }}} */ function elog($str,$line) /* {{{ */ { error_log(__FILE__.":$line::\n$str",0); return true; } /* }}} */ function make_language_labels($language) /* {{{ */ { // just try the first language and variant // this isn't content-negotiation rfc compliant $language = substr($language,0,5); // try the full language w/ variant $ret = @include($this->dir['lang'].'PME.lang.'.$language.'.inc'); if (! $ret) { // try the language w/o variant $ret = @include($this->dir['lang'].'PME.lang.'.substr($language,0,2).'.inc'); } if (! $ret) { // default to English-U.S. $ret = @include($this->dir['lang'].'PME.lang.EN-US.inc'); } return $ret; } /* }}} */ function set_values_from_table($field_num,$prepend='') /* {{{ */ { if($this->fdd[$field_num]['values']['db']) { $db = $this->fdd[$field_num]['values']['db']; } else { $db = $this->db; } $table = $this->fdd[$field_num]['values']['table']; $key = $this->fdd[$field_num]['values']['column']; $desc = $this->fdd[$field_num]['values']['description']; $qparts['type'] = 'select'; $qparts['select'] = 'DISTINCT '.$key; if ($desc) { $qparts['select'] .= ','.$desc; $qparts['orderby'] = $desc; } else { $qparts['orderby'] = $key; } //$qparts['from'] = "$db.$table.$sel; $qparts['from'] = "$db.$table"; $qparts['where'] = $this->fdd[$field_num]['values']['filters']; if ($this->fdd[$field_num]['values']['orderby']) $qparts['orderby'] = $this->fdd[$field_num]['values']['orderby']; $res = $this->myquery($this->query_make($qparts),__LINE__); $values = Array(); if ($prepend != '') $values[$prepend[0]] = $prepend[1]; while ($row = mysql_fetch_row($res)) { if ($desc) { $values[$row[0]] = $row[1]; } else { $values[$row[0]] = $row[0]; } } return $values; } /* }}} */ function fqn($field, $use_qfx=false) /* {{{ */ { if (is_string($field)) $field = array_search($field,$this->fds); // get the table/field name if (isset($this->fdd[$field]['expression'])) { $ret = $this->fdd[$field]['expression']; } elseif ($this->fdd[$this->fds[$field]]['values']['description']) { $ret = 'JoinTable'.$field.'.'.$this->fdd[$this->fds[$field]]['values']['description']; } elseif ($this->fdd[$this->fds[$field]]['values']['column']) { $ret = 'JoinTable'.$field.'.'.$this->fdd[$this->fds[$field]]['values']['column']; } else { $ret = 'Table0.'.$this->fds[$field]; } // what to do with $format XXX if ($use_qfx) $ret = 'qf'.$field; // return the value return $ret; } /* }}} */ function create_column_list() /* {{{ */ { $fields = Array(); for ($k = 0; $k < $this->num_fds; $k++) { if ($this->col_is_date($k)) { //$fields[] = 'DATE_FORMAT('.$this->fqn($k).',"%Y%m%d%H%i%s") AS qf'.$k; $fields[] = $this->fqn($k).' AS qf'.$k; } else { $fields[] = $this->fqn($k).' AS qf'.$k; } } return join(',',$fields); } /* }}} */ function query_make($parts) /* {{{ */ { foreach ($parts as $k => $v) $parts[$k] = trim($parts[$k]); if ($parts['type'] == 'select') { $ret = 'SELECT '; if ($parts['DISTINCT']) $ret .= 'DISTINCT '; $ret .= $parts['select']; $ret .= ' FROM '.$parts['from']; if ($parts['where'] != '') $ret .= ' WHERE '.$parts['where']; if ($parts['groupby'] != '') $ret .= ' GROUP BY '.$parts['groupby']; if ($parts['having'] != '') $ret .= ' HAVING '.$parts['having']; if ($parts['orderby'] != '') $ret .= ' ORDER BY '.$parts['orderby']; if ($parts['limit'] != '') $ret .= ' LIMIT '.$parts['limit']; if ($parts['procedure'] != '') $ret .= ' PROCEDURE '.$parts['procedure']; } elseif ($parts['type'] == 'update') { $ret = 'UPDATE '.$parts['table']; $ret .= ' SET '.$parts['fields']; if ($parts['where'] != '') $ret .= ' WHERE '.$parts['where']; } elseif ($parts['type'] == 'insert') { $ret = 'INSERT INTO '.$parts['table']; $ret .= ' VALUES '.$parts['values']; } elseif ($parts['type'] == 'delete') { $ret = 'DELETE FROM '.$parts['table']; if ($parts['where'] != '') $ret .= ' WHERE '.$parts['where']; } return $ret; } /* }}} */ function create_join_clause() /* {{{ */ { $tbs[] = $this->tb; $join = $this->tb.' AS Table0'; for ($k = 0,$numfds = sizeof($this->fds); $k<$numfds; $k++) { $field = $this->fds[$k]; if($this->fdd[$field]['values']['db']) { $db = $this->fdd[$field]['values']['db']; } else { $db = $this->db; } $table = $this->fdd[$field]['values']['table']; $id = $this->fdd[$field]['values']['column']; $desc = $this->fdd[$field]['values']['description']; if ($desc != '' || $id != '') { $alias = 'JoinTable'.$k; if (!in_array($alias,$tbs)) { $join .= " LEFT OUTER JOIN $db.". $table. ' AS '.$alias. ' ON '.$alias. '.'.$id. '='.'Table0.'.$field; $tbs[]=$alias; } } } return $join; } /* }}} */ function make_where_from_query_opts($qp='') /* {{{ */ { if ($qp == '') $qp = $this->query_opts; $where = Array(); foreach ($qp as $field => $ov) { $where[] = sprintf('%s %s %s',$field,$ov['oper'],$ov['value']); } // Add any coder specified filters if ($this->filters) $where[] = '('.$this->filters.')'; if (count($where) > 0) return join(' AND ',$where); return false; } /* }}} */ function make_text_where_from_query_opts($qp='') /* {{{ */ { if ($qp == '') $qp = $this->query_opts; $where = Array(); foreach ($qp as $field => $ov) { $where[] = sprintf('%s %s %s',$field,$ov['oper'],$ov['value']); } if (count($where) > 0) return str_replace('%','*',join(' AND ',$where)); return false; } /* }}} */ /* * functions for get/post/query args */ function gather_post_vars() /* {{{ */ { global $HTTP_POST_VARS; foreach ($HTTP_POST_VARS as $key => $val) { if ($val != '' && $val != '*') { $pv[$key] = $val; } } $this->pv = $pv; } /* }}} */ function gather_query_opts() /* {{{ */ { // gathers query options into an array, $this->query_opts $query_opts = Array(); $qo = Array(); for ($k = 0; $k < $this->num_fds; $k++) { // get the field name and value $l = 'qf'.$k; $lc = 'qf'.$k.'_comp'; global $$l,$$lc; $m = $this->web2plain($$l); // get the comparison operator for numeric/date types $mc = $this->web2plain($$lc); $type = $this->fdd[$k]['type']; if ($m != '') { if (is_array($m)) { // multiple selection has been used if (!in_array('*',$m)) { // one '*' in a multiple selection is all you need for ($n=0; $nfqn($k)] = Array( 'oper' => $qf_op, 'value' => '('.$qf_val.')'); } } else { $afilter = $m; if ($afilter != '*') { if ($this->fdd[$k]['values']['description']) { $qo[$this->fqn($k)] = Array( 'oper' => '=', 'value' => "'".$afilter."'"); } elseif ($this->fdd[$k]['values']['column']) { $qo[$this->fqn($k)] = Array( 'oper' => '=', 'value' => "'".$afilter."'"); } elseif ($this->col_is_string($k)) { // massage the filter for a string comparison if (($afilter != '') AND ($afilter != '*')) { $afilter = addslashes(addslashes('%' .str_replace ('*', '%', $afilter).'%')); $qo[$this->fqn($k)] = Array('oper' => 'like', 'value' => "'".$afilter."'"); } } elseif ($this->col_is_number($k) && ($$lc != '')) { if ($$lc != '') { $qo[$this->fqn($k)] = Array( 'oper' => $mc, 'value' => $afilter); } } elseif ($this->col_is_date($k)) { #if ($$lc != '') { # $val = $this->gather_date_fields_into_type($$l,$type); # $val = $this->mdate_set(date($this->mdate_masks[$type],$this->mdate_getFromPost($k)),$type); # $val = $this->mdate_getFromPost($k); # if ($val != '') { # $qo[$this->fqn($k)] = # Array( 'oper' => $mc, 'value' => '"'.$val.'"'); # } #} # massage the filter for a string comparison if (($afilter != '') AND ($afilter != '*')) { $afilter = addslashes(addslashes('%' .str_replace ('*', '%', $afilter).'%')); $qo[$this->fqn($k)] = Array('oper' => 'like', 'value' => "'".$afilter."'"); } } elseif($this->fdd[$k]['values']) { //debug_var('col_is_string',$this->fdd[$k]['name'].'::'.$this->fdd[$k]['type']); $qo[$this->fqn($k)] = Array( 'oper' => '=', 'value' => "'".$afilter."'"); } else { // unknown (to mysql/php interface) field type massage the filter for a string comparison $afilter = addslashes(addslashes('%'.str_replace ('*', '%', $afilter).'%')); $qo[$this->fqn($k)] = Array('oper' => 'like', 'value' => "'".$afilter."'"); } } } } // if } // for $this->query_opts = $qo; } // gather_query_opts /* }}} */ function gather_get_vars() /* {{{ */ { global $QUERY_STRING; $vals = Array(); $parts = split('&',$QUERY_STRING); if (count($parts) > 0) { foreach ($parts as $part) { list($key,$val) = split('=',$part,2); $vals[$key] = $val; } } $this->get_opts = $vals; } /* }}} */ function unify_opts() /* {{{ */ { $all_opts = Array(); if (count($this->qo) > 0) { foreach ($this->qo as $key=>$val) $all_opts[$key] = $val; } if (count($this->pv) > 0) { foreach ($this->pv as $key=>$val) $all_opts[$key] = $val; } if (count($this->get_opts) > 0) { foreach ($this->get_opts as $key=>$val) $all_opts[$key] = $val; } $this->all_opts = $all_opts; } /* }}} */ /* * type functions */ function col_is_date($k) { return in_array($this->fdd[$k]['type'],$this->dateTypes ); } function col_is_number($k) { return in_array($this->fdd[$k]['type'],$this->numberTypes); } function col_is_string($k) { return in_array($this->fdd[$k]['type'],$this->stringTypes); } function col_is_set($k) { return ($this->fdd[$k]['type']=='set'); } /* * functions for indicating whether operations are enabled */ function initial_sort_suppressed() { return (stristr ($this->options, 'I')); } function add_enabled() { return stristr($this->options, 'A'); } function change_enabled() { return stristr($this->options, 'C'); } function delete_enabled() { return stristr($this->options, 'D'); } function filter_enabled() { return stristr($this->options, 'F'); } function view_enabled() { return stristr($this->options, 'V'); } function copy_enabled() { return stristr($this->options, 'P') && $this->add_enabled(); } function hidden($k) { return stristr($this->fdd[$k]['options'],'H'); } function password($k) { return stristr($this->fdd[$k]['options'],'P'); } function readonly($k) { return stristr($this->fdd[$k]['options'],'R') || $this->fdd[$k]['expression']; } function add_operation() { return ( $this->operation == $this->labels['Add'] or $this->saveadd == $this->labels['Save']) and $this->add_enabled(); } function more_operation() { return ($this->moreadd == $this->labels['More']) and $this->add_enabled(); } function display_operation() { return ($this->operation == $this->labels['Delete'] or $this->savedelete == $this->labels['Save']) and $this->delete_enabled(); } function change_operation() { return ($this->operation == $this->labels['Change'] or $this->savechange == $this->labels['Save']) and $this->change_enabled(); } function copy_operation() { return ($this->operation == $this->labels['Copy'] or $this->savechange == $this->labels['Save']) and $this->add_enabled(); } function delete_operation() { return ($this->operation == $this->labels['Delete'] or $this->savedelete == $this->labels['Save']) and $this->delete_enabled(); } function view_operation() { return $this->operation == $this->labels['Display']; } function filter_operation() { return isset($this->filter) and $this->filter_enabled(); } function displayed($k) /* {{{ */ { //echo "
";
		//var_dump($this->fdd);
		//echo "

"; return ( ! $this->hidden($k) && ( empty($this->fdd[$k]['options']) || ( $this->add_operation() and stristr($this->fdd[$k]['options'],'A')) || ( $this->more_operation() and stristr($this->fdd[$k]['options'],'A')) || ( $this->display_operation() and stristr($this->fdd[$k]['options'],'V')) || ( $this->change_operation() and stristr($this->fdd[$k]['options'],'C')) || ( $this->delete_operation() and stristr($this->fdd[$k]['options'],'D')) || ( $this->filter_operation() and stristr($this->fdd[$k]['options'],'F')) || ( stristr($this->fdd[$k]['options'],'L') and ! $this->add_operation() && ! $this->more_operation() && ! $this->display_operation() && ! $this->change_operation() && ! $this->delete_operation() && ! $this->filter_operation()) ) ); } /* }}} */ /* * Create JavaScripts */ function create_javascripts() /* {{{ */ { /* Need a lot of work in here using something like: $fdd['fieldname']['validate']['js_regex']='/something/'; $fdd['fieldname']['validate']['php_regex']='something'; */ if ($this->add_operation() or $this->change_operation() or $this->more_operation()) { echo '' . "\n"; // echo echo '
'."\n"; } else { echo ''."\n"; } } /* }}} */ /* * Display functions */ function display_add_record() /* {{{ */ { echo ' '."\n"; echo ' Field'."\n"; echo ' Value'."\n"; if ($this->guidance) echo ' Guidance'."\n"; echo ' '."\n"; for ($k = 0; $k < $this->num_fds; $k++) { echo ' '."\n"; if ( $this->displayed($k) ) { echo ' '.$this->fdd[$k]['name'].''."\n"; if ($this->fdd[$k]['select'] == 'M') { $a = ' multiple size="'.$this->multiple.'"'; } else { $a=''; } if (isset ($this->fdd[$k]['values'])) { echo ' ' ."\n"; if (isset($this->fdd[$k]['values']['table'])) { $vals = array_merge(Array(''=>''),$this->set_values_from_table($k)); } else { $vals = array_merge(Array(''=>''),$this->fdd[$k]['values']); } echo $this->htmlSelect($this->fds[$k],$vals,''); echo ' '."\n"; } elseif (isset ($this->fdd[$k]['textarea'])) { echo ' '."\n"; } else { // Simple edit box required $type = $this->fdd[$k]['type']; echo ' '; echo ''; if ($this->readonly($k)) { echo $this->htmldisplay($this->fdd[$k],'',false,false) .''; } else { if ($this->col_is_string($k) || $this->col_is_number($k)) { // string type $maxwidth = intval($this->fdd[$k]['maxlen']); $size = min(60,$maxwidth); echo ''; } elseif ($this->col_is_date($k)) { // date type, get date components //if ($this->fdd[$k]['default']) // $value = $this->mdate_set($this->fdd[$k]['default'],$this->fdd[$k]['type']); //$value = time(); //echo $this->mdate_disperse($k,$value,true); // string type $maxwidth = intval($this->fdd[$k]['maxlen']); $size = min(60,$maxwidth); echo ''; } else { // unknown type echo ''; } } echo ''; } // if elseif else if ($this->guidance) if ($this->fdd[$k]['help']) echo ' '.$this->fdd[$k]['help'].''."\n"; else echo " \n"; echo ' '."\n"; } } // for k < this->num_fds } // display_add_record /* }}} */ function display_copy_change_delete_record() /* {{{ */ { /* * for delete or change: SQL SELECT to retrieve the selected record */ $qparts['type'] = 'select'; $qparts['select'] = $this->create_column_list(); $qparts['from'] = $this->create_join_clause(); $qparts['where'] = '('.$this->fqn($this->key).'=' .$this->key_delim.$this->rec.$this->key_delim.')'; $res = $this->myquery($this->query_make($qparts),__LINE__); if ($row = mysql_fetch_array ($res)) { for ($k = 0; $k < $this->num_fds; $k++) { if ($this->copy_operation()) { if ($this->displayed($k)) { echo ' '; echo ' '.$this->fdd[$k]['name'].''."\n"; if ($this->readonly($k)) { echo $this->display_delete_field($row, $k); } elseif ($this->password($k)) { echo ' '; } else { echo $this->display_change_field($row, $k); } if ($this->guidance) { if ($this->fdd[$k]['help']) echo ' '.$this->fdd[$k]['help'].''."\n"; else echo '  '."\n"; } echo ' '."\n"; } // if field displayed elseif ($this->hidden($k)) { if ($k != $this->key_num) { echo ''."\n"; } } } elseif ($this->change_operation()) { if ( $this->hidden($k) ) { echo ''."\n"; } elseif ( $this->displayed($k)) { echo ' '."\n"; echo ' '.$this->fdd[$k]['name'].''."\n"; $this->display_change_field ($row, $k); if ($this->guidance) { if ($this->fdd[$k]['help']) echo ' '.$this->fdd[$k]['help'].''."\n"; else echo '  '."\n"; } echo ' '."\n"; } } elseif ($this->delete_operation() || $this->view_operation()) { if ( $this->displayed($k) ) { echo ' '."\n"; echo ' '.$this->fdd[$k]['name'].''."\n"; $this->display_delete_field($row, $k); if ($this->guidance) if ($this->fdd[$k]['help']) echo ' '.$this->fdd[$k]['help'].''."\n"; else echo '  '."\n"; echo ' '."\n"; } } } // for } // if row } // display_copy_change_delete_record /* }}} */ function display_change_field($row, $k) /* {{{ */ { $type = $this->fdd[$k]['type']; echo ' '."\n"; $found = false; if ($this->col_is_set($k)) { $a = ' multiple size="'.$this->multiple.'"'; } else { $a=''; } if (isset($this->fdd[$k]['values'])) { if (isset($this->fdd[$k]['values']['table'])) { $vals = $this->set_values_from_table($k); } else { $vals = $this->fdd[$k]['values']; } echo $this->htmlSelect($this->fds[$k],$vals,$row[$k]); } elseif (isset ($this->fdd[$k]['textarea'])) { echo ' '."\n"; $found = true; } else { echo ' '; if ($this->col_is_string($k) || $this->col_is_number($k)) { // string type $displaylen = 50; if (isset($this->fdd[$k]['maxlen'])) { $displaylen = min($displaylen,$this->fdd[$k]['maxlen']); } echo 'readonly($k)?'disabled ':'') .'name="'.$this->fds[$k].'" value="' .$this->htmldisplay($this->fdd[$k],$row[$k],false) .'" size="'.$displaylen.'"/>'; } elseif ($this->col_is_date($k)) { # date type, get date components #$value = $this->mdate_from_mysql($row[$k]); #if ($this->readonly($k)) { # $mask = $this->fdd[$k]['datemask']; # if (! $mask) # $mask = $this->mdate_masks[$this->fdd[$k]['type']]; # echo $this->mdate_format($value,$mask); #} else { # echo $this->mdate_disperse($k,$value,true); #} // string type $displaylen = 50; if (isset($this->fdd[$k]['maxlen'])) { $displaylen = min($displaylen,$this->fdd[$k]['maxlen']); } echo 'readonly($k)?'disabled ':'') .'name="'.$this->fds[$k].'" value="' .$this->htmldisplay($this->fdd[$k],$row[$k],false) .'" size="'.$displaylen.'"/>'; } else { // unknown type echo 'readonly($k)?'disabled ':'') .'name="'.$this->fds[$k].'" value="' .$this->htmldisplay($this->fdd[$k],$row[$k],false).'" />'; } echo "\n"; $found = true; } // if elseif else echo ' '."\n"; } // display_change_field($row, $k) /* }}} */ function htmlHidden($name,$value) /* {{{ */ { return ''."\n"; } /* }}} */ function htmlSelect($var,$kv_array,$selected,$multiple=false,$nat_sort=false) /* {{{ */ { if ($nat_sort) uasort($kv_array,"strnatcasecmp"); if (! is_array($selected)) $selected = Array($selected); $ret = ''."\n"; echo ' '."\n"; // if the filter input boxes are not displayed, we need to preserve the filter if (!$this->fl) { for ($k = 0; $k < $this->num_fds; $k++) { $l = 'qf'.$k; global $$l; $m = $this->web2plain($$l); $lc = 'qf'.$k.'_comp'; global $$lc; $mc = $this->web2plain($$lc); if (isset ($m)) { if (is_array($m)) { // multiple selection has been used if (!in_array('*',$m)) {// one '*' in a multiple selection is all you need for ($n=0; $nplain2web($m[$n]) != '') { echo ' '."\n"; } } } } else { // query field comparison operator (if any) if ($this->plain2web($mc) != '') { $this->qfn = $this->qfn.'&qf'.$k.'_comp='.$this->plain2web($mc); echo ' '."\n"; } // preserve query field & value if ($this->plain2web($m) != '') { $this->qfn = $this->qfn.'&qf'.$k.'='.$this->plain2web($m); echo ' '."\n"; } } } } } /* * Set up the URLs which allow sorting by clicking on column headings */ $prev_qfn = $this->qfn; $this->qfn = ''; for ($k = 0; $k < $this->num_fds; $k++) { $l = 'qf'.$k; global $$l; $m = $this->web2plain($$l); $lc = 'qf'.$k.'_comp'; global $$lc; $mc = $this->web2plain($$lc); if (isset ($m)) { if (is_array($m)) { // multiple selection has been used if (!in_array('*',$m)) { // one '*' in a multiple selection is all you need for ($n=0; $nplain2web($m[$n]) != '') { $this->qfn = $this->qfn.'&qf'.$k.'['.$n.']=' .$this->plain2web($m[$n]); } } } } else { if ($this->plain2web($m)!='') { if ($$lc) { $this->qfn .= '&'.$lc.'='.$$lc; } $this->qfn = $this->qfn.'&qf'.$k.'='.$this->plain2web($m); /* // check for multipart date/time/datetime/timestamp/years $qfyear = "qf".$k."_ye"; $qfhour = "qf".$k."_ho"; global $$qfyear,$$qfhour; if ($$qfyear || $$qfhour) { // we have a multi part date/time thingy $qfmont = "qf".$k."_mo"; $qfday = "qf".$k."_da"; $qfminu = "qf".$k."_mi"; $qfsec = "qf".$k."_se"; global $$qfmont,$$qfday,$$qfminu,$$qfsec; foreach ( Array( $qfyear=>$$qfyear,$qfmonth=>$$qfmonth, $qfday=>$$qfday,$qfhour=>$$qfhour, $qfminute=>$$qfminute,$qfsecond=>$$qfsecond ) as $qfk => $qfv ) if ($qfv) $this->qfn .= "&$qfk=".$this->plain2web($qfv); } */ } } } } echo ' '."\n"; // if sort sequence has changed, restart listing if ($this->qfn != $prev_qfn) { $this->fm = 0; } echo ' '."\n"; //$this->print_nav_buttons(); echo ' '."\n"; echo ' '."\n"; /* * we need an initial column if we have filters, * or Changes or Deletes enabled */ if ($this->filter_enabled () or $select_recs) { if ($this->filter_enabled ()) { if ($this->fl) { echo ' '."\n"; } else { echo ' '."\n"; } } else { echo ' '."\n"; } } for ($k = 0; $k < $this->num_fds; $k++) { $fd = $this->fds[$k]; /* if ( ( stristr($this->fdd[$fd]['options'],'L') || ! isset ($this->fdd[$fd]['options']) ) && ! $this->hidden($k) ) */ if ($this->displayed($k)) { $fdn = $this->fdd[$fd]['name']; if (isset ($this->fdd[$fd]['width'])) { $w = ' width="'.$this->fdd[$fd]['width'].'"'; } else { $w = ''; } if ($this->fdd[$fd]['sort']) { // clicking on the current sort field reverses the sort order echo ' '.$fdn.''."\n"; } else { echo ' '.$fdn.''."\n"; } } // if // if we have any aggregates going on, then we have to list all results $var_to_total = 'qf'.$k.'_aggr'; global $$var_to_total; if ($$var_to_total != '') { $listall = true; } } // for echo ' '."\n"; /* * Prepare the SQL Query from the data definition file */ $qparts['type'] = 'select'; $qparts['select'] = $this->create_column_list(); // Even if the key field isn't displayed, we still need its value if ($select_recs) { if (!in_array ($this->key, $this->fds)) { $qparts['select'] .= ','.$this->fqn($this->key); } } $qparts['from'] = $this->create_join_clause(); $qparts['where'] = $this->make_where_from_query_opts(); // build up the ORDER BY clause if ( is_numeric($this->sfn) || isset($this->default_sort_columns) ) { $raw_sort_fields = Array(); $sort_fields = Array(); $sort_fields_w = Array(); //if ($this->sfn != '') if (is_numeric($this->sfn)) { if (isset($this->fdd[$this->sfn]['expression'])) { $raw_sort_field = 'qf'.$this->sfn; $sort_field = 'qf'.$this->sfn; $sort_field_w = $this->sfn.'(expression)'; } else { $raw_sort_field = $this->fqn($this->sfn); $sort_field = $this->fqn($this->sfn); $sort_field_w = $this->fdd[$this->sfn]['name']; } if ( ! $this->sort_asc) { $sort_field .= ' DESC'; $sort_field_w .= ' descending'; } $raw_sort_fields[] = $raw_sort_field; $sort_fields[] = $sort_field; $sort_fields_w[] = $sort_field_w; } if (isset($this->default_sort_columns)) { foreach ($this->default_sort_columns as $dsc) { if (substr($dsc,0,1)=='-') { $field = substr($dsc,1); $desc = true; } else { $field = $dsc; $desc = false; } $raw_candidate = $this->fqn($field); $candidate = $this->fqn($field,true); $sort_field_w = $this->fdd[$field]['name']; if ($desc) { $candidate .= ' DESC'; $sort_field_w .= ' descending'; } if (! in_array($raw_candidate,$raw_sort_fields)) { $sort_fields[] = $candidate; $sort_fields_w[] = $sort_field_w; } } } if (count($sort_fields) > 0) { $qparts['orderby'] = join(',',$sort_fields); } } $to = $this->fm + $this->inc; if ($listall) { $qparts['limit'] = $this->fm.',-1'; } else { $qparts['limit'] = $this->fm.','.$this->inc; } if ($qparts['orderby'] && $this->display_sort) { // XXX this doesn't preserve filters if ($this->sfn != 0) { echo ' '; echo '\n"; } /* * Draw the filter and fill it with any data typed in last pass and stored * in the array parameter keyword 'filter'. Prepare the SQL WHERE clause. */ if ($this->fl) { echo ' '."\n"; for ($k = 0; $k < $this->num_fds; $k++) { $this->field_name = $this->fds[$k]; $fd = $this->field_name; $this->field = $this->fdd[$fd]; $l = 'qf'.$k; global $$l; $lc = 'qf'.$k.'_comp'; global $$lc; $mc = $this->web2plain($$lc); $m = $this->web2plain($$l); $widthStyle = ''; if (isset($this->fdd[$fd]['width'])); $widthStyle = ' STYLE=\'width: "'.(6*$this->fdd[$fd]['width']).'px"\''; $opened = false; if ( $this->displayed($k) ) { echo ' '."\n"; } else { echo ' '."\n"; } // if elseif else } // end if bro1 } // for echo ' '."\n"; } // if first and fl /* * display the current query */ $text_query = $this->make_text_where_from_query_opts(); if ($text_query != '' && $this->display_query) { echo ''; echo '\n"; } /* * Each row of the HTML table is one record from the SQL Query */ //echo "

".$this->query_make($qparts)."

\n"; $res = $this->myquery($this->query_make($qparts),__LINE__); $first = true; $eot = $this->inc; $rowCount = 0; if ($this->actionStyle == 'link' || $this->actionStyle == 'graphic') { // gather query & GET options to preserve for Update/Delete links $qstrparts = Array(); if (count($this->qo) > 0) { foreach ($this->qo as $key=>$val) { if ($key != '' && $key != 'operation' && ! is_array($val) ) $qstrparts[] = "$key=$val"; } } if (count($this->get_opts) > 0) { foreach ($this->get_opts as $key=>$val) { if ($key != '' && $key != 'operation' && ! is_array($val) ) $qstrparts[] = "$key=$val"; } } // preserve sort field number, filter row, and first record to display if (isset($this->sfn)) $qstrparts[] = "sfn=".($this->sort_asc?'':'-').$this->sfn; if (isset($this->fl)) $qstrparts[] = "fl=".$this->fl; if (isset($this->fm)) $qstrparts[] = "fm=".$this->fm; // do we need to preserve filter (filter query) and sw (filter display/hide button)? $qpview = $qstrparts; $qpview[] = 'operation='.$this->labels['Display']; $qpviewStr = '?'.join('&',$qpview); $qpcopy = $qstrparts; $qpcopy[] = 'operation='.$this->labels['Copy']; $qpcopyStr = '?'.join('&',$qpcopy); $qpchange = $qstrparts; $qpchange[] = 'operation=Change'; $qpchangeStr = '?'.join('&',$qpchange); $qpdel = $qstrparts; $qpdel[] = 'operation=Delete'; $qpdelStr = '?'.join('&',$qpdel); } while ($row = mysql_fetch_array ($res)) { $key_rec = $row[$this->key_num]; $qviewStr = $qpviewStr .'&rec='.$key_rec; $qcopyStr = $qpcopyStr .'&rec='.$key_rec; $qchangeStr = $qpchangeStr.'&rec='.$key_rec; $qdelStr = $qpdelStr .'&rec='.$key_rec; echo ' \n"; echo ' '."\n"; // calculate the url query string for optional URL support $urlqueryproto = 'fm='.$this->fm.'&sfn='.($this->sort_asc?'':'-').$this->sfn.'&'.'fl='.$this->fl.'&qfn='.$this->qfn; for ($k = 0; $k < $this->num_fds; $k++) { $fd = $this->fds[$k]; if ($this->hidden($k) || $this->password($k)) { // XXX do nothing KLUDGE KLUDGE /* } elseif ( stristr($this->fdd[$fd]['options'],'L') || ! isset($this->fdd[$fd]['options']) ) { */ } elseif ($this->displayed($k)) { if ((trim ($row[$k]) == '') or ($row[$k] == 'NULL')) { echo ' '."\n"; } else { // display the contents $colattrs = $this->fdd[$fd]['colattrs']; if ($colattrs != '') $colattrs = ' '.$colattrs; if ($this->fdd[$fd]['nowrap']) $colattrs .= ' NOWRAP'; if (isset($this->fdd[$fd]['width'])) { $colattrs .= ' width="'.$this->fdd[$fd]['width'].'"'; } echo ' '; if (! $this->hidden($k) && ! $this->password($k)) { // displayable if (isset($this->fdd[$k]['URL'])) { // it's an URL // put some conveniences in the namespace for the user // to be able to use in the URL string $key = $row[$this->key_num]; $name = $this->fds[$k]; $value = $row[$k]; $page = $this->page_name; $urlquery = $urlqueryproto."&rec=$key"; // remember that $row is a mysql_fetch_array, so it contains all fields //debug_var('URL',$this->fdd[$k]); //debug_var('urlquery',$urlquery); // it's built, now eval it $urlstr = eval('return "'.$urlquery.'";'); //debug_var('urlstr',$urlstr); $urllink = eval('return '.$this->fdd[$k]['URL'].';'); $urldisp = isset($this->fdd[$k]['URLdisp']) ? eval('return '.$this->fdd[$k]['URLdisp'].';') : $value; $target = isset($this->fdd[$k]['URLtarget']) ? 'target="'. $this->fdd[$k]['URLtarget'] . '" ' : ''; echo ''.$urldisp.''; } elseif (isset($this->fdd[$k]['datemask'])) { // display date according to a mask if any //echo $this->mdate_set($row[$k],$this->fdd[$k]['type'],$this->fdd[$k]['datemask']); //echo // $this->mdate_displayPlain( // $this->mdate_from_mysql( // $row[$k]), // ( // $this->fdd[$k]['datemask']? // $this->fdd[$k]['datemask'] // : // $this->mdate_masks[$this->fdd[$k]['type']] // ) // ); //echo $row[$k]; // it's a normal field if (isset($this->fdd[$k]['trimlen'])) { if (strlen($row[$k]) > $this->fdd[$k]['trimlen']) { $shortdisp = ereg_replace("[\r\n\t ]+",' ',$row[$k]); $shortdisp = substr($shortdisp,0,$this->fdd[$k]['trimlen']-3).'...'; } else { $shortdisp = $row[$k]; } echo nl2br( $this->htmldisplay ( $this->fdd[$k], $shortdisp ) ); } else { echo nl2br($this->htmldisplay($this->fdd[$k],$row[$k])); } } else { // it's a normal field if (isset($this->fdd[$k]['trimlen'])) { if (strlen($row[$k]) > $this->fdd[$k]['trimlen']) { $shortdisp = ereg_replace("[\r\n\t ]+",' ',$row[$k]); $shortdisp = substr($shortdisp,0,$this->fdd[$k]['trimlen']-3).'...'; } else { $shortdisp = $row[$k]; } echo nl2br( $this->htmldisplay ( $this->fdd[$k], $shortdisp ) ); } else { echo nl2br($this->htmldisplay($this->fdd[$k],$row[$k])); } } } else { // it's hidden or a password echo 'hidden'; } echo ''."\n"; } // if else } // if } // for echo ' '."\n"; --$eot; } // while /* * Display and accumulate column aggregation info, do totalling query * XXX this feature does not work yet!!! */ // aggregates listing (if any) if ($$var_to_total) { // do the aggregate query if necessary //if ($vars_to_total) { $qp = Array(); $qp['type'] = 'select'; $qp['select'] = $aggr_from_clause; $qp['from'] = $this->create_join_clause (); $qp['where'] = $this->make_where_from_query_opts(); $tot_query = $this->query_make($qp); //$this->elog('TOT_QRY: '.$tot_query,__LINE__); $totals_result = $this->myquery($tot_query,__LINE__); $tot_row=mysql_fetch_array($totals_result); //} $qp_aggr = $qp; echo "\n".''."\n".''."\n"; /* echo ''; echo ''; */ // display the results for ($k=0;$k<$this->num_fds;$k++) { $fd = $this->fds[$k]; if (stristr($this->fdd[$fd]['options'],'L') or !isset($this->fdd[$fd]['options'])) { echo ''."\n"; } } echo ''."\n"; } echo '
 
'. 'Clear'. 'Sorted By: '; } else { echo 'Default Sort Order: '; } echo join(', ',$sort_fields_w); echo "
'; $opened = true; } $type = $this->fdd[$fd]['type']; if (isset ($this->fdd[$k]['values'])) { $type='string'; } /* if ( stristr($this->fdd[$fd]['options'],'L') or !isset ($this->fdd[$fd]['options']) ) */ if ( $this->displayed($k) ) { if ($this->fdd[$fd]['select'] == 'D' or $this->fdd[$fd]['select'] == 'M') { /* Multiple fields processing - default size is 2 and array required for values */ $selected = ''; if ($m != '') $selected = $m; if ($this->fdd[$k]['values']['table']) $x = $this->set_values_from_table($k,Array('*'=>'*')); elseif ($this->fdd[$k]['values']) $x = array_merge(Array('*'=>'*'),$this->fdd[$k]['values']); echo $this->htmlSelect($l,$x,$selected,$multiple=''); } elseif ($this->fdd[$fd]['select'] == 'T') { // this is where we put the comparison selects if ( ! $this->password($k) && ! $this->hidden($k) ) { if ($this->col_is_string($k)) { // it's treated as a string echo ''; } elseif ($this->col_is_date($k)) { // it's a date //echo $this->htmlSelect($l.'_comp',$comp_ops,$$lc); // first get any date elements that were passed in //$filter_val = $this->gather_search_date_fields_into_mysql_timestamp('qf'.$k); // display the search formlet //if ($mc) { // //echo $this->display_search_field_date($type,'qf'.$k,$filter_val,$this->fdd[$k]['datemask']); // //echo $this->mdate_displayForm($filter_val,$type,'qf'.$k,$this->fdd[$k]['datemask'],true); // echo $this->mdate_disperse($k,true,$filter_val); //} //else { // //echo $this->display_search_field_date( $type,'qf'.$k,'',$this->fdd[$k]['datemask']); // echo $this->mdate_displayForm('',$type,'qf'.$k,$this->fdd[$k]['datemask'],true); //} // it's treated as a string echo ''; } elseif ($this->col_is_number($k)) { // it's a number echo $this->htmlSelect($l.'_comp',$comp_ops,$$lc); // it's treated as a string echo ''; } else { // type is 'unknown' or not set, it's treated as a string echo ''; } } else { echo " "; } // if it's int or real and if not password or hidden, display aggr options /* XXX Disabled until we have time to work on this if ( ( ! $this->password($k) && ! $this->hidden($k) ) && ( ( $this->col_is_number($k) ) && ( ! isset($this->fdd[$k]['values']) ) ) ) { $var_to_total = 'qf'.$k.'_aggr'; global $$var_to_total; $aggr_function = $$var_to_total; if (isset($$var_to_total)) { $vars_to_total[] = $this->fqn($k); $aggr_from_clause .= ' '.$aggr_function.'('. $this->fqn($k). ') as '.$var_to_total; } echo '
Aggr: '; echo $this->htmlSelect($var_to_total,$this->sql_aggrs,$$var_to_total); if ($$var_to_total != '') { $listall = true; } } else { echo ' '; } */ echo '
 
'. 'Clear'. 'Current Query: '. htmlspecialchars(stripslashes(stripslashes(stripslashes($text_query)))). "
'; if ($select_recs) { if ($this->actionStyle == 'button') { echo ''; } elseif ($this->actionStyle == 'graphic') { if ($this->view_enabled()) echo "page_name."$qviewStr\">url['images']."pme-view.gif\" height=15 width=16 border=none alt=\"".$this->labels['Display']."\"> "; if ($this->change_enabled()) echo "page_name."$qchangeStr\">url['images']."pme-change.gif\" height=15 width=16 border=none alt=\"".$this->labels['Change']."\"> "; if ($this->copy_enabled() ) echo "page_name."$qcopyStr\">url['images']."pme-copy.gif\" height=15 width=16 border=none alt=\"".$this->labels['Copy']."\"> "; if ($this->delete_enabled()) echo "page_name."$qdelStr\">url['images']."pme-delete.gif\" height=15 width=16 border=none alt=\"".$this->labels['Delete']."\"> "; } else { if ($this->view_enabled()) echo "page_name."$qviewStr\">V "; if ($this->change_enabled()) echo "page_name."$qchangeStr\">U "; if ($this->copy_enabled() ) echo "page_name."$qcopyStr\">C "; if ($this->delete_enabled()) echo "page_name."$qdelStr\">D "; } $first = false; } elseif ($this->filter_enabled()) { echo ' '; } echo ' 
 '; echo printArray($qp_aggr); echo printArray($vars_to_total); echo ''.$var_to_total.' '.$$var_to_total.''; $aggr_var = 'qf'.$k.'_aggr'; global $$aggr_var; if ($$aggr_var) { echo $this->sql_aggrs[$$aggr_var].': '.$tot_row[$aggr_var]; } else { echo ' '; } echo '
'."\n"; // end of table rows listing // note that \n \n"; if ($this->fm > 0) { echo ' '."\n"; } else { echo ' '."\n"; } if ($this->add_enabled ()) { echo ' '."\n"; } if ($this->actionStyle == 'button') { if ($this->view_enabled ()) { echo ' '."\n"; } if ($this->change_enabled ()) { echo ' '."\n"; } if ($this->copy_enabled ()) { echo ' '."\n"; } if ($this->delete_enabled ()) { echo ' '."\n"; } // if else } if ($eot == 0) { echo ' '."\n"; } else { echo ' '."\n"; } /* Display the current page and the total pages */ echo ' '."\n"; $total = 0; $count_parts['type'] = 'select'; $count_parts['select'] = 'count(*) as nbrecno'; $count_parts['from'] = $qparts['from']; $count_parts['where'] = $qparts['where']; $res = $this->myquery($this->query_make($count_parts),__LINE__); while ($row = mysql_fetch_row($res)) { $values[] = $row[0]; } $total = $values[0]; if ($listall) echo ' '."\n"; echo ' '."\n"; echo '
  '.$this->labels['Page'].': 1 of 1'."\n"; else echo '  '.$this->labels['Page'].': '.(($this->fm/$this->inc)+1).' of '.Ceil($total/abs($this->inc)).' '.$this->labels['Records'].': '.$total.'
'."\n"; echo ''."\n"; //phpinfo(); /* foreach ( Array( // '1999-12-31'=>'%Y-%m-%d', // '99-Mar-31'=>'%y-%M-%d', // '99-1-31'=>'%y-%n-%d' // 'March 8, 1999'=>'%F %j, %Y' // 'March 8, 1999 09:17:32'=>'%F %j, %Y %H:%i:%s' 'March 8, 1999 9:17:32'=>'%F %j, %Y %G:%i:%s' ) as $val=>$mask ) { echo "
\n"; debug_var('val,mask',"$val::$mask"); debug_var('mdate_parse',date('Y m d H:i:s',$this->mdate_parse($val,$mask))); } */ } /* }}} */ function display_record() /* {{{ */ { $this->create_javascripts(); echo ''."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; /* preserve the values of any filter fields qf0..qfn for Pass 3 */ for ($k = 0; $k < $this->num_fds; $k++) { $l = 'qf'.$k; global $$l; $lc = 'qf'.$k.'_comp'; global $$lc; $m = $this->web2plain($$l); $mc = $this->web2plain($$lc); if (isset ($m)) { if (is_array($m)) // multiple selection has been used { if (!in_array('*',$m)) { // one '*' in a multiple selection is all you need for ($n=0; $nplain2web($m[$n]) != '') { echo ' '."\n"; } } } } else { if ($this->plain2web($m) != '') { $this->qfn = $this->qfn.'&qf'.$k.'='.$m; echo ' '."\n"; } } } } echo ' '."\n"; if ($this->add_operation() or $this->more_operation() ) { $this->display_add_record (); } else { $this->display_copy_change_delete_record (); } echo '
'."\n"; echo '
'."\n"; if ($this->change_operation()) { echo ''."\n"; echo ''."\n"; } elseif ($this->add_operation() or $this->more_operation()) { echo ''."\n"; echo ''."\n"; echo ''."\n"; } elseif ($this->copy_operation()) { echo ''."\n"; echo ''."\n"; } elseif ($this->delete_operation()) { echo ''."\n"; echo ''."\n"; } elseif ($this->view_operation()) { if ($this->change_enabled()) { echo ''."\n"; } echo ''."\n"; } echo ''."\n"; } /* }}} */ /* * Action functions */ function do_add_record() /* {{{ */ { global $REMOTE_USER, $REMOTE_ADDR; $tib = true; // check for a before-add trigger if (isset($this->triggers['insert']['before'])) { $tib = include($this->triggers['insert']['before']); } if ($tib) { // before trigger returned good status let's do the main operation $key_col_val = ''; $qry = ''; for ($k = 0; $k < $this->num_fds; $k++) { if ( $this->displayed($k) ) { $fd = $this->fds[$k]; if ($fd == $this->key) { $key_col_val = addslashes($this->encode($this->fdd[$k],$fn)); } if ($qry == '') { $qry = 'INSERT INTO '.$this->tb.' (`'.$fd.'`'; } else { $qry = $qry.',`'.$fd.'`'; } } } $tim = false; // do the main operation $val = ') VALUES ('; $vals = Array(); for ($k = 0; $k < $this->num_fds; $k++) { $type = $this->fdd[$k]['type']; if ( $this->displayed($k) ) { $fd = $this->fds[$k]; $fn = $this->get_http_post_var_by_name($fd); /* if ($this->col_is_date($k)) { //$vals[$k] = '"'.$this->mdate_set($this->mdate_getFromPost($k),$type,$this->fds[$k]['type']).'"'; if ($type == 'time') $vals[$k] = 'date_format(from_unixtime('.$this->mdate_getFromPost($k).'),"%H%i%s")'; elseif ($type == 'year') $vals[$k] = 'date_format(from_unixtime('.$this->mdate_getFromPost($k).'),"%Y")'; else $vals[$k] = 'from_unixtime('.$this->mdate_getFromPost($k).')'; } else // continued on next line */ if ($this->col_is_set($k) && $fn != '') { $vals[$k] = "'".addslashes($this->encode($this->fdd[$k],join(',',$fn)))."'"; } else { $vals[$k] = "'".addslashes($this->encode($this->fdd[$k],$fn))."'"; } } } $qry = $qry.$val.join(',',$vals).')'; $res = $this->myquery($qry,__LINE__); if ($res) { $tim = true; } echo '
'.mysql_affected_rows().' '.$this->labels['record added'].'
'."\n"; } if ( $tib && isset($this->triggers['insert']['after']) && $tim ) { // before executed ok // main op executed ok // let's do the after trigger $tia = include($this->triggers['insert']['after']); } // notify list $kv = Array(); if (($this->notify['insert'])) { $user = $REMOTE_USER; if (! $user) $user = $REMOTE_ADDR; $body = 'A new item was added to '.$this->page_name." by ".$user." with the following fields:\n"; for ($k=0;$k<$this->num_fds;$k++) { if ( $this->displayed($k) ) { $body .= $this->fdd[$k]['name'].': '.$vals[$k]."\n"; $kv[$this->fds[$k]] = $vals[$k]; } } // mail it mail($this->notify['insert'],'Record Added to '.$this->tb,$body); } // note change in log table if ($this->logtable) { $this->myquery( "insert into ".$this->logtable." values (". "now(),". "'".$REMOTE_USER."',". "'".$REMOTE_ADDR."',". "'insert','". $this->tb."',". "'".$key_col_val."','','','". addslashes(serialize($kv))."')" ,__LINE__); } } /* }}} */ function do_change_record() /* {{{ */ { global $REMOTE_USER, $REMOTE_ADDR; $tub = true; // check for a before-add trigger if (isset($this->triggers['update']['before'])) { $tub = include($this->triggers['update']['before']); } $tum = false; if ($tub) { // before trigger returned good status // let's do the main operation $qry = ''; $qry_old_rec = ''; for ($k = 0; $k < $this->num_fds; $k++) { $type = $this->fdd[$k]['type']; if ($this->displayed($k) && ! $this->readonly($k)) { $fd = $this->fds[$k]; if ($fd == $this->key) { $key_col_val = addslashes($this->get_http_post_var_by_name($fd)); } $fn = $this->get_http_post_var_by_name($fd); /* if ($this->col_is_date($k)) { $fn = date(str_replace('%','',$this->mdate_masks[$type]),$this->mdate_getFromPost($k)); } */ if ($this->col_is_set($k) && $fn != '') { $newValue = addslashes($this->encode($this->fdd[$k],join(',',$fn))); } else { $newValue = addslashes($this->encode($this->fdd[$k],$fn)); } if ($qry == '') { $qry = 'UPDATE '.$this->tb.' SET `'.$fd.'`=\''.$newValue.'\''; $qry_old_rec = 'SELECT `'.$fd.'`'; } else { $qry = $qry.',`'.$fd.'`=\''.$newValue.'\''; $qry_old_rec .= ',`'.$fd.'`'; } $newvalues[$this->fds[$k]] = addslashes($fn); } elseif ($this->hidden($k)) { // XXX do something } } $qry = $qry.' WHERE ('.$this->key.' = '.$this->key_delim.$this->rec.$this->key_delim.')'; $qry_old_rec .= ' FROM '.$this->tb.' WHERE ('.$this->key.' = '.$this->key_delim.$this->rec.$this->key_delim.')'; // get the old data $res_old = $this->myquery($qry_old_rec,__LINE__); $oldvalues = mysql_fetch_array($res_old); // update the data //echo "\n

$qry

\n"; $res = $this->myquery($qry,__LINE__); // find and accumulate the changes $changes=Array(); for ($k = 0; $k < $this->num_fds; $k++) { if ($this->displayed($k)) { if ($oldvalues[$this->fds[$k]] != stripslashes($newvalues[$this->fds[$k]])) { $changes[$this->fds[$k]] = Array(); $changes[$this->fds[$k]]['was'] = $oldvalues[$this->fds[$k]]; $changes[$this->fds[$k]]['is' ] = $newvalues[$this->fds[$k]]; } } } if ($res) { $tum = true; } /* echo '

Was:

'."\n"; echo '
';
print_r($oldvalues);
echo '
'."\n"; echo '

Is:

'."\n"; echo '
';
print_r($newvalues);
echo '
'."\n"; echo '

Changes to be sent in e-mail:

'."\n"; echo '
';
print_r($changes);
echo '
'."\n"; echo '
'.mysql_affected_rows ().' '.$this->labels['Change'].'
'."\n"; */ } if ( $tub && isset($this->triggers['update']['after']) && $tum ) { // before executed ok // main op executed ok // let's do the after trigger $tua = include($this->triggers['update']['after']); } // notify list if (($this->notify['update'])) { if (count($changes) > 0) { $user = $REMOTE_USER; if (! $user) $user = $REMOTE_ADDR; $body = 'An item with ' .$this->fdd[$this->key]['name'] .'=' .$this->key_delim.$this->rec.$this->key_delim .' was updated by '.$user.' in '.$this->page_name." with the following fields:\n"; foreach ($changes as $key=>$vals) { if ( $this->displayed($k) ) { $fieldName = $this->fdd[$key]['name']; $body .= $fieldName.":\n". "was:\t\"".$vals['was']."\"\n". "is:\t\"".$vals['is']."\"\n"; } } // mail it mail($this->notify['update'],'Record Updated in '.$this->tb,$body); } } // note change in log table if ($this->logtable) { foreach ($changes as $key=>$vals) { $qry = "insert into ".$this->logtable." values (". "now(),'".$REMOTE_USER."','".$REMOTE_ADDR."','update','". $this->tb."','".$key_col_val."','".$key."','". addslashes($vals['was'])."','". addslashes($vals['is'])."')"; $this->myquery($qry,__LINE__); } } } /* }}} */ function do_delete_record() /* {{{ */ { global $REMOTE_USER, $REMOTE_ADDR; $tdb = true; // check for a before-add trigger if (isset($this->triggers['delete']['before'])) { $tdb = include($this->triggers['delete']['before']); } $tdm = false; // before trigger returned good status // let's do the main operation if ($tdb) { // before trigger returned good status // let's do the main operation for ($k = 0; $k < $this->num_fds; $k++) { if ( $this->displayed($k) ) { $fd = $this->fds[$k]; if ($fd == $this->key) { $key_col_val = addslashes($this->encode($this->fdd[$k],$fn)); } } } if ($this->logtable) { $res = $this->myquery( 'select * from '.$this->tb.' where (`'.$this->key.'` = '.$this->key_delim.$this->rec.$this->key_delim.')' ,__LINE__); $oldrow = mysql_fetch_array($res); } $qry = 'DELETE FROM '.$this->tb.' WHERE (`'.$this->key.'` = '.$this->key_delim.$this->rec.$this->key_delim.')'; $res = $this->myquery($qry,__LINE__); if ($res) { $tdm = true; } echo '
'.mysql_affected_rows ().' '.$this->labels['record deleted'].'
'."\n"; } if ( $tdb && isset($this->triggers['delete']['after']) && $tdm ) { // before executed ok // main op executed ok // let's do the after trigger $tda = include($this->triggers['delete']['after']); } // notify list if (($this->notify['delete'])) { $user = $REMOTE_USER; if (! $user) $user = $REMOTE_ADDR; $body = 'An item was deleted by '.$user.' from '.$this->page_name."\n"; foreach ($oldrow as $key=>$val) { if (is_string($key)) { $body .= $this->fdd[$key]['name'].":\t".$val."\n"; } } // mail it mail($this->notify['delete'],'Record Deleted in '.$this->tb,$body); } // note change in log table if ($this->logtable) { $this->myquery( "INSERT INTO ".$this->logtable." VALUES (". "SYSDATE(),". "'".$REMOTE_USER."',". "'".$REMOTE_ADDR."',". "'delete','". $this->tb."',". "'".$key_col_val."',". "'".$key."','". addslashes(serialize($oldrow))."','')" ,__LINE__); } } /* }}} */ /* * The workhorse */ function execute() /* {{{ */ { set_magic_quotes_runtime(0); // let's do explicit quoting ... it's safer // XXX fix this to use col_is_[type] if (in_array($this->key_type,Array('string','blob','date','time','datetime','timestamp','year'))) { $this->key_delim = '"'; } else { $this->key_delim = ''; } $this->gather_query_opts(); $this->gather_get_vars(); $this->gather_post_vars(); $this->unify_opts(); // debug code - uncomment to enable // phpinfo(); // $this->print_get_vars(); // $this->print_post_vars(); // $this->print_vars(); // echo "
query opts:\n";
//  echo print_r($this->query_opts);
//  echo "
\n"; // echo "
get vars:\n";
//  echo print_r($this->get_opts);
//  echo "
\n"; if (!isset ($this->db)) { die("

phpMyEdit: no database defined

\n\n\n"); } if (!isset ($this->tb)) { die ("

phpMyEdit: no table defined

\n\n\n"); } $dbl = @mysql_pconnect($this->hn, $this->un, $this->pw) or die("

phpMyEdit: could not connect to MySQL

\n\n\n"); /* * ====================================================================== * Pass 3: process any updates generated if the user has selected * a save button during Pass 2 * ====================================================================== */ $listit = true; if ($this->saveadd == $this->labels['Save']) { $this->do_add_record(); $listit = false; } if ($this->moreadd == $this->labels['More']) { $this->do_add_record(); } if ($this->savechange == $this->labels['Save']) { $this->do_change_record(); $listit = false; } if ($this->savedelete == $this->labels['Delete']) { $this->do_delete_record(); $listit = false; } /* * ====================================================================== * Pass 2: display an input/edit/confirmation screen if the user has * selected an editing button on Pass 1 through this page * ====================================================================== */ if ( ($this->add_operation() or $this->more_operation() or $this->change_operation() or $this->delete_operation() or $this->display_operation() or $this->view_operation() or $this->copy_operation()) and ($listit) ) { $this->display_record(); } /* * ====================================================================== * Pass 1 and Pass 3: display the MySQL table in a scrolling window on * the screen (skip this step in 'Add More' mode) * ====================================================================== */ else { $this->list_table(); } //phpinfo(); global $timer; if ($timer) { echo $timer->end(); } } /* }}} */ /* * Class constructor */ function phpMyEdit($opts) /* {{{ */ { /* * Instance class variables */ $this->hn = $opts['hn']; $this->hn = $opts['hn']; $this->un = $opts['un']; $this->pw = $opts['pw']; $this->db = $opts['db']; $this->tb = $opts['tb']; $this->key = $opts['key']; $this->key_type = $opts['key_type']; $this->inc = $opts['inc']; $this->options = $opts['options']; $this->multiple = $opts['multiple']; if (!isset($this->multiple)) $this->multiple=2; $this->display_sort = $opts['display_sort']; $this->display_query = $opts['display_query']; $this->fdd = $opts['fdd']; if ($opts['language']) { $this->labels = $this->make_language_labels($opts['language']); } else { global $HTTP_POST_VARS; $this->labels = $this->make_language_labels($HTTP_POST_VARS['HTTP_ACCEPT_LANGUAGE']); } $this->filters = $opts['filters']; $this->default_sort_columns = $opts['default_sort_columns']; $this->triggers = $opts['triggers']; $this->logtable = $opts['logtable']; $this->page_name = $this->tb; if ($opts['page_name']) $this->page_name = $opts['page_name']; // alternate row background colors if (isset($opts['bgcolorOdd'])) $this->bgcolorOdd = 'White'; else $this->bgcolorOdd = $opts['bgcolorOdd']; if (isset($opts['bgColorEven'])) $this->bgcolorEven = 'Silver'; else $this->bgcolorEven = $opts['bgcolorEven']; // e-mail notification if (isset($opts['notify'])) { $this->notify = $opts['notify']; } // whether to display 'Add', 'Update', 'Delete' buttons or to put // hyperlinks next to the rows $this->actionStyle = 'button'; if (isset($opts['actionStyle']) && $opts['actionStyle'] == 'link') { $this->actionStyle = 'link'; } elseif (isset($opts['actionStyle']) && $opts['actionStyle'] == 'graphic') { $this->actionStyle = 'graphic'; } /* * Find the URL to post forms */ global $HTTP_SERVER_VARS; $this->page_name = basename($HTTP_SERVER_VARS["PHP_SELF"]); /* * form variables all around */ global $operation, $apply, $fl, $fm, $sfn, $qfn, $sw, $rec, $prev, $next; global $saveadd, $moreadd, $savechange, $savedelete; $this->operation = $operation; $this->apply = $apply; $this->fl = $fl; $this->fm = (int)$fm; $this->sort_asc = (substr ($sfn, 0, 1) != '-'); //debug_var('this->sort_asc',$this->sort_asc); //debug_var('sfn',$sfn); //debug_var('int sfn',(int)$sfn); //debug_var('abs int sfn',abs((int)$sfn)); if (isset($sfn)) $this->sfn = abs((int)$sfn); $this->qfn = (int)$qfn; $this->sw = $sw; $this->rec = $rec; $this->prev = $prev; $this->next = $next; $this->saveadd = $saveadd; $this->moreadd = $moreadd; $this->savechange = $savechange; $this->savedelete = $savedelete; /* * Extract SQL Field Names and number of fields */ $this->guidance = false; $field_num = 0; $num_fields_displayed = 0; foreach ($this->fdd as $akey => $aval) { $this->fds[] = $akey; if ($sfn == '' && $akey == $sort_field) { $this->sfn = $field_num; } if ($this->displayed($field_num)) $num_fields_displayed++; if (is_array($aval['values']) && (! $aval['values']['table'])) { $values = Array(); foreach ($aval['values'] as $val) { $values[$val]=$val; } $aval['values'] = $values; } $this->fdd[$field_num] = $aval; /* // prep for full text search if ($aval['type'] == 'string' || $aval['type'] == 'blob') { $this->string_fields[] = $akey; } */ if ($aval['help']) $this->guidance = true; $field_num++; } $this->num_fds = $field_num; $this->num_fields_displayed = $num_fields_displayed; $this->key_num = array_search($this->key,$this->fds); /* * Constants */ // code to use this is commented out $this->sql_aggrs = Array(''=>'','sum'=>'Total','avg'=>'Average','min'=>'Minimum','max'=>'Maximum','count'=>'Count'); // to support quick type checking $this->stringTypes = Array('string','blob','set','enum'); $this->numberTypes = Array('int','real'); $this->dateTypes = Array('date','datetime','timestamp','time','year'); // mdate constants $this->mdate_masks = Array( 'date'=>'%Y-%m-%d', 'datetime'=>'%Y-%m-%d %H:%i:%s', 'timestamp'=>'%Y%m%d%H%i%s', 'time'=>'%H:%i:%s', 'year'=>'%Y'); $this->mdate_daterange = range(date('Y')-10,date('Y')+10); $this->months_short = Array( '~~PME~~'=>0, 'Jan'=>1, 'Feb'=>2, 'Mar'=>3, 'Apr'=>4, 'May'=>5, 'Jun'=>6, 'Jul'=>7, 'Aug'=>8, 'Sep'=>9, 'Oct'=>10, 'Nov'=>11, 'Dec'=>12); $this->months_long = Array( '~~PME~~'=>0, 'January'=>1,'February'=>2,'March'=>3, 'April'=>4,'May'=>5,'June'=>6, 'July'=>7,'August'=>8,'September'=>9, 'October'=>10,'November'=>11,'December'=>12); $this->months_long_keys = array_keys($this->months_long); $this->dir = dirname(__FILE__) . (strlen(dirname(__FILE__)) > 0 ? '/' : ''); $this->url['images'] = 'images/'; // Call to Action // Moved this from the setup.php generated file to here $this->execute(); } /* }}} */ } // end of phpMyEdit class /* Modeline for ViM {{{ * vim:set ts=4: * vim600:fdm=marker fdl=0 fdc=0: * }}} */ ?>