在插入记录时创建slug以包含id和title - php MySQL

rob*_*ist 4 php mysql url

可能重复:
INSERT INTO语句期间访问自动增量值

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

提前谢谢了

Ped*_*iro 5

您应该创建一个触发器,类似于:

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

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

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

HERE是关于触发器的文档.


我错了.显然,您无法更新要插入的表(使用AFTER INSERT triger),它会抛出异常.因此,有两种方法可以单独使用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 ;
Run Code Online (Sandbox Code Playgroud)

它会覆盖数据库的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 ;
Run Code Online (Sandbox Code Playgroud)

并且,而不是呼叫(因为你在呼叫):

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

只是打电话

$result = mysql_query("CALL insert_event('{$menu_name}', '{$content}', '{$photo_name}');",$connection );
Run Code Online (Sandbox Code Playgroud)

同样,我强烈建议不要使用mysql_query.它已经过时,停产和不安全.你应该看看mysqli或PDO.