Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将列链接到不同的表_Php_Mysql - Fatal编程技术网

Php 将列链接到不同的表

Php 将列链接到不同的表,php,mysql,Php,Mysql,好吧,我不认为这是可能的,但我想确定一下。假设我有一个名为wp_users和forum_users的表。在wp_用户中有用户名、电子邮件和md5哈希列。论坛用户也是如此。有没有一种方法可以将这两种方法进行同步 INSERT INTO wp_users (username, password, email) VALUES ('$_POST[username]', '$_POST[password]', '$_POST[email]'); 会自动完成吗 INSERT INTO forum_use

好吧,我不认为这是可能的,但我想确定一下。假设我有一个名为wp_users和forum_users的表。在wp_用户中有用户名、电子邮件和md5哈希列。论坛用户也是如此。有没有一种方法可以将这两种方法进行同步

INSERT INTO wp_users (username, password, email)
VALUES ('$_POST[username]', '$_POST[password]', '$_POST[email]'); 
会自动完成吗

INSERT INTO forum_users (username, password, email)
VALUES ('$_POST[username]', '$_POST[password]', '$_POST[email]'); 
与ALTER等相同。

使用事务

BEGIN
 INSERT INTO wp_users (username, password, email)
 VALUES ('$_POST[username]', '$_POST[password]', '$_POST[email]');
 INSERT INTO forum_users (username, password, email)
 VALUES ('$_POST[username]', '$_POST[password]', '$_POST[email]'); 
COMMIT;

您可以利用MySQL触发器来自动执行此操作

CREATE TRIGGER after_insert_wp_users
AFTER INSERT ON wp_users FOR EACH ROW
BEGIN
    INSERT INTO forum_users (username, password, email)
    VALUES (NEW.username, NEW.password, NEW.email);
END
您可以对更新和其他查询执行相同的操作

编辑1:

CREATE TRIGGER after_insert_wp_users
AFTER INSERT ON wp_users FOR EACH ROW
BEGIN
    IF @__disable_trigger_users = 1 THEN
        SET @__disable_trigger_users = NULL;
    ELSE
        SET @__disable_trigger_users = 1;
        INSERT INTO forum_users (username, password, email)
        VALUES (NEW.username, NEW.password, NEW.email);
    END IF;
END
CREATE TRIGGER after_insert_forum_users
AFTER INSERT ON forum_users FOR EACH ROW
BEGIN
    IF @__disable_trigger_users = 1 THEN
        SET @__disable_trigger_users = NULL;
    ELSE
        SET @__disable_trigger_users = 1;
        INSERT INTO wp_users (username, password, email)
        VALUES (NEW.username, NEW.password, NEW.email);
    END IF;
END
在这种情况下,两个表都需要自动更新,即如果在表
wp\u users
中插入一行,它将自动插入
forum\u users
中,反之亦然,编写第二组触发器从forum\u users更新wp\u users表将引入递归循环

DROP PROCEDURE IF EXISTS proc_insert_user 
GO

CREATE PROCEDURE proc_insert_user
(
    IN  p_username   VARCHAR(15),
    IN  p_password   VARCHAR(15),
    IN  p_email      VARCHAR(15)  
)

BEGIN

    INSERT INTO wp_users (username, password, email)
    VALUES (p_username, p_password, p_email);

    INSERT INTO forum_users (username, password, email)
    VALUES (p_username, p_password, p_email);

END
GO

CALL proc_insert_user('$_POST[username]', '$_POST[password]', '$_POST[email]')
GO
为了避免这种情况,我们可以使用一个状态变量来检查是否应该进行二次插入

触发器1:

CREATE TRIGGER after_insert_wp_users
AFTER INSERT ON wp_users FOR EACH ROW
BEGIN
    IF @__disable_trigger_users = 1 THEN
        SET @__disable_trigger_users = NULL;
    ELSE
        SET @__disable_trigger_users = 1;
        INSERT INTO forum_users (username, password, email)
        VALUES (NEW.username, NEW.password, NEW.email);
    END IF;
END
CREATE TRIGGER after_insert_forum_users
AFTER INSERT ON forum_users FOR EACH ROW
BEGIN
    IF @__disable_trigger_users = 1 THEN
        SET @__disable_trigger_users = NULL;
    ELSE
        SET @__disable_trigger_users = 1;
        INSERT INTO wp_users (username, password, email)
        VALUES (NEW.username, NEW.password, NEW.email);
    END IF;
END
触发器2:

CREATE TRIGGER after_insert_wp_users
AFTER INSERT ON wp_users FOR EACH ROW
BEGIN
    IF @__disable_trigger_users = 1 THEN
        SET @__disable_trigger_users = NULL;
    ELSE
        SET @__disable_trigger_users = 1;
        INSERT INTO forum_users (username, password, email)
        VALUES (NEW.username, NEW.password, NEW.email);
    END IF;
END
CREATE TRIGGER after_insert_forum_users
AFTER INSERT ON forum_users FOR EACH ROW
BEGIN
    IF @__disable_trigger_users = 1 THEN
        SET @__disable_trigger_users = NULL;
    ELSE
        SET @__disable_trigger_users = 1;
        INSERT INTO wp_users (username, password, email)
        VALUES (NEW.username, NEW.password, NEW.email);
    END IF;
END
编辑2

您也可以使用MySQL存储过程来实现同样的功能

DROP PROCEDURE IF EXISTS proc_insert_user 
GO

CREATE PROCEDURE proc_insert_user
(
    IN  p_username   VARCHAR(15),
    IN  p_password   VARCHAR(15),
    IN  p_email      VARCHAR(15)  
)

BEGIN

    INSERT INTO wp_users (username, password, email)
    VALUES (p_username, p_password, p_email);

    INSERT INTO forum_users (username, password, email)
    VALUES (p_username, p_password, p_email);

END
GO

CALL proc_insert_user('$_POST[username]', '$_POST[password]', '$_POST[email]')
GO

我说的是数据库结构本身,这样你就不必使用它了。我想设置现有的数据库结构,以便在不修改核心文件的情况下同时更新论坛和wordpress站点数据库。因此,要完全同步它们,我可以这样做,只需更改值,以便您可以通过论坛更新wp数据库?对。您可以从
forum\u users
表中为更新
wp\u用户
表编写类似的触发器。需要检查这是否会产生某种循环/死锁…我已经为上面的循环问题添加了一个解决方案。我已经编辑了这篇文章,以包含使用存储过程的替代解决方案。希望有帮助。