我想在创建要存储在数据库中的页面时为我的 URL 生成 slug。蛞蝓应该是title-id
(例如titlename-234
)。我已经有了剥离标题的功能,但是如何在插入记录之前获取 id?
提前谢谢了
我想在创建要存储在数据库中的页面时为我的 URL 生成 slug。蛞蝓应该是title-id
(例如titlename-234
)。我已经有了剥离标题的功能,但是如何在插入记录之前获取 id?
提前谢谢了
您应该创建一个触发器,如下所示:
CREATE TRIGGER trigger_name BEFORE INSERT ON table
FOR EACH ROW SET slug = CONCAT(NEW.title, "-", NEW.id);
我不确定您是否能够在将 ID 列写入数据库之前访问它(当然,除非您自己生成 ID,而不是使用自动增量)。
如果您使用数据库的自动增量(并且应该使用),请尝试在插入后创建触发器,并更新触发器中的行。这样,即使您在插入后更新它,它仍然会在您运行任何其他查询(如 SELECT)之前运行。
这里是关于触发器的文档。
我错了。显然,您无法更新要插入的表(使用 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。