【问题标题】:Create slug to include id and title when insert record - php MySQL [duplicate]插入记录时创建 slug 以包含 id 和标题 - php MySQL [重复]
【发布时间】:2012-10-28 23:05:47
【问题描述】:

可能重复:
Access Auto-Increment Value During INSERT INTO Statement

我想在创建要存储在数据库中的页面时为我的 URL 生成 slug。蛞蝓应该是title-id(例如titlename-234)。我已经有了剥离标题的功能,但是如何在插入记录之前获取 id?

非常感谢提前

【问题讨论】:

  • 你不能,除非你自己分配它;您必须在插入后更新您的行,或者在生成 url 时将 ID 粘贴在末尾。
  • 好的,干杯。我真的更喜欢在数据库中有 url,所以我想我必须在插入后更新。干杯.....@Timlytle 干杯我会看看那个

标签: php mysql url


【解决方案1】:

你应该创建一个触发器,类似这样:

CREATE TRIGGER trigger_name BEFORE INSERT ON table
FOR EACH ROW SET slug = CONCAT(NEW.title, "-", NEW.id);

我不确定您是否能够在 ID 列写入数据库之前访问它(当然,除非您自己生成 ID,而不是使用自动增量)。

如果您正在使用数据库的自动增量(并且应该使用),请尝试在插入后创建触发器,并更新触发器中的行。这样,即使您在插入后更新它,它仍然会在您运行任何其他查询(如 SELECT)之前运行。

HERE 是关于触发器的文档。


我错了。显然,您无法更新要插入的表(使用 AFTER INSERT 触发器),它会引发异常。因此,单独使用 SQL 有两种可能的方法:

丑陋的方式:

DELIMITER $$
CREATE TRIGGER `create_slug` BEFORE INSERT
    ON `events`
    FOR EACH ROW
BEGIN
    SET new.id = (SELECT MAX(id) FROM events) + 1;
    SET new.slug = CONCAT(new.menu_name, "-", new.id);
END$$
DELIMITER ;

它会覆盖数据库的 AUTOINCREMENT。真的,不要那样做。

或者,您可以创建一个过程:

DELIMITER $$

CREATE PROCEDURE insert_event(MenuName VARCHAR(30), Content TEXT, PhotoName TEXT)
BEGIN
    INSERT INTO events (menu_name, content, photo_name) VALUES (MenuName, Content, PhotoName);
    SET @id = LAST_INSERT_ID();
    UPDATE events SET slug = CONCAT(menu_name, "-", @id) WHERE id = @id;
END$$

DELIMITER ;

而且,而不是调用(就像你调用的那样):

$query = mysql_query("INSERT INTO events (menu_name, content, photo_name) VALUES ('{$menu_name}', '{$content}', '{$photo_name}');", $connection); 

打电话

$result = mysql_query("CALL insert_event('{$menu_name}', '{$content}', '{$photo_name}');",$connection );

再次,我强烈建议不要使用 mysql_query。它已经过时、停产且不安全。您应该检查 mysqli 或 PDO。

【讨论】:

  • 听起来不错。谢谢,我一定会试试的。非常感谢。是的,我正在使用汽车公司 ID :)
  • 不客气。还要记住在更新行时创建触发器(否则,如果您更改“标题”,您仍然会被以前的 slug 卡住)。试试看,如果有效,请记得回来接受答案:)
  • 好酷。谢谢你的信息,我试试然后回来。 :)
  • 我收到一个错误,你能看出我的代码有什么问题吗? $query = "INSERT INTO events ( menu_name, content, photo_name ) VALUES ( '{$menu_name}', '{$content}', '{$photo_name}' ) CREATE TRIGGER trigger_name AFTER INSERT ON events FOR EACH ROW SET slug = CONCAT(NEW.menu_name, "-", NEW.id)"; $result = mysql_query($query, $connection);
  • 刚刚添加了一个示例来帮助您。
猜你喜欢
  • 2011-12-09
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2021-09-25
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多