Ошибка mysqli_insert_id с mysqli_multi_query

Проект:

Дублирование данных строки в нескольких связанных таблицах.

Проблема:

В php я не смог получить результат от mysqli_insert_id после использования 1-го mysqli_multi_query.

Статус:

Я успешно запросил следующее с помощью 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 успешно дублирует первую таблицу … 2-й 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));

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* это переменная, которая представляет начальный 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]