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
,来进一步缩短此长度。