Обновление нескольких таблиц: отношение «многие ко многим» - PullRequest
1 голос
/ 02 января 2012

Нужна помощь в обновлении таблиц

У меня есть массив данных из формы, которую я вставляю в свою БД.У меня есть 5 таблиц

  • product
  • filter
  • product_filter
  • нагреватель
  • product_heater

Я могу поместить данные в таблицы "product", "filter" & "heater", но я не знаю, как поместить данные в таблицу "product_filter" & "product_heater".Приветствуется любая помощь или направление к любым учебникам.

Структура моих таблиц:

product

  • id int (5)
  • текст продукта
  • текст стоимости
  • подробный текст

фильтр

  • id int (5)
  • фильтр текста
  • текст imgpath

product_filter

  • id int (5)
  • id_product int (5)
  • id_filter int (5)

нагреватель

  • id int (5)
  • текст нагревателя
  • текст imgpath

нагреватель продукта

  • id int (5)
  • id_product int (5)
  • id_heater int (5)

Я хочу иметь

  • отношение «многие ко многим» между продуктом & нагреватель
  • отношение «многие ко многим» между продуктом & Фильтром

Здеськод:

PHP Syntax (Toggle Plain Text)
// Product data Update
$name = mysql_real_escape_string($_POST['product']);
$cost = mysql_real_escape_string($_POST['cost']);
$details = mysql_real_escape_string($_POST['details']);

$sql_title = "INSERT INTO product (
            id ,
            product ,
            cost ,
            details ,
            )
            VALUES (
            NULL , '$name' , '$cost' , '$details')";
if (!mysql_query($sql_title,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "records for product added<br />";         


// Filter update
// This is the array which is coming from the form
/*
    filtername
   Array ( [0] => ehiem 
            [1] => Hagan 
            [2] => Rena 
            [3] => jobo ) 

 filterimg
    Array ( [0] => img1.jpg 
            [1] => img2.jpg 
            [2] => img3.jpg 
            [3] => img4.jpg )
*/

$filtername = mysql_real_escape_string($filtername);
$filterimgpath = mysql_real_escape_string($filterimg);
$combined_array = array_combine($filtername, $filterimgpath);
$values = array();
foreach ($combined_array as $filtername => $filterimgpath)
{
    $values[] = "('$filtername', '$filterimgpath')";
}
$sql = "INSERT INTO filter (filter , imgpath) VALUES " . implode(', ', $values);
//echo $lastid = mysql_insert_id()."<br />";
if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "records added<br />";

//Product Filter Update table
    // This is where Im stuck. Not able to even think of anything....


// heater update
// This is the array which is coming from the form
/*
    heatername
  Array ( [0] => ehiem 
            [1] => Dolphin 
            [2] => Rena 
            [3] => jobo ) 

 heaterimg
    Array ( [0] => img1.jpg 
            [1] => img2.jpg 
            [2] => img3.jpg 
            [3] => img4.jpg )
*/

$heatername = mysql_real_escape_string($heatername);
$heaterimgpath = mysql_real_escape_string($heaterimg);
$combined_array = array_combine($heatername, $heaterimgpath);
$values = array();
foreach ($combined_array as $heatername => $heaterimgpath)
{
    $values[] = "('$heatername', '$heaterimgpath')";
}
$sql = "INSERT INTO heater (heater , imgpath) VALUES " . implode(', ', $values);
//echo $lastid = mysql_insert_id()."<br />";
if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "records added<br />";

//Product heater Update table
    // This is where Im stuck. Not able to even think of anything....

мой вопросn: как обновить таблицы product_filter & product_heater ?

1 Ответ

1 голос
/ 03 января 2012

Вы вставляете данные в таблицы продуктов.
И вам нужно получить auto_increment_id для продуктов, которые вы только что вставили.
Это сложно, если вы вставляете несколько элементов.

Однако у вас есть одна запись для продукта, так что это просто:

Добавьте следующее после того, как вы вставите свой продукт:

echo "records for product added<br />";    
$get_product_id = "SELECT LAST_INSERT_ID() as product_id";
$result = mysql_query($get_product_id);
$row = mysql_fetch_array($result);
$product_id = $row['product_id'];
echo "product_id is: ".$product_id;

Один из способов получения обогревателязначения должны добавить триггер к вашей таблице нагревателей:

DELIMITER $$

CREATE TRIGGER ai_heater_each AFTER INSERT ON heater FOR EACH ROW
BEGIN
  INSERT INTO heater_inserts (heater_id, conn_id) VALUES (new.id, CONNECTION_ID());
END $$

DELIMITER ;

Это сохранит все идентификаторы нагревателей во временной таблице вместе с идентификатором текущего соединения.
Это гарантирует, что вы этого не сделаетестолкнуться с проблемами параллелизма, когда вы используете вставки от других клиентов.

Вы можете вставить таблицу product_heater следующим образом:

INSERT INTO product_heater (id_product, id_heater) 
SELECT $product_id, hi.heater_id FROM heater_inserts hi
WHERE hi.conn_id = CONNECTION_ID();

Не забудьте очистить таблицу heater_inserts, когда закончите.

DELETE FROM heater_inserts WHERE conn_id = CONNECTION_ID();

Вы можете использовать временные таблицы, которые не требуют очистки и не требуют connection_id, потому что они уникальны для сеанса, но в этом случае вам нужно создать таблицу в начале сеанса.
Также обратите вниманиечто временная таблица разрушается при разрыве соединения, поэтому вам нужно добавить некоторый шаблонный код, чтобы справиться с этим.

Вы можете использовать ключевое слово TEMPORARY при создании таблицы.Таблица TEMPORARY видна только текущему соединению и автоматически удаляется при закрытии соединения.Это означает, что два разных соединения могут использовать одно и то же временное имя таблицы, не конфликтуя друг с другом или с существующей, не являющейся TEMPORARY, таблицей с одним и тем же именем.(Существующая таблица скрыта до тех пор, пока временная таблица не будет удалена.) Для создания временных таблиц у вас должна быть привилегия CREATE TEMPORARY TABLES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...