【问题标题】:mysqli_insert_id failed with mysqli_multi_querymysqli_insert_id 使用 mysqli_multi_query 失败
【发布时间】:2014-11-22 06:36:49
【问题描述】:

项目:

跨多个相关表的重复行数据。

问题:

在 php 中,使用第一个 mysqli_multi_query 后,我似乎无法从 mysqli_insert_id 获得 id 结果。

状态:

我已经使用 phpmyadmin 成功查询了以下内容(手动将 unit_id 替换为 1,将 $unit_id1 替换为 61(下一个对应)):

PHPMYADMIN

CREATE TEMPORARY TABLE  tmp
                      SELECT            `unit_id`,
                                        `title`,
                                        `status_id`,
                                        `category_id`,
                                        `tags`,
                                        `access_id`
                      FROM              unit_genData
                      WHERE             `unit_id` = 1;# 1 row affected.


                      ALTER TABLE       tmp 
                      DROP COLUMN       `unit_id`;# 1 row affected.


                      UPDATE            tmp 
                      SET               `title` = 'DUPLICATE';# 1 row affected.


                      INSERT INTO       unit_genData 
                      SELECT            0,tmp.* 
                      FROM              tmp;# 1 row affected.

                      DROP TABLE        tmp;# MySQL returned an empty result set (i.e. zero rows).


CREATE TEMPORARY TABLE  tmp 
                      SELECT            `ad_id`,
                                        `unit_id`,
                                        `ad_title`,
                                        `ad_image`,
                                        `ad_img_caption`,
                                        `ad_brief_desc`,
                                        `ad_btn_text`
                      FROM              unit_promoContent 
                      WHERE             `unit_id`=1;# 1 row affected.


                      ALTER TABLE       tmp 
                      DROP COLUMN       `ad_id`;# 1 row affected.


                      UPDATE            tmp 
                      SET               `unit_id` = 61;# 1 row affected.


                      INSERT INTO       unit_promoContent 
                      SELECT            0,tmp.* 
                      FROM              tmp;# 1 row affected.

                      DROP TABLE        tmp;# MySQL returned an empty result set (i.e. zero rows).

PHP

注意:第一个 multi_query 成功复制了第一个表...第二个 multi_query 取决于 mysqli_insert_id 结果。

$sql1 = "CREATE TEMPORARY TABLE tmp
                      SELECT            `unit_id`,
                                        `title`,
                                        `status_id`,
                                        `category_id`,
                                        `tags`,
                                        `access_id`
                      FROM              ".ID_TABLE."
                      WHERE             `unit_id` = " . $id . ";

                      ALTER TABLE       tmp 
                      DROP COLUMN       `unit_id`;

                      UPDATE            tmp 
                      SET               `title` = 'DUPLICATE';

                      INSERT INTO       ".ID_TABLE." 
                      SELECT            0,tmp.* 
                      FROM              tmp;
                      DROP TABLE        tmp;
                     ";
              $result = mysqli_multi_query($dbc,$sql1) 
                      or die(mysqli_error($sql1)); 

                $unit_id1 = mysqli_insert_id($dbc);                     // Store new unit_id as var                                                                                                 // Tab 2 :: Promo Content    
              $sql2 = "CREATE TEMPORARY TABLE   tmp 
                      SELECT            `ad_id`,
                                        `unit_id`,
                                        `ad_title`,
                                        `ad_image`,
                                        `ad_img_caption`,
                                        `ad_brief_desc`,
                                        `ad_btn_text`
                      FROM              unit_promoContent 
                      WHERE             `unit_id`=" . $id . ";


                      ALTER TABLE       tmp 
                      DROP COLUMN       `ad_id`;


                      UPDATE            tmp 
                      SET               `unit_id` = ". $unit_id1 .";


                      INSERT INTO       unit_promoContent 
                      SELECT            0,tmp.* 
                      FROM              tmp;
                      DROP TABLE        tmp;
                     ";

              $result = mysqli_multi_query($dbc,$sql2) 
                      or die(mysqli_error($sql2)); 

【问题讨论】:

  • 这个输出什么? mysqli_insert_id($dbc);
  • @Hanky웃Panky 按照您的要求编辑了 ajax 以从 mysqli_insert_id($dbc) 获取输出。 "Commands out of sync; you can't run this command now"
  • 尝试不使用ajax直接运行此代码,以便您可以先调试服务器端。可能是非常小的东西。检查该函数是否返回 false?
  • @Hanky웃Panky 所以我使用以下 errorAlert 函数 function errorAlert(e, jqxhr) {alert("Your request was not successful: " + jqxhr);}; 运行了另一个测试。产生的错误警报说parseerror。请注意,我仍然成功复制了第一个 mysqli_multi_query。
  • @Hanky웃Panky 只是想感谢您的建议。有人不时将这些反弹回来意味着很多。我通过将mysqli_multi_query 分成单独的查询找到了答案。似乎是我可以抓住mysqli_insert_id 的唯一方法。我已经添加了我设法开始工作的答案。

标签: php mysql phpmyadmin mysqli-multi-query


【解决方案1】:

最后,经过大量测试,我发现成功获取新行的unit_id的唯一方法是将第一个mysqli_multi_query分离成单独的mysqli_query

即使在这样做,我仍然发现我得到了一个解析错误,所以我将mysqli_insert_id直接移动到INSERT查询下方。

现在我已经能够获得新的 unit_id,我能够成功地为下一个重复的表运行 mysqli_multi_query但是,我在包含要复制的剩余表时遇到了同样的问题,所以我最终发现我必须将所有 mysqli_multi_query 分成单独的 mysqli_query

请参阅下面的工作解决方案:
注意:
ID_TABLE 在包含的 config.php 文件中定义(此处未显示)。它是一个标题为 unit_genData
*$id* 的表是一个 var,表示要复制的选定/选中行的初始 unit_id

            $sql1   = "CREATE TEMPORARY TABLE   tmp
                      SELECT            `unit_id`,
                                        `title`,
                                        `status_id`,
                                        `category_id`,
                                        `tags`,
                                        `access_id`
                      FROM              ".ID_TABLE."
                      WHERE             `unit_id` = " . $id . "";
            $result = mysqli_query($dbc,$sql1) or die(mysqli_error($dbc));        
            $sql2   = "ALTER TABLE      tmp 
                      DROP COLUMN       `unit_id`";
            $result = mysqli_query($dbc,$sql2) or die(mysqli_error($dbc));
            $sql3   = "UPDATE           tmp 
                      SET               `title` = 'DUPLICATE'";
            $result = mysqli_query($dbc,$sql3) or die(mysqli_error($dbc));  
            $sql4   = "INSERT INTO      ".ID_TABLE." 
                      SELECT            0,tmp.* 
                      FROM              tmp";
            $result = mysqli_query($dbc,$sql4) or die(mysqli_error($dbc));  

        $unit_id1   = mysqli_insert_id($dbc);   //$dbc->insert_id;  // Store new unit_id as var

            $sql5   = "DROP TABLE       tmp;";
            $result = mysqli_query($dbc,$sql5) or die(mysqli_error($dbc));

            $data       = "Insert_id for TABLE 1: ".$unit_id1.". ";
                                                                    // Duplicate Table for Tab 2
                                                                    // Promo Content
            $sql6   = "CREATE TEMPORARY TABLE   tmp 
                      SELECT            `ad_id`,
                                        `unit_id`,
                                        `ad_title`,
                                        `ad_image`,
                                        `ad_img_caption`,
                                        `ad_brief_desc`,
                                        `ad_btn_text`
                      FROM              unit_promoContent 
                      WHERE             `unit_id`=" . $id . ";
            $result = mysqli_query($dbc,$sql6) or die(mysqli_error($dbc));  


            $sql7   = "ALTER TABLE      tmp 
                      DROP COLUMN       `ad_id`";
            $result = mysqli_query($dbc,$sql7) or die(mysqli_error($dbc));  


            $sql8   = "UPDATE           tmp 
                      SET               `unit_id` = ". $unit_id1 .";
            $result = mysqli_query($dbc,$sql8) or die(mysqli_error($dbc));


            $sql9   = "INSERT INTO      unit_promoContent 
                      SELECT            0,tmp.* 
                      FROM              tmp;";
            $result = mysqli_query($dbc,$sql9) or die(mysqli_error($dbc));
            $sql10  = "DROP TABLE       tmp;";
            $result = mysqli_query($dbc,$sql10) or die(mysqli_error($dbc));

            # ======================================================= #
            #...and so on...for the rest of the tables to duplicate...#
            # ======================================================= #

    mysqli_close($dbc);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2021-12-11
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多