将多个值压缩为简短的URL

时间:2016-01-05 06:20:21

标签: php variables url

我正在尝试创建一些用户可以选择各种选项并根据所选选项转到页面的内容。但是,用户必须能够在将来使用短URL访问唯一页面。

我想要做的例子:

[ ] 1st val
[x] 2nd val
[x] 3rd val
[x] 4th val
[ ] 5th val

在数据库中存储为:ID = 123DF3 VAL = 2,3,4

用户访问:http://website.com/123DF3/

获取页面:您已选择2,3和& 4。

有没有办法在不必将选项值的所有可能组合存储在数据库中(浪费和低效)?

示例:

ID = 123DF3  VAL = 2,3,4
ID = 223FR5  VAL = 2,4,3
ID = 323FG4  VAL = 4,3,2
ID = 253FR7  VAL = 4,2,3
ID = 623GR6  VAL = 3,4,2
ID = 724FR8  VAL = 3,2,4

等......随着价值量的增加,可能性越来越大。

另一种方法是在URL中包含每个变量,但如果有很多if值(例如http://website.com?v=1,2,3,4,5,6..),它会使URL非常长。)。

如果可能的话,我想尽量避免使用这种方法,但如果我无法想出一种创造性的方法来克服上述问题,我将不得不诉诸它。

示例输入:

  

array(40){[0] =>字符串(1)" 1" [1] =>字符串(1)" 2" [2] =>串(2)   " 40" [3] =>字符串(1)" 3" [4] =>字符串(1)" 4" [5] =>字符串(1)" 5" [6] =>   字符串(1)" 6" [7] =>字符串(1)" 7" [8] =>字符串(2)" 36" [9] =>串(1)   " 8" [10] =>字符串(1)" 9" [11] =>字符串(2)" 10" [12] =>字符串(2)" 11"   [13] =>字符串(2)" 38" [14] =>字符串(2)" 12" [15] =>字符串(2)" 13"   [16] =>字符串(2)" 14" [17] =>字符串(2)" 15" [18] =>字符串(2)" 37"   [19] =>字符串(2)" 39" [20] =>字符串(2)" 16" [21] =>字符串(2)" 17"   [22] =>字符串(2)" 18" [23] =>字符串(2)" 19" [24] =>字符串(2)" 20"   [25] =>字符串(2)" 32" [26] =>字符串(2)" 21" [27] =>字符串(2)" 22"   [28] =>字符串(2)" 23" [29] =>字符串(2)" 24" [30] =>字符串(2)" 25"   [31] =>字符串(2)" 26" [32] =>字符串(2)" 27" [33] =>字符串(2)" 28"   [34] =>字符串(2)" 29" [35] =>字符串(2)" 30" [36] =>字符串(2)" 31"   [37] =>字符串(2)" 33" [38] =>字符串(2)" 34" [39] =>字符串(2)" 35" }

**注意:可能无法订购这些值

2 个答案:

答案 0 :(得分:1)

这是一个想法:

  1. 根据选择的值创建二进制数。 (例如(2,3,4) - > 1110;(1,3,4,6) - > 101101)
  2. 将该数字转换为十六进制 (例如1110 - > E)
  3. 然后,当您的用户输入... / E时,您将E转换为1110,并且您知道选择了值2,3,4。这是快速,干净的,不需要在数据库中放置任何东西

    这是一个实现:

    D:\Java\jdk1.8.0_25\jre\bin>keytool.exe -import -alias kish -keystore "C:/Program Files/Java/jre1.8.0_25/lib/security/cacerts" -file D:/{my_server}/mycertificate.cer
    
    Enter keystore password:
    
    keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
    

    下一个可以采用任意数量值的实现:

    function getID($selectedValues) {
        $bits = 0;
        foreach ($selectedValues as $v)
            $bits += 1<<($v-1);
        return dechex($bits);
    }
    
    function getSelectedValues($id) {
        $bits = hexdec($id);
        for ($i = 0; $i < 32; $i++)
            if ( ($bits & (1<<$i)) != 0 )
                $selectedValues[] = $i + 1;
        return $selectedValues;
    }
    

答案 1 :(得分:1)

最短且最容易解析的可能是base64_encode() / base64_decode()

<强> ENCODE:

$values = array(2,3,4);
$key = base64_encode(implode('|',$values);

<强>输出:

MnwzfDQ=

解码:(http://example.com/MnwzfDQ=

$url = $_SERVER['REQUEST_URL'];
$key = basename($url);
$values = explode('|',base64_decode($key));