如何在URL中隐藏MySQL生成的ID

时间:2012-12-04 15:30:55

标签: php mysql

现在,我只需在网址中使用其ID即可获取数据库中产品的信息:http://www.example.com/?productID=5
现在我猜猜下一个,因为这些ID都是自动递增的 你会如何隐藏这个ID并用更好的东西替换它?我的意思是它仍然必须是一个唯一的标识符 为了使它复杂化,我想我可以使用全局唯一标识符,并将其添加到另一列的数据库中。但我觉得这不是最好的方法:) 请让我知道你的想法,告诉我你在项目中如何解决/解决这个问题。

我基本上想要的是摆脱了解下一个/之前的ID。

产品本身没有安全限制。用户很可能被允许看到它们。我当时认为这种技术可以阻止抓取所有产品?!?

就像amazon.com所做的那样:看起来他们以某种方式隐藏了商品的ID,对吗?

4 个答案:

答案 0 :(得分:2)

你也可以使用一个非常适合SEO的slug。所以产品1 slug可能是http://www.example.com/?productSlug=exampleitemnameasoneword 你必须确保slug是独一无二的。您当然需要在数据库条目中使用slug字段并能够输入/编辑它。

答案 1 :(得分:1)

首先,看看mod_rewrite

我正在使用CakePhp,这使我可以轻松访问由.htaccess规则创建的网址。在我的情况下,我的标题是100%独特的,这使我有一个slug版本的标题。

例如,我的标题是SZD-51 Junior,这将成为SZD-51_Junior。我只是将此slug添加到我的数据库中,并将其用作辅助唯一标识符。当用户访问www.example.com/planes/SZD-51_Junior时,我可以执行以下操作:

// pseudo mysql
SELECT *
FROM table
WHERE slug = url_param

//in cakephp
$this->Plane->findBySlug($this->params['slug']);

有很多方法,你想要的网址是什么?哪种格式?

答案 2 :(得分:1)

你可以使用某种散列算法,比如md5(),sha1()等......是的,最好将该散列存储在表格的另一列中,以便更快地查找。

如果使用md5(),最好使用固定或随机盐串来播种它。 我最喜欢的是使用microtime()。

在db insert:

之前生成哈希
$salt = "my_secret_salt_string";
$entry['hash_code'] = md5($salt . microtime()); // every time a different result is generated which will ensure uniqueness
// insert into ...

或者,如果您更喜欢将生成的id用作salt,则更新条目:

// insert into ...
// get id
$entry['hash_code'] = md5($id . microtime());
// update ...

答案 3 :(得分:-2)

对此的解决方案是使用post,这只是我做的快速混搭。

<?php

//how to handle the request
if(isset($_POST['transfer']) && !empty($_POST['transfer']))
{
    $transfer = $_POST['transfer'];

    //what to do?
}

?>

//how to make a link with id 5
<a href="javascript:transfer('5');">link</a>

//this is for the functionality
<form id="transfer_form" action="http://www.example.com/" method="POST">
    <input type="hidden" id="transfer" name="productID" value="" />
</form>

//this should be placed within the <head>
<script>
function tranfer(link)
{
    document.getElementById('transfer').value = link;
    document.getElementById('transfer_form').submit();
}
</script>