0

有人可以告诉我如何将这个函数重写为 MySQL 函数以便能够直接在 MySQL 上进行解码吗?

const CHAR_MAP = 'abcdefghijklmnopqrstuvwxz0123456789';

function decode($encoded) {
    $elen = strlen($encoded);
    $cmlen = strlen(Mobile::CHAR_MAP);
    $offset = strpos(Mobile::CHAR_MAP, substr($encoded, 0, 1), 1);

    $decoded = '';
    $check = 0;
    for ($i=1;$i<$elen-1;$i++) {
        $a = strpos(Mobile::CHAR_MAP, substr($encoded, $i, 1), 1);
        $x = $a - $offset * $i;

        $x %= $cmlen;

        if ($x < 0) {
            $x = $cmlen + $x;
        }

        $decoded .= $x;

        $check += $x;

    }


    return $decoded;

}
4

1 回答 1

2

好吧,根据我更好的判断,我已经为您编写了一个快速 SQL 函数。

我应该注意到,SO 并不是一个人们为你写完整答案的网站,而是你学习如何为自己写答案的地方。但是,在这种情况下,如果不给出答案,我就看不到如何教学,所以就在这里。

但请注意:我根本没有测试过这个。我直接将它输入到 SO 答案框中,它并没有靠近实际的 mySQL 服务器。如果它不起作用(很有可能),请在寻求任何进一步的帮助之前尝试自己修复它(并将其视为帮助您了解它如何工作的答案的一部分)。

另请注意,我假设我在评论中关于您的原始 PHP 函数存在错误的猜测是准确的。该 SQL 函数对字符串进行字符移位操作;它不会输出一串无用的数字。

delimiter ||
DROP FUNCTION IF EXISTS mydecode||
CREATE FUNCTION mydecode( x longtext) RETURNS longtext
LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA 
BEGIN
DECLARE len INT UNSIGNED;
DECLARE cpos INT UNSIGNED;
DECLARE output LONGTEXT;
DECLARE charmap LONGTEXT;
DECLARE cshift VARCHAR(1);
DECLARE thischar VARCHAR(1);
DECLARE thischarpos INT UNSIGNED;

SET charmap = 'abcdefghijklmnopqrstuvwxz0123456789abcdefghijklmnopqrstuvwxz0123456789';
SET len = LENGTH(x);
SET cpos = 1;
SET cshift = POSITION(SUBSTRING(x,len,1) IN charmap);

REPEAT
  SET thischar = SUBSTRING(x,cpos,1);
  SET thischarpos = POSITION(thischar IN charmap) + 35;
  SET output = CONCAT_WS(output,SUBSTRING(charmap,thischarpos-cshift,1));
  SET cpos = cpos + 1;
  UNTIL cpos >= len END REPEAT;
return output;
END;
||

我将重申我在评论中关于这是一个微不足道的操作的另一点。像这样简单的字符移位操作真的没用。没有任何场景我能想到它们是一个好主意。特别不安全。

如果这个“编码器”被用于任何你认为是安全的一部分,那么你就有一个非常严重的问题。

于 2013-01-02T15:24:15.833 回答