データベースに保存するページを作成するときに、URL のスラッグを生成したいと考えています。スラッグはtitle-id
(eg titlename-234
) にする必要があります。タイトルを削除する機能は既にありますが、レコードを挿入する前に ID を取得するにはどうすればよいですか?
よろしくお願いします
データベースに保存するページを作成するときに、URL のスラッグを生成したいと考えています。スラッグはtitle-id
(eg titlename-234
) にする必要があります。タイトルを削除する機能は既にありますが、レコードを挿入する前に ID を取得するにはどうすればよいですか?
よろしくお願いします
次のようなトリガーを作成する必要があります。
CREATE TRIGGER trigger_name BEFORE INSERT ON table
FOR EACH ROW SET slug = CONCAT(NEW.title, "-", NEW.id);
データベースに書き込まれる前に ID 列にアクセスできるかどうかはわかりません (もちろん、自動インクリメントを使用せずに自分で ID を生成しない限り)。
DB の自動インクリメントを使用している場合 (使用する必要があります)、トリガー AFTER INSERT を作成し、トリガー内の行を更新してみてください。そうすれば、挿入後に更新していても、他のクエリ (SELECT など) を実行する前に実行されます。
HEREはトリガーに関するドキュメントです。
私は間違っていた。どうやら、(AFTER INSERT トリガーを使用して) 挿入しているテーブルを更新することはできず、例外がスローされます。したがって、SQL のみを使用してそれを行うには、次の 2 つの方法があります。
醜い方法:
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 をチェックアウトする必要があります。