Mysqli事务查询超过普通的PHP MySQLi查询

时间:2018-07-10 13:29:32

标签: php mysql mysqli transactions

我正在尝试通过php mysqli查询使用mysql事务查询,如下所示:

$sql = "START TRANSACTION; 
        INSERT INTO songs (title, disco, deleted) VALUES ('".$titol."', '".$codi."', '0'); 
        SET @last_id = LAST_INSERT_ID(); 
        INSERT INTO lyrics (`lyricsOri`, `lyricsTra`, `song`, `deleted`) VALUES ('".$lyricsO."', '".$lyricsT."', @last_id, 0);  
        COMMIT;";
connection()->query($sql);

如果我得到$sql值并将其作为sql命令复制粘贴到php我的管理员中,它运行得很好,并且可以完成它应做的工作,但是当我通过php运行它时,它不起作用我不知道为什么。

我知道我可以使用php本机事务,将其设置为auto_commit(FALSE)并在其上添加不同的查询以最终提交它,但是在这种情况下,我想使用mysql命令“按原样”,并且我可以找不到为什么它无法正常工作。

有人看到故障或可以告诉我为什么它不起作用吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

@ raymond-nijland指出,PHP客户端不支持用分号分隔的多个SQL语句。

但这是半正确的。 您可以使用multi_query:

$sql = "START TRANSACTION; INSERT INTO songs (title, disco, deleted) VALUES ('".$titol."', '".$codi."', '0'); SET @last_id = LAST_INSERT_ID(); INSERT INTO lyrics (`lyricsOri`, `lyricsTra`, `song`, `deleted`) VALUES ('".$lyricsO."', '".$lyricsT."', @last_id, 0); COMMIT;";

connection()->multi_query($sql);

或者,正如您所写,使用php事务,它将带您获得相同的结果:

    connection()->begin_transaction(MYSQLI_TRANS_START_READ_ONLY);
    connection()->query("START TRANSACTION;");
    connection()->query("INSERT INTO songs (title, disco, deleted) VALUES ('".$titol."', '".$codi."', '0');");
    connection()->query("SET @last_id = LAST_INSERT_ID();");
    connection()->query("INSERT INTO lyrics (`lyricsOri`, `lyricsTra`, `song`, `deleted`) VALUES ('".$lyricsO."', '".$lyricsT."', @last_id, 0);");
    connection()->query("COMMIT;");
    connection()->commit();
    connection()->close();

希望有帮助!