I have put together a database and using a tool called PHPmyEdit have put together a simple front end that will query a single MySQL table. My problem is, the search function is broken in all versions of IE, works just fine in Opera, Chrome, and Firefox. I have been searching for hours to an answer to my problem, and have found none. I am not a professional coder by any means, just a geek who likes to tinker, and can often figure things out on his own after some trial and error and research. I am having fun learning about PHP and SQL, however I am at my wit's end here, and am really hoping that the community here holds the key to my problems.
Here are the symptoms, when calling the Search function in IE, it will come up, however executing a search causes the entry fields to disappear and the search most often fails. If I try to bring them back up, they do not appear unless I wait for 45 seconds or so, then I can get them to come back. I can still sort by varying fields, but the search function is completely broken in IE. Let me post the code I'm using, perhaps someone here can point me in the right direction.
Here is the main page:
Code: Select all
</style>
</head>
<body>
<h3>Header</h3>
<?php
// MySQL host name, user name, password, database, and table
$opts['hn'] = 'localhost';
$opts['un'] = 'user';
$opts['pw'] = 'password';
$opts['db'] = 'mydatabase';
$opts['tb'] = 'mytable';
// Name of field which is the unique key
$opts['key'] = 'primarykey';
// Type of key field (int/real/string/date etc.)
$opts['key_type'] = 'string';
// Sorting field(s)
$opts['sort_field'] = array('primarykey');
// Number of records to display on the screen
// Value of -1 lists all records in a table
$opts['inc'] = 15;
// Options you wish to give the users
// A - add, C - change, P - copy, V - view, D - delete,
// F - filter, I - initial sort suppressed
$opts['options'] = 'F';
// Number of lines to display on multiple selection filters
$opts['multiple'] = '4';
// Navigation style: B - buttons (default), T - text links, G - graphic links
// Buttons position: U - up, D - down (default)
$opts['navigation'] = 'TD';
// Display special page elements
$opts['display'] = array(
'form' => true,
'query' => false,
'sort' => false,
'time' => true,
'tabs' => false,
);
// Set default prefixes for variables
$opts['js']['prefix'] = 'PME_js_';
$opts['dhtml']['prefix'] = 'PME_dhtml_';
$opts['cgi']['prefix']['operation'] = 'PME_op_';
$opts['cgi']['prefix']['sys'] = 'PME_sys_';
$opts['cgi']['prefix']['data'] = 'PME_data_';
/* Get the user's default language and use it if possible or you can
specify particular one you want to use. Refer to official documentation
for list of available languages. */
$opts['language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'] . 'Unicode';
/* Table-level filter capability. If set, it is included in the WHERE clause
of any generated SELECT statement in SQL query. This gives you ability to
work only with subset of data from table.
$opts['filters'] = "column1 like '%11%' AND column2<17";
$opts['filters'] = "section_id = 9";
$opts['filters'] = "PMEtable0.sessions_count > 200";
*/
/* Field definitions
Fields will be displayed left to right on the screen in the order in which they
appear in generated list. Here are some most used field options documented.
['name'] is the title used for column headings, etc.;
['maxlen'] maximum length to display add/edit/search input boxes
['trimlen'] maximum length of string content to display in row listing
['width'] is an optional display width specification for the column
e.g. ['width'] = '100px';
['mask'] a string that is used by sprintf() to format field output
['sort'] true or false; means the users may sort the display on this column
['strip_tags'] true or false; whether to strip tags from content
['nowrap'] true or false; whether this field should get a NOWRAP
['select'] T - text, N - numeric, D - drop-down, M - multiple selection
['options'] optional parameter to control whether a field is displayed
L - list, F - filter, A - add, C - change, P - copy, D - delete, V - view
Another flags are:
R - indicates that a field is read only
W - indicates that a field is a password field
H - indicates that a field is to be hidden and marked as hidden
['URL'] is used to make a field 'clickable' in the display
e.g.: 'mailto:$value', 'http://$value' or '$page?stuff';
['URLtarget'] HTML target link specification (for example: _blank)
['textarea']['rows'] and/or ['textarea']['cols']
specifies a textarea is to be used to give multi-line input
e.g. ['textarea']['rows'] = 5; ['textarea']['cols'] = 10
['values'] restricts user input to the specified constants,
e.g. ['values'] = array('A','B','C') or ['values'] = range(1,99)
['values']['table'] and ['values']['column'] restricts user input
to the values found in the specified column of another table
['values']['description'] = 'desc_column'
The optional ['values']['description'] field allows the value(s) displayed
to the user to be different to those in the ['values']['column'] field.
This is useful for giving more meaning to column values. Multiple
descriptions fields are also possible. Check documentation for this.
*/
$opts['fdd']['value1'] = array(
'name' => 'value1',
'select' => 'T',
'options' => 'AVCPDR', // auto increment
'maxlen' => 11,
'default' => '0',
'sort' => true
);
$opts['fdd']['value2'] = array(
'name' => 'value2',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['value3'] = array(
'name' => 'value3,
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['value4] = array(
'name' => 'value4,
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['value5'] = array(
'name' => 'value5',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
$opts['fdd']['value6] = array(
'name' => 'value6',
'select' => 'T',
'maxlen' => 255,
'sort' => true
);
// Now important call to phpMyEdit
require_once 'extensions/phpMyEdit-report.class.php';
new phpMyEdit($opts);
?>
</body>
</html>Code: Select all
<?php
require_once dirname(__FILE__).'/../phpMyEdit.class.php';
class phpMyEdit_report extends phpMyEdit
{
function phpMyEdit_report($opts) /* {{{ */
{
$opts['options'] = 'L';
$execute = 1;
isset($opts['execute']) && $execute = $opts['execute'];
$opts['execute'] = 0;
parent::phpMyEdit($opts);
$execute && $this->execute();
} /* }}} */
function make_language_labels($language) /* {{{ */
{
$ret = parent::make_language_labels($language);
strlen($ret['Make report']) <= 0 && $ret['Make report'] = 'Make report';
strlen($ret['Select fields']) <= 0 && $ret['Select fields'] = 'Select fields';
strlen($ret['Records per screen']) <= 0 && $ret['Records per screen'] = 'Records per screen';
return $ret;
} /* }}} */
function get_cgi_cookie_var($name, $default_value = null) /* {{{ */
{
$ret = $this->get_cgi_var($name, null);
if ($ret === null) {
global $HTTP_COOKIE_VARS;
$ret = @$HTTP_COOKIE_VARS[$name.'_'.$this->tb.'_cookie'];
if (! isset($ret)) {
$ret = $default_value;
}
}
return $ret;
} /* }}} */
function display_list_table_buttons($total_recs, $position) /* {{{ */
{ /* This is mostly copy/paste from core class. */
$listall = $this->inc <= 0; // Are we doing a listall?
echo '<table class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
echo '<input class="',$this->getCSSclass('fields-select', $position);
echo '" type="submit" name="fields_select" value="',$this->labels['Select fields'],'"> ';
// Note that <input disabled isn't valid HTML, but most browsers support it
$disabled = ($this->fm > 0 && ! $listall) ? '' : ' disabled';
echo '<input',$disabled,' class="',$this->getCSSclass('prev', $position);
echo '" type="submit" name="',ltrim($disabled),'prev" value="',$this->labels['Prev'],'"> ';
$disabled = ($this->fm + $this->inc < $total_recs && ! $listall) ? '' : ' disabled';
echo '<input',$disabled,' class="',$this->getCSSclass('next', $position);
echo '" type="submit" name="',ltrim($disabled),'next" value="',$this->labels['Next'],'">';
// Message is now written here
echo '</td>',"\n";
if (strlen(@$this->message) > 0) {
echo '<td class="',$this->getCSSclass('message', $position),'">',$this->message,'</td>',"\n";
}
// Display page and records statistics
echo '<td class="',$this->getCSSclass('stats', $position),'">',"\n";
if ($listall) {
echo $this->labels['Page'],': 1 ',$this->labels['of'],' 1';
} else {
echo $this->labels['Page'],': ',($this->fm / $this->inc) + 1;
echo ' ',$this->labels['of'],' ',max(1, ceil($total_recs / abs($this->inc)));
}
echo ' ',$this->labels['Records'],': ',$total_recs;
echo '</td></tr></table>',"\n";
} /* }}} */
function display_report_selection_buttons($position) /* {{{ */
{
echo '<table class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<tr class="',$this->getCSSclass('navigation', $position),'">',"\n";
echo '<td class="',$this->getCSSclass('buttons', $position),'">',"\n";
echo '<input class="',$this->getCSSclass('make-report', $position);
echo '" type="submit" name="prepare_filter" value="',$this->labels['Make report'],'">',"\n";
echo '</td></tr></table>',"\n";
} /* }}} */
function get_select_fields_link() /* {{{ */
{
$link = '<a href="'.htmlspecialchars($this->page_name).'?fields_select=1';
for ($i = 0; $i < count($table_cols); $i++) {
$varname = 'qf'.$i;
$value = $this->get_cgi_cookie_var($varname);
if (! empty($value)) {
$link .= htmlspecialchars(
'&'.rawurlencode($varname).
'='.rawurlencode($value));
}
}
$link .= htmlspecialchars($this->cgi['persist']);
$link .= '">'.$this->labels['Select fields'].'</a>';
return $link;
} /* }}} */
function execute() /* {{{ */
{
global $HTTP_GET_VARS;
global $HTTP_POST_VARS;
/*
* Extracting field names
*/
$table_cols = array();
$all_table_cols = array();
if ($this->connect() == false) {
return false;
}
$query_parts = array(
'type' => 'select',
'select' => '*',
'from' => $this->tb,
'limit' => '1');
$result = $this->myquery($this->get_SQL_query($query_parts), __LINE__);
$all_table_cols = array_keys(@mysql_fetch_array($result, MYSQL_ASSOC));
if (count($all_table_cols) <= 0) {
$this->error('database fetch error');
return false;
}
foreach (array_keys($this->fdd) as $field_name) {
if (preg_match('/^\d*$/', $field_name))
continue;
if (($idx = array_search($field_name, $all_table_cols)) !== false)
$table_cols[$field_name] = mysql_field_len($result, $idx);
}
@mysql_free_result($result);
unset($all_table_cols);
/*
* Preparing variables
*/
$fields_select = $this->get_cgi_var('fields_select');
$filter = $this->get_cgi_var('filter');
$prepare_filter = $this->get_cgi_var('prepare_filter');
$this->inc = intval($this->get_cgi_cookie_var('inc'));
$force_select = true;
$none_displayed = true;
$expire_time = time() + (3600 * 24 * 30 * 12 * 5); // five years
$headers_sent = @headers_sent();
foreach (array_merge(array('@inc'), array_keys($table_cols)) as $col) {
$varname = ($col[0] == '@' ? substr($col, 1) : 'have_'.$col);
if (isset($HTTP_POST_VARS[$varname]) || isset($HTTP_GET_VARS[$varname])) {
$value = $HTTP_POST_VARS[$varname];
if (isset($HTTP_GET_VARS[$varname])) {
$value = $HTTP_GET_VARS[$varname];
}
if ($varname != 'inc' && ! empty($value)) {
$force_select = false;
}
$headers_sent || setcookie($varname.'_'.$this->tb.'_cookie', $value, $expire_time);
$this->cgi['persist'] .= '&'.urlencode($varname);
$this->cgi['persist'] .= '='.urlencode($value);
} else {
$headers_sent || setcookie($varname.'_'.$this->tb.'_cookie', '', time() - 10000);
}
}
$i = -1;
foreach (array_keys($this->fdd) as $key) {
$i++;
if (preg_match('/^\d*$/', $key))
continue;
$varname = 'have_'.$key;
$value = @$this->get_cgi_cookie_var($varname, '');
$options = @$value ? 'LV' : '';
$this->fdd[$i]['options'] = $options;
$this->fdd[$key]['options'] = $options;
$this->displayed[$i] = @$value ? true : false;
$value && $none_displayed = false;
}
/*
* Redirecting when neccessary
* (hackity hack with unregistering/unchecking fields)
*/
if ($prepare_filter && ! $headers_sent) {
$this->execute_redirect();
exit;
}
/*
* Check if field selection report screen has to be displayed
*/
if (isset($fields_select) || $force_select || $none_displayed) {
$this->execute_report_screen($table_cols);
return true;
}
if (0) {
$this->message .= $this->get_select_fields_link();
}
// parent class call
return parent::execute();
} /* }}} */
function execute_redirect() /* {{{ */
{
global $HTTP_SERVER_VARS;
global $HTTP_GET_VARS;
global $HTTP_POST_VARS;
$redirect_url = 'http://'.$HTTP_SERVER_VARS['HTTP_HOST'].$HTTP_SERVER_VARS['SCRIPT_NAME'];
$delim = '?';
foreach ($HTTP_POST_VARS + $HTTP_GET_VARS as $cgi_var_name => $cgi_var_value) {
$cgi_var_name == 'prepare_filter' && $cgi_var_name = 'filter';
$redirect_url .= $delim;
$redirect_url .= rawurlencode($cgi_var_name).'='.rawurlencode($cgi_var_value);
$delim == '?' && $delim = '&';
}
$redirect_url .= $this->cgi['persist'];
header('Location: '.$redirect_url);
exit;
} /* }}} */
function execute_report_screen($table_cols) /* {{{ */
{
echo '<form class="',$this->getCSSclass('form'),'" action="';
echo htmlspecialchars($this->page_name),'" method="POST">',"\n";
if ($this->nav_up()) {
$this->display_report_selection_buttons('up');
echo '<hr class="',$this->getCSSclass('hr', 'up'),'">',"\n";
}
echo '<table class="',$this->getCSSclass('main'),'" summary="',$this->tb,'">',"\n";
$i = 0;
foreach ($table_cols as $key => $val) {
$css_postfix = @$this->fdd[$key]['css']['postfix'];
$css_class_name = $this->getCSSclass('input', null, true, $css_postfix);
$varname = 'have_'.$key;
$value = $this->get_cgi_cookie_var($varname);
$checked = @$value ? ' checked' : '';
echo '<tr class="',$this->getCSSclass('row', null, 'next', $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'">';
echo $this->fdd[$i]['name'],'</td>',"\n";
echo '<td class="',$this->getCSSclass('check', null, true, $css_postfix),'">';
echo '<input class="',$css_class_name,'" type="checkbox" name="';
echo htmlspecialchars($varname),'"',$checked,'>';
echo '</td>',"\n";
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'"';
echo $this->getColAttributes($key),">\n";
$varname = 'qf'.$i;
$value = $this->get_cgi_cookie_var($varname);
if ($this->fdd[$key]['select'] == 'D' || $this->fdd[$key]['select'] == 'M') {
$from_table = ! $this->col_has_values($key) || isset($this->fdd[$key]['values']['table']);
$selected = $value;
$value = $this->set_values($key, array('*' => '*'), null, $from_table);
$multiple = $this->col_has_multiple_select($key);
$multiple |= $this->fdd[$key]['select'] == 'M';
$readonly = false;
$strip_tags = true;
$escape = true;
echo $this->htmlSelect($varname.'_id', $css_class_name, $value, $selected,
$multiple, $readonly, $strip_tags, $escape);
} else {
echo '<input class="',$css_class_name,'" type=text name="';
echo htmlspecialchars($varname),'" value="',htmlspecialchars($value),'" size="';
echo min(40, $val),'" maxlength="',min(40, max(10, $val)),'">';
}
echo '</td>',"\n",'</tr>',"\n";
$i++;
}
echo '<tr class="',$this->getCSSclass('row', null, 'next', $css_postfix),'">',"\n";
echo '<td class="',$this->getCSSclass('key', null, true, $css_postfix),'" colspan="2">';
echo $this->labels['Records per screen'],'</td>';
echo '<td class="',$this->getCSSclass('value', null, true, $css_postfix),'">';
echo '<input class="',$css_class_name,'" type="text" name="inc" value="',$this->inc.'">';
echo '</td></tr>',"\n";
echo '</table>',"\n";
if ($this->nav_down()) {
echo '<hr class="',$this->getCSSclass('hr', 'down'),'">',"\n";
$this->display_report_selection_buttons('down');
}
echo '</form>';
} /* }}} */
}
/* Modeline for ViM {{{
* vim:set ts=4:
* vim600:fdm=marker fdl=0 fdc=0:
* }}} */
?>
Thanks in advance!