对于我的第一次编程尝试,我正在使用php和MySQL制作一个简单的webapp,输入客户信息并存储有关订单的信息。
到目前为止,我已经制作了一个表单来输入客户信息,一个页面来编辑该信息,另一个页面显示不同的客户,这一切都正常。
然而,在尝试实施下一阶段时,我遇到了一个残障。
我有一个包含3列的editcustomers页面。
我目前所拥有的网页代码:
<html>
<?php
$id = $_GET['id'];
require_once('connect.php');
$sth = $dbh->query("SELECT * FROM customers where id = '$id'");
$sth->setFetchMode(PDO::FETCH_ASSOC);
?>
<div id="main">
<div id="left">
<form name="myForm" action ="process.php" method ="post" >
<?php while($row = $sth->fetch()){ ?>
<p><input type = "hidden" name ="id" value="<?php echo $row["id"] ?>"/>
<p><input type = "text" name ="firstName" size ="30" value=" <?php echo $row["firstName"]?>"/>
<p><input type = "text" name ="lastName" size ="30" value="<?php echo $row["lastName"]?>"/>
<p></p>
<input type="submit" value="Update" />
<?php }?>
</div>
<div id="mid">
<p>Amount owed<br />
<input type = "text" name ="moneyOwed" size ="30" /></p>
<input type="submit" value="Pay" />
<p>Number of aaaa<br />
<input type = "text" name ="numAaa" size ="30" /></p>
<p>Number of bbbb<br />
<input type = "text" name ="numBbb" size ="30" /></p>
<p>
<input type="submit" value="Update" />
</div>
<div id="right">
<b>Total Balance</b>
<p> Money owed: </p>
<p> aaa total: </p>
<p> bbb total: </p>
<p> Total: </p>
<input type = "text" name ="pay" size ="20" /></p>
<input type="submit" value="Make Payment" />
</div>
<?php
$dbh =null;
?>
</body>
</html>
我有以下数据库结构:
我遇到的问题是,在我的editcustomerspage中,我有一个数据库查询来读取来自customers表的信息以填充我的第一列中的表单中的字段以及单独的查询来更新它,如果功能选择。
更新第二个表单应该没问题,因为我可以使用隐藏字段来区分表单,但我不确定如何从Customers表和Purchases表中读取信息,以便我可以填充第二个表单中的字段形式..
部分问题是,如果该客户尚未下订单,则购买表对于给定客户可能是空的。
我正在考虑摆脱购买表,并将字段添加到用户表中以解决我的问题,虽然我认为这通常被认为是不好的做法?
产品将在应用程序中修复,不会改变。即便如此,将列名称成本和名称以及每个产品作为记录仍然会更好吗?
我可以采取哪些方法来解决这个问题?
答案 0 :(得分:1)
由于列numProductA,numProductB,即使您目前正在做的事情也被认为是不好的做法。如果您拥有1000种产品且用户从所有产品中订购不同的金额,会发生什么。只有当产品列表被修复(即编码到应用程序中)并且需要大量编码时,这才起作用。
您可能希望创建一个purchase_item表,其中包含以下字段:id,purchase_id,product_id,num_product。它就像标准账单上的一条线:purchase_id标识该线所属的账单; product_id将显示该行的产品,num_product将显示该行的金额(乘数)。
通过这种方式,您可以在将新产品添加到数据库时更改代码。
答案 1 :(得分:0)
如果没有详细描述您遇到的问题,很难说如何修复它们。应该可以用所描述的设计实现你想要的东西。但是,您似乎误解了关系数据库,这就是为什么您的数据库体系结构令人惊讶的原因。
数据库表不是电子表格。虽然表可以有数百万行,但列数通常限制为更小的数量。即使限制不是问题,关系数据库的设计方式也不适合在大量列中存储统一数据。例如,您的数据库将无法回答诸如“什么是最畅销的产品”,“超过100个客户购买了哪些产品”等问题。
经验法则是每个表应包含固定数量的列。如果您发现自己需要添加列,例如开始销售新产品,你做错了。
以下是您应用程序中应该执行的操作:
products
应该是每个可用产品一行的表格,每个产品都包含一个唯一的id
,价格和其他信息,如名称,制造商等。purchases
应包含一行。行shouuld包含客户ID,产品ID和订购数量。使用SQL,您可以轻松构建一个查询,生成由特定客户订购的产品集。使用联接,可以使用产品名称和价格来增强此信息。