我正在尝试对php应用程序的消息ID进行编码,但我找不到有关如何执行此操作的明确说明。
基本上我有一个网址 - 例如http://www.mymessager.com?messageID=1234
我想让系统编码url的消息ID,但不要在数据库中更改它,例如 - http://www.mymessager.com?messageID=38927648726894762345768
如何做这样的事情,如果有人进入编码的网址,php会在地址栏中显示http://www.mymessager.com?messageID=38927648726894762345768,但脚本会将消息1234拉出数据库?
我知道那里有类似的问题,但我没有找到一个谈论我想做的事情(主要是清理网址)。
答案 0 :(得分:1)
这是为了避免其他用户使用messageID = 4321等打开其他用户私信吗?因为这样就没办法了!
您应该检查是否确实允许正在打开邮件的用户这样做。
如果邮件不是私密邮件,那么您只是不想通过修改号码来增加人们查看邮件。然后,您可以向数据库添加“messageKey”字段并设置指定长度的随机字符串。示例http://www.mymessager.com?messageKey=jadg23sf34lhs
现在只需在数据库中搜索带有该MessageKey的消息。请记住确保messageKey是唯一的。
通过这种方式,您还可以将messageKey设置为易于记忆的内容,或者SEO也许是友好的。只要它是独一无二的。
答案 1 :(得分:1)
我实际上将它们翻译成一个字符串:
$consts = array(66016,57721, 42344,56714,76422);
define( 'BASE', 36 );
$to_encrypt = 5789;
// Generate a random seed value as an index of the constants
$seed = rand(0,count()-1);
// Add the constant the product of the seed and the to the value to be encrypted
// (the multiplication just serves to create more noise)
$base_crypt = ( $consts[ $seed ] + $to_encrypt * ( $seed + 1 ) );
//SEE NOTES ON FLOATING POINT ISSUES IN PHP DOCS!
$encrypted = base_convert( BASE * $base_crypt + $seed, 10, BASE );
然后解密:
$encrypted = base_convert( $_GET[ 'encrypted' ], BASE, 10 );
$seed = $encrypted % BASE;
$decrypted = ( ( $encrypted - $seed )/BASE - $consts[ $seed ])/( $seed + 1 );
你可能需要在某种程度上使用bcadd之类的东西,但是我有这个系统的生产副本,它可以工作。
(我必须在我首次发布此处的地方加入link。)
答案 2 :(得分:0)
如果您正在散列(例如使用md5),则可以比较值的哈希值,例如:
$SQL = "SELECT * FROM `messages` WHERE MD5(ID) = '".$_GET['id']."'";
答案 3 :(得分:0)
这通常通过为数据库中的每个条目存储另一个ID来完成。如果你不想走那条路,你将不得不使用一个可以转换为“public”id的函数。像...
function toPublicId($id) {
return $id * 1498158 + 825920496;
}
function toInternalId($publicId) {
return ($publicId - 825920496) / 1498158;
}
或其他什么。我有时会为公共ID使用保证的唯一字母数字ID,通过转换为/例如base36和大的乘数+偏移来转换为/从它们转换。