更新多个表:多对多关系

时间:2012-01-02 16:53:19

标签: php mysql many-to-many

需要帮助更新表格

我有一些数据来自我在数据库中插入的表单。我有5张桌子

  • 产品
  • 过滤
  • product_filter
  • 加热器
  • product_heater

我能够将数据放入“产品”,“过滤器”和“产品”中。 “加热器”表但我不知道如何将数据放入“product_filter”& “product_heater”表。任何教程的任何帮助或指导都表示赞赏。

我的桌子结构:

产品

  • id int(5)
  • 产品文字
  • 费用文字
  • 详情文字

过滤

  • id int(5)
  • 过滤文字
  • imgpath text

product_filter

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

加热器

  • id int(5)
  • 加热器文字
  • imgpath text

product_heater

  • 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....

我的问题是:如何更新product_filter&amp; product_heater表

1 个答案:

答案 0 :(得分:1)

您正在将数据插入产品表中 您需要获取刚刚插入的产品的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 ;

这会将所有加热器ID存储到临时表中,以及当前连接的ID 这可以确保您不会遇到使用其他客户端插入的并发问题。

您可以像这样插入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权限。