我正在创建一个插件,我想在表上自动创建一个MySQL触发器。问题似乎是$wpdb->query似乎不接受多部分语句和/或格式化查询。
如果我在phpMyAdmin中打印并运行以下查询,它将返回success。我还注意到,如果我将查询全部格式化为一行,它仍然会报告成功,但在这种情况下,不会创建触发器。
$wpdb->query(
"DELIMITER //
DROP TRIGGER IF EXISTS {$wpdb->get_blog_prefix($site->id)}post_queue_insert//
CREATE TRIGGER {$wpdb->get_blog_prefix($site->id)}queue_insert BEFORE INSERT ON {$wpdb->get_blog_prefix($site->id)}posts
FOR EACH ROW BEGIN
INSERT INTO {$wpdb->base_prefix}post_queue (action_id, action_type, action_status, action_timestamp, sync_complete, SITE_ID) VALUES (NEW.ID, NEW.post_type, NEW.post_status, UNIX_TIMESTAMP(now()), 0, {$site->id});
END//
DELIMITER ;"
);
我是否可以使用其他函数或其他方式格式化查询以成功运行?
最合适的回答,由SO网友:EddyR 整理而成
经过多次尝试和错误,我终于找到了使用mysqli的解决方案。我认为这是一个可以接受的解决方案,因为查询只会在插件更新上运行。
$mysqli = new mysqli();
$mysqli->connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$sql = "
DROP TRIGGER IF EXISTS {$wpdb->get_blog_prefix($site->id)}post_queue_insert;
CREATE TRIGGER {$wpdb->get_blog_prefix($site->id)}post_queue_insert BEFORE INSERT ON {$wpdb->get_blog_prefix($site->id)}posts
FOR EACH ROW BEGIN
INSERT INTO {$wpdb->base_prefix}post_queue (action_id, action_type, action_status, action_event, action_timestamp, sync_complete, SITE_ID) VALUES (NEW.ID, NEW.post_type, NEW.post_status, \'insert\', UNIX_TIMESTAMP(now()), 0, {$site->id});
END;
";
$mysqli->multi_query($sql);
$mysqli->close();