检查mysql插入查询

时间:2013-05-19 22:16:28

标签: php mysql sql mysqli

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

第一个我必须插入由特定供应商提供并由特定生产商生产的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信息。我该怎么做?

enter image description here

另外,我的数据输入表格如下:

<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">

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

1 个答案:

答案 0 :(得分: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,则执行insert。

<强>更新 现在,在查看你的html格式时,我想我明白你在寻找什么......

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

您可以通过在CD表中添加和supplier_id-column以及在CD表中添加producer_id **列来实现此关系

AND

Supplier-table和Producer-table中的autoincremental id。

实际数据库的最后一步是在supplier-table的supplier_id和id-column以及producer-table的producer_id和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? 您可以在所有三个表中插入所有值而不在表之间使用引用(ids),但是没有关系数据库的意义。之后进行所有SQL操作也会困难得多。假设你想要一张与他们的生产商和供应商合作的所有CD的清单。

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

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

只需获取行。

没有这些参考,没有好办法做同样的事情。 (db不可能知道producer-table中哪一行属于CD表中哪一行而没有任何引用)。你当然可以在CD表中添加生产商和供应商的名称,但是那时会有重复,并且在大多数情况下你不需要它(在某些极端情况下,速度它将是唯一的选择虽然有这些重复)。

我希望我现在更清楚了。