Php 编码url参数,需要简短

Php 编码url参数,需要简短,php,codeigniter,Php,Codeigniter,我想对发送给控制器的参数进行编码。我的控制器和参数如下所示:Anket/716026/3。我所做的编码是将这两个参数组合为7160263(始终获得标准长度)。然后使用以下编码和解码方法: function encode($id) { $id_str = (string) $id; $offset = rand(0, 9); $encoded = chr(79 + $offset); for ($i = 0, $len = strle

我想对发送给控制器的参数进行编码。我的控制器和参数如下所示:
Anket/716026/3
。我所做的编码是将这两个参数组合为
7160263
(始终获得标准长度)。然后使用以下编码和解码方法:

function encode($id) {
        $id_str = (string) $id;
        $offset = rand(0, 9);
        $encoded = chr(79 + $offset);
        for ($i = 0, $len = strlen($id_str); $i < $len; ++$i) {
          $encoded .= chr(65 + $id_str[$i] + $offset);
        }
        return $encoded;
      }

function decode($encoded) {
        $offset = ord($encoded[0]) - 79;
        $encoded = substr($encoded, 1);
        for ($i = 0, $len = strlen($encoded); $i < $len; ++$i) {
          $encoded[$i] = ord($encoded[$i]) - $offset - 65;
        }
        return (int) $encoded;
}
函数编码($id){
$id_str=(字符串)$id;
$offset=兰特(0,9);
$encoded=chr(79+$offset);
对于($i=0,$len=strlen($id_str);$i<$len;++$i){
$encoded.=chr(65+$id_str[$i]+$offset);
}
返回$encoded;
}
函数解码($encoded){
$offset=ord($encoded[0])-79;
$encoded=substr($encoded,1);
对于($i=0,$len=strlen($encoded);$i<$len;++$i){
$encoded[$i]=ord($encoded[$i])-$offset-65;
}
返回值(整数)$encoded;
}
编码字符串如下所示:TMGLFHLI。这正是我想要它看起来的样子:简短且易于键入。但由于它是随机的,每次我都会得到一个随机编码的字符串。所以它也可能看起来像这样;XQKPJLPM、OHBGACGD、SLFKEKH等


正如您所看到的,这不会影响解码过程。但是生成的链接是用于调查链接的,用户会将这些链接分发给用户。我是否应该对它们编码一次并将它们存储在数据库中,以维护相同的编码字符串以避免混淆?还是我应该保持原样?如果您知道更好的编码方法,请告诉我。

更新答案 您可以使用
chr()
将数字转换为
字符
ord()
将字符转换为
整数

function encode($id) {
    $array = str_split($id);
    $encoded = '';
    foreach($array as $val){
        // 65 = A
        // 65 + 1 = B
        $encoded .= chr($val + 65);
    }

    return $encoded;
}

function decode($encoded) {
    $array = str_split($encoded);
    $decoded = '';

    foreach($array as $val){
        // Convert to ASCII value
        $decoded .= ord($val) - 65;
    }

    return (int) $decoded;
}
        //Enter your code here, enjoy!
$str = '7160264';
$encoded = encode($str);
$decoded = decode($encoded);
echo 'Encoded: ' . $encoded . "\n";
echo 'Decoded: ' . $decoded;
输出:

Encoded: HBGACGE
Decoded: 7160264
$str = '7160264';
// Remove the ==
$encoded = rtrim(base64_encode("7160264"), '=');

echo 'Encoded: ' . $encoded . "\n";
// Concat == when decoding again.
echo 'Decoded: ' . base64_decode($encoded .'==');
Encoded: NzE2MDI2NA
Decoded: 7160264
在不使用随机数偏移量的情况下,输出将始终相同。随机字母仅从A到J

旧答案您可以使用
base64\u编码
base64\u解码

示例:

Encoded: HBGACGE
Decoded: 7160264
$str = '7160264';
// Remove the ==
$encoded = rtrim(base64_encode("7160264"), '=');

echo 'Encoded: ' . $encoded . "\n";
// Concat == when decoding again.
echo 'Decoded: ' . base64_decode($encoded .'==');
Encoded: NzE2MDI2NA
Decoded: 7160264
输出:

Encoded: HBGACGE
Decoded: 7160264
$str = '7160264';
// Remove the ==
$encoded = rtrim(base64_encode("7160264"), '=');

echo 'Encoded: ' . $encoded . "\n";
// Concat == when decoding again.
echo 'Decoded: ' . base64_decode($encoded .'==');
Encoded: NzE2MDI2NA
Decoded: 7160264

为了让你的生活更容易,你可以使用CI加密库。 首先,必须在application/config/config.php中设置加密密钥:

$config['encryption_key'] = 'YOUR KEY';
然后用这个:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Encrypt extends CI_Controller {

    public function __construct() {
        parent::__construct();          
        $this->load->library('encryption');
    }

    public function encrypt_string($some_string){
       return $this->encryption->encrypt($some_string);
    }

    public function decrypt_string($some_string){
       return $this->encryption->decrypt($some_string) == $password);
    }

    public function test(){
       $data = $this->encrypt_string('encrypt me');
       var_dump($data);
       var_dump($this->decrypt_string($data));
    }
}

为什么不在创建调查时为每个调查创建一个随机标记,并将其与调查一起存储在数据库中?然后,你不需要对这些东西进行编码/解码,只要查询那个令牌就可以从数据库中取出来。调查一开始不存储。发送表单后,仅显示结果计算。我从其他表中获取构建表单所需的数据。我想我可以找到一个合适的、快速的编码算法来现场实现这一点。但我现在正在考虑一个只用于存储两个参数和令牌的表。这是我使用的第一个表,但它有字母、数字和大小写字母。我的同龄人不赞成。所以,我试着用这个方法代替。更新后的版本和我的非常相似,只是随机性不同。我应该用这个,谢谢。有一个问题,我读到tinyurl和类似的东西有碰撞概率。你会建议用这些方法进一步缩短结果,还是用这种方法更安全?我不熟悉tinyurl的工作原理。我不确定我的答案是否更安全。您还可以通过将两个数字(而不是一个)转换为
char
,并将其限制为仅
Z
,来进一步缩短此长度。