Use charset aware substr and strlen functions (bugs #854755 and #910575).

This commit is contained in:
Michal Čihař
2004-03-09 15:02:28 +00:00
parent 399318d264
commit 88dc344cdb
8 changed files with 71 additions and 25 deletions

View File

@@ -10,6 +10,11 @@ $Source$
conversion. conversion.
* libraries/dbi/mysql.dbi.lib.php, libraries/dbi/mysqli.dbi.lib.php: Fix * libraries/dbi/mysql.dbi.lib.php, libraries/dbi/mysqli.dbi.lib.php: Fix
PMA_mysql_fetch_array return value for last result (bug #905223). PMA_mysql_fetch_array return value for last result (bug #905223).
* browse_foreigners.php, libraries/common.lib.php,
libraries/display_tbl.lib.php, libraries/relation.lib.php,
libraries/sqlparser.lib.php, libraries/string.lib.php,
libraries/transformations/text_plain__substr.inc.php: Use charset aware
substr and strlen functions (bugs #854755 and #910575).
2004-03-05 Marc Delisle <lem9@users.sourceforge.net> 2004-03-05 Marc Delisle <lem9@users.sourceforge.net>
* libraries/sqlparser.lib.php: bug 909752, floating point digit * libraries/sqlparser.lib.php: bug 909752, floating point digit

View File

@@ -186,7 +186,7 @@ if (isset($disp_row) && is_array($disp_row)) {
$vtitle = ''; $vtitle = '';
} else { } else {
$vtitle = htmlspecialchars($val); $vtitle = htmlspecialchars($val);
$value = htmlspecialchars(substr($val, 0, $cfg['LimitChars']) . '...'); $value = htmlspecialchars(PMA_substr($val, 0, $cfg['LimitChars']) . '...');
} }
$key_equals_data = isset($data) && $key == $data; $key_equals_data = isset($data) && $key == $data;

View File

@@ -251,9 +251,7 @@ if ($is_minimum_common == FALSE) {
* Charset conversion. * Charset conversion.
*/ */
require_once('./libraries/charset_conversion.lib.php'); require_once('./libraries/charset_conversion.lib.php');
}
if ($is_minimum_common == FALSE) {
/** /**
* String handling * String handling
*/ */

View File

@@ -1362,8 +1362,8 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql)
$vertical_display['data'][$row_no][$i] = ' <td valign="top" ' . $column_style . ' bgcolor="' . $bgcolor . '"><i>NULL</i></td>' . "\n"; $vertical_display['data'][$row_no][$i] = ' <td valign="top" ' . $column_style . ' bgcolor="' . $bgcolor . '"><i>NULL</i></td>' . "\n";
} else if ($row[$pointer] != '') { } else if ($row[$pointer] != '') {
// garvin: if a transform function for blob is set, none of these replacements will be made // garvin: if a transform function for blob is set, none of these replacements will be made
if (strlen($row[$pointer]) > $GLOBALS['cfg']['LimitChars'] && ($dontlimitchars != 1)) { if (PMA_strlen($row[$pointer]) > $GLOBALS['cfg']['LimitChars'] && ($dontlimitchars != 1)) {
$row[$pointer] = substr($row[$pointer], 0, $GLOBALS['cfg']['LimitChars']) . '...'; $row[$pointer] = PMA_substr($row[$pointer], 0, $GLOBALS['cfg']['LimitChars']) . '...';
} }
// loic1: displays all space characters, 4 space // loic1: displays all space characters, 4 space
// characters for tabulations and <cr>/<lf> // characters for tabulations and <cr>/<lf>
@@ -1384,8 +1384,8 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql)
$relation_id = $row[$pointer]; $relation_id = $row[$pointer];
// nijel: Cut all fields to $cfg['LimitChars'] // nijel: Cut all fields to $cfg['LimitChars']
if (strlen($row[$pointer]) > $GLOBALS['cfg']['LimitChars'] && ($dontlimitchars != 1)) { if (PMA_strlen($row[$pointer]) > $GLOBALS['cfg']['LimitChars'] && ($dontlimitchars != 1)) {
$row[$pointer] = substr($row[$pointer], 0, $GLOBALS['cfg']['LimitChars']) . '...'; $row[$pointer] = PMA_substr($row[$pointer], 0, $GLOBALS['cfg']['LimitChars']) . '...';
} }
// loic1: displays special characters from binaries // loic1: displays special characters from binaries

View File

@@ -604,7 +604,7 @@ function PMA_foreignDropdown($disp, $foreign_field, $foreign_display, $data, $ma
foreach($disp AS $disp_key => $relrow) { foreach($disp AS $disp_key => $relrow) {
$key = $relrow[$foreign_field]; $key = $relrow[$foreign_field];
if (strlen($relrow[$foreign_display]) <= $cfg['LimitChars']) { if (PMA_strlen($relrow[$foreign_display]) <= $cfg['LimitChars']) {
$value = (($foreign_display != FALSE) ? htmlspecialchars($relrow[$foreign_display]) : ''); $value = (($foreign_display != FALSE) ? htmlspecialchars($relrow[$foreign_display]) : '');
$vtitle = ''; $vtitle = '';
} else { } else {

View File

@@ -211,7 +211,7 @@ if ($is_minimum_common == FALSE) {
$sql = str_replace("\r\n", "\n", $sql); $sql = str_replace("\r\n", "\n", $sql);
$sql = str_replace("\r", "\n", $sql); $sql = str_replace("\r", "\n", $sql);
$len = $GLOBALS['PMA_strlen']($sql); $len = PMA_strlen($sql);
if ($len == 0) { if ($len == 0) {
return array(); return array();
} }
@@ -288,7 +288,7 @@ if ($is_minimum_common == FALSE) {
break; break;
} // end switch } // end switch
$count2 = ($pos < $count2) ? $len : $pos; $count2 = ($pos < $count2) ? $len : $pos;
$str = $GLOBALS['PMA_substr']($sql, $count1, $count2 - $count1); $str = PMA_substr($sql, $count1, $count2 - $count1);
PMA_SQP_arrayAdd($sql_array, 'comment_' . $type, $str, $arraysize); PMA_SQP_arrayAdd($sql_array, 'comment_' . $type, $str, $arraysize);
continue; continue;
} // end if } // end if
@@ -348,7 +348,7 @@ if ($is_minimum_common == FALSE) {
default: default:
break; break;
} // end switch } // end switch
$data = $GLOBALS['PMA_substr']($sql, $count1, $count2 - $count1); $data = PMA_substr($sql, $count1, $count2 - $count1);
PMA_SQP_arrayAdd($sql_array, $type, $data, $arraysize); PMA_SQP_arrayAdd($sql_array, $type, $data, $arraysize);
continue; continue;
} }
@@ -387,7 +387,7 @@ if ($is_minimum_common == FALSE) {
if ($l == 1) { if ($l == 1) {
$punct_data = $c; $punct_data = $c;
} else { } else {
$punct_data = $GLOBALS['PMA_substr']($sql, $count1, $l); $punct_data = PMA_substr($sql, $count1, $l);
} }
// Special case, sometimes, althought two characters are // Special case, sometimes, althought two characters are
@@ -424,10 +424,10 @@ if ($is_minimum_common == FALSE) {
$punct_data = $first; $punct_data = $first;
} else if (($last2 == '/*') || ($last2 == '--')) { } else if (($last2 == '/*') || ($last2 == '--')) {
$count2 -= 2; $count2 -= 2;
$punct_data = $GLOBALS['PMA_substr']($sql, $count1, $count2 - $count1); $punct_data = PMA_substr($sql, $count1, $count2 - $count1);
} else if (($last == '-') || ($last == '+') || ($last == '!')) { } else if (($last == '-') || ($last == '+') || ($last == '!')) {
$count2--; $count2--;
$punct_data = $GLOBALS['PMA_substr']($sql, $count1, $count2 - $count1); $punct_data = PMA_substr($sql, $count1, $count2 - $count1);
// TODO: for negation operator, split in 2 tokens ? // TODO: for negation operator, split in 2 tokens ?
// "select x&~1 from t" // "select x&~1 from t"
// becomes "select x & ~ 1 from t" ? // becomes "select x & ~ 1 from t" ?
@@ -475,7 +475,7 @@ if ($is_minimum_common == FALSE) {
continue; continue;
} else { } else {
$debugstr = $GLOBALS['strSQPBugInvalidIdentifer'] . ' @ ' . ($count1+1) . "\n" $debugstr = $GLOBALS['strSQPBugInvalidIdentifer'] . ' @ ' . ($count1+1) . "\n"
. 'STR: ' . $GLOBALS['PMA_substr']($sql, $count1, $count2 - $count1); . 'STR: ' . PMA_substr($sql, $count1, $count2 - $count1);
PMA_SQP_throwError($debugstr, $sql); PMA_SQP_throwError($debugstr, $sql);
return $sql; return $sql;
} }
@@ -503,7 +503,7 @@ if ($is_minimum_common == FALSE) {
} // end while } // end while
$l = $count2 - $count1; $l = $count2 - $count1;
$str = $GLOBALS['PMA_substr']($sql, $count1, $l); $str = PMA_substr($sql, $count1, $l);
$type = ''; $type = '';
if ($is_digit) { if ($is_digit) {
@@ -532,7 +532,7 @@ if ($is_minimum_common == FALSE) {
$count2++; $count2++;
$debugstr = 'C1 C2 LEN: ' . $count1 . ' ' . $count2 . ' ' . $len . "\n" $debugstr = 'C1 C2 LEN: ' . $count1 . ' ' . $count2 . ' ' . $len . "\n"
. 'STR: ' . $GLOBALS['PMA_substr']($sql, $count1, $count2 - $count1) . "\n"; . 'STR: ' . PMA_substr($sql, $count1, $count2 - $count1) . "\n";
PMA_SQP_bug($debugstr, $sql); PMA_SQP_bug($debugstr, $sql);
return $sql; return $sql;
@@ -1567,7 +1567,7 @@ if ($is_minimum_common == FALSE) {
$i = $GLOBALS['PMA_strpos']($arr['type'], '_'); $i = $GLOBALS['PMA_strpos']($arr['type'], '_');
$class = ''; $class = '';
if ($i > 0) { if ($i > 0) {
$class = 'syntax_' . $GLOBALS['PMA_substr']($arr['type'], 0, $i) . ' '; $class = 'syntax_' . PMA_substr($arr['type'], 0, $i) . ' ';
} }
$class .= 'syntax_' . $arr['type']; $class .= 'syntax_' . $arr['type'];

View File

@@ -15,18 +15,61 @@
* The SQL Parser code relies heavily on these functions. * The SQL Parser code relies heavily on these functions.
*/ */
// This is for handling input better // This is for handling input better
if (defined('PMA_MULTIBYTE_ENCODING')) { if (defined('PMA_MULTIBYTE_ENCODING')) {
$GLOBALS['PMA_strlen'] = 'mb_strlen';
$GLOBALS['PMA_strpos'] = 'mb_strpos'; $GLOBALS['PMA_strpos'] = 'mb_strpos';
$GLOBALS['PMA_strrpos'] = 'mb_strrpos'; $GLOBALS['PMA_strrpos'] = 'mb_strrpos';
$GLOBALS['PMA_substr'] = 'mb_substr';
} else { } else {
$GLOBALS['PMA_strlen'] = 'strlen';
$GLOBALS['PMA_strpos'] = 'strpos'; $GLOBALS['PMA_strpos'] = 'strpos';
$GLOBALS['PMA_strrpos'] = 'strrpos'; $GLOBALS['PMA_strrpos'] = 'strrpos';
$GLOBALS['PMA_substr'] = 'substr'; }
$GLOBALS['PMA_has_mbstr'] = @function_exists('mb_strlen');
/**
* Returns length of string depending on current charset.
*
* @param string string to count
*
* @return int string length
*
* @access public
*
* @author nijel
*/
function PMA_strlen($string)
{
if (defined('PMA_MULTIBYTE_ENCODING')) {
return mb_strlen($string);
} elseif($GLOBALS['PMA_has_mbstr']) {
return mb_strlen($string, $GLOBALS['charset']);
} else {
return strlen($string);
}
}
/**
* Returns substring from string, works depending on current charset.
*
* @param string string to count
* @param int start of substring
* @param int length of substring
*
* @return int string length
*
* @access public
*
* @author nijel
*/
function PMA_substr($string, $start, $length = 2147483647)
{
if (defined('PMA_MULTIBYTE_ENCODING')) {
return mb_substr($string, $start, $length);
} elseif($GLOBALS['PMA_has_mbstr']) {
return mb_substr($string, $start, $length, $GLOBALS['charset']);
} else {
return substr($string, $start, $length);
}
} }

View File

@@ -21,9 +21,9 @@ function PMA_transformation_text_plain__substr($buffer, $options = array(), $met
$newtext = ''; $newtext = '';
if ($options[1] != 'all') { if ($options[1] != 'all') {
$newtext = substr($buffer, $options[0], $options[1]); $newtext = PMA_substr($buffer, $options[0], $options[1]);
} else { } else {
$newtext = substr($buffer, $options[0]); $newtext = PMA_substr($buffer, $options[0]);
} }
$length = strlen($newtext); $length = strlen($newtext);