我想创建一个按钮,从数据库中为每个链接提供唯一的链接ID。
我只有 "下一个 "按钮,它应该给我下一个故事页面。
我没有从google上找到任何关于如何创建具有ID的链接的片段,以便以后不会重复。
我的代码。
$row = Db::run()->pdoQuery('SELECT c.name AS name
, p.id AS id, p.created AS created
, p.title AS title, p.body AS body, p.cover AS cover
FROM projects AS p
INNER JOIN categories AS c
ON p.category = c.id
WHERE p.id ="' . $id . '";')->results(); // for current story article
$nrow = Db::run()->pdoQuery('SELECT
(SELECT MIN(id) AS id FROM projects WHERE id > p.id) as next_id,
(SELECT title FROM projects WHERE id > p.id) as next_title,
(SELECT cover FROM projects WHERE id > p.id) as next_cover,
(SELECT c.name AS name FROM projects AS a
INNER JOIN categories AS c
ON a.category = c.id
WHERE a.id > p.id) AS next_name
FROM projects p WHERE p.id = "' . $id . '"')->results(); // for next story article
$tpl->data = $row;
$tpl->next = $nrow;
"下一个故事 "按钮图像:下一个故事
也许可以通过某种方式检查上次给出的ID是什么,当前的ID是什么,下一次的ID是什么,或者缓存它?
它看起来像你使用MySQL查询在你的问题。
你可以更新你的数据库模式,使你的...。projects
表中有一列带有 AUTO_INCREMENT
旗帜。
从 其文件:
"AUTO_INCREMENT属性可用于为新行生成唯一标识"
然后,当保存一条新的记录到该表时,你可以省略下面的 id
列或指定 NULL
如果模式说 NOT NULL
来进行自动增量。这将防止身份碰撞,但它们不是随机的。
为此,你可以考虑使用 UUID()
或 UUID_SHORT()
在MySQL 5.7+中.
此外,虽然你的问题暗示你没有使用ORM,但像你这样的工具,如 理论 & 教义扩展 给予快速访问更多随机的,(和更有利于SEO的)独特的ID选项的行,如 蛞蝓.
这不是你要找的答案--但如果你想要一个具体的答案,你需要更具体。
从数据库中给每个链接一个唯一的链接ID
这是不可能的,除非你的数据库中的故事比任何时候都要多--这就有点傻了。如果你的意思是一个人不会看到同一个ID超过一次,那就比较合理了。但你的意思是一个会话中的一次吗?只要他们有一个账户,就会有一次吗?你是想提供一个匿名的功能,让人们在没有账户的情况下也能使用吗?
你没有说ID呈现的顺序是相关的。
你没有说'projects.id'的数据类型是什么。
你对下一个故事的查询完全没有意义。
假设故事将按顺序读取,你不保留服务器端的状态,你已经确保符合当地的provacy法律,而且project.id是一个近乎连续的整数集,而且这是一个基于Web的应用程序(很多假设),那么只要在每次呈现一个故事时丢弃一个包含ID的cookie,然后得到下一个故事......
SELECT c.name AS name
, p.id AS id, p.created AS created
, p.title AS title, p.body AS body, p.cover AS cover
FROM projects AS p
INNER JOIN categories AS c
ON p.category = c.id
WHERE p.id =(SELECT MIN(read.id)
FROM projects read
WHERE id>" . (integer) $_COOKIE['lastread']