PHP 函数转 MySQL 函数

标签 php mysql

有人可以指导我如何将此函数重写为 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/

相关文章:

mysql - 这段消除排列的SQL代码如何改进?

php - MySQL - 唯一行的平均值

PHP/MySQL - AND/OR 问题

php - 有效地分解和修剪长字符串,从而产生单个数组

php - 如何在 Controller 中显示查询结果

mysql - 流浪者@localhost :~$/usr/bin/mysqld_safe & not working

php - 获取 mysql 表列描述

javascript - 鼠标悬停在上面的交互式 map

javascript - Codeigniter Ajax 后显示 404

MySQL加载数据InFile;如果跳过行