1

我写了一个查询,但现在我有疑问。

第一个我必须插入由特定供应商提供并由特定生产商生产的 CD。

$sql="INSERT INTO cd (supplier_name, 
                      supplier_address, 
                      producer_name, 
                      producer_address, 
                      cd_title, 
                      cd_type, 
                      cd_year) 
             VALUES ('$_POST[supp_name]', 
                     '$_POST[supp_addr]', 
                     '$_POST[prod_name]', 
                     '$_POST[prod_addr]', 
                     '$_POST[cd_title]', 
                     '$_POST[cd_year]' , 
                     '$_POST[cd_type]')";

但后来我意识到,我有一个名为 CD 的表,只有三个属性、标题、年份和类型。CD(标题、年份、类型)。但是,我如何只需要插入特定供应商 X 和特定生产商 Y 的 CD 信息。我该怎么做?

在此处输入图像描述

此外,我的数据输入表单如下所示:

<form action="cd.php" method="post">
<h4> Enter CD information </h4> 
CD Title: <input type="text" name="cd_title"><br>
CD Year: <input type="text" name="cd_year"><br>
CD Type: <input type="text" name="cd_type"><br>

<h4>Enter supplier information</h4>
Supplier Name:  <input type="text" name="supp_name"><br>
Supplier Address:<input type="text" name="supp_addr"><br>


<h4> Enter producer information </h4> 
Producer Name:<input type="text" name="prod_name"><br>
roducer Address:<input type="text" name="prod_addr"><br>

<input type="submit" name="submit" value="Submit">

所以,我想知道如果用户输入了上述数据,它会存储在哪里?在什么桌子下面?(也就是说,供应商和生产商信息存储在哪里?

4

1 回答 1

1

我不确定你的意思,但我会试一试:

尝试使用连接到供应商和生产者表的选择:

SELECT * FROM CD
JOIN Supplier S ON CD.Supplied = S.Supplied
JOIN Producer P ON CD.Produced = P.Produced
WHERE S.name = X AND P.name = Y

如果上述查询返回 true,则执行插入。

更新: 现在在查看您的 html 表单时,我想我明白您在寻找什么......

您想要 CD-table 和 Producer-table 之间的关系以及 CD-table 和 Supplier-table 之间的关系。

您可以通过在 CD 表中添加和 supplier_id-column 以及在 CD 表中添加 producer_id**-column 来建立这种关系

供应商表和生产者表中的自动增量 ID。

实际数据库的最后一步是在supplier_id 和supplier-table 的id-column 和producer_id 和producer-table 的id-column 之间创建约束。

完成后,您可能会执行以下操作:

//When form is submitted...


//First query  (Insert this only if it doesn't already exist in Supplier-table - IGNORE keyword takes care of this)
$sql1="INSERT IGNORE INTO Supplier (supplier_name, 
                      supplier_address) 
             VALUES ('$_POST[supp_name]', 
                     '$_POST[supp_addr]', 
                     )";

//Execute query $sql1
//Get last inserted id from query $sql1 and store it in $idLastInsertedSupplier


//Second query  (Insert this only if it doesn't already exist in Producer-table - IGNORE keyword takes care of this) 
$sql2="INSERT IGNORE INTO Producer (producer_name, 
                      producer_address) 
             VALUES ('$_POST[prod_name]', 
                     '$_POST[prod_addr]')";

//Execute query $sql2
//Get last inserted id from query $sql2 and store it in $idLastInsertedProducer

//Insert CD-table query: 
    $sql="INSERT INTO CD (
                          cd_title, 
                          cd_type, 
                          cd_year,
                          supplier_id,
                          producer_id
                          ) 
   VALUES ('$_POST[cd_title]', 
                         '$_POST[cd_year]' , 
                         '$_POST[cd_type]',
$idLastInsertedSupplier,$idLastInsertedProducer)";

当然,您应该在 PDO 或 Mysqli 中使用准备好的语句(带占位符)。我没有考虑 SQL 的安全性(不使用占位符,不清理数据等)。

为什么是身份证? 您可以将所有值插入到所有三个表中,而表之间没有引用(id),但这样就没有关系数据库了。之后执行所有 SQL 操作也会困难得多。假设您想要一份所有 cd 及其生产商和供应商的列表。

使用关系存储(使用它们的 id),您可以执行如下 sql 语句:

SELECT * FROM CD
JOIN Supplier S ON CD.id = S.id
JOIN Producer P ON CD.id = P.id

并获取行。

如果没有这些参考资料,就没有做同样事情的好方法。(数据库不可能在没有任何参考的情况下知道生产者表中的哪一行属于 CD 表中的哪一行)。您当然也可以在 CD 表中添加生产商和供应商的名称,但是会有重复,并且在大多数情况下您不希望这样(在某些极端情况下,为了速度,这将是唯一的选择虽然有这些重复)。

我希望我现在说得更清楚了。

于 2013-05-19T22:49:09.580 回答