有人可以指导我如何将此函数重写为 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;
}
最佳答案
好吧,根据我的更好判断,我已经为您编写了一个快速 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;
||
我会重申我在评论中提出的关于这是一个微不足道的操作的另一点。像这样简单的字符转换操作实际上毫无用处。我想不出任何场景它们是个好主意。尤其是安全性。
如果这个“编码器”被用于任何您认为安全的一部分,那么您就会遇到一个非常严重的问题。
关于PHP 函数转 MySQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14121313/