0

プログラミングの最初の試みとして、顧客情報を入力し、注文に関する情報を保存するために、php と MySQL を使用して単純な Web アプリケーションを作成しています。

これまでのところ、顧客情報を入力するためのフォーム、その情報を編集するためのページ、およびさまざまな顧客を表示するための別のページを作成しましたが、すべて正常に機能しています。

ただし、次の段階を実装しようとすると、切り株に遭遇しました。

3 列の editcustomers ページがあります。

  • 列 1 は、編集可能な顧客情報を含むフォームを示しています。
  • 列 2 では、製品を注文し、注文した製品の数を表示できます
  • 列 3 は、これまでに支払われた合計と未払いの合計を示しています。

私が現在持っているページのコード:

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

次のデータベース構造があります。

  • 顧客テーブル、名、姓などの基本情報と id フィールド。
  • さまざまな製品を一覧表示する製品テーブル。各製品のコストを含む行は 1 つだけです。
  • 注文された各製品の数量を示す id フィールド、numProductA、numProductB などのフィールドを持つ購入テーブル

私が抱えている問題は、editcustomerspage に、customers テーブルから情報を読み取って最初の列のフォームのフィールドに入力するデータベース クエリと、関数が選択された場合にそれを更新する別のクエリがあることです。

非表示フィールドを使用してフォームを区別できるため、2 番目のフォームを更新しても問題ありませんが、2 番目のフォームにフィールドを入力できるように、Customers テーブルと Purchases テーブルから情報を読み取る方法がわかりません。

問題の一部は、特定の顧客がまだ注文していない場合、その顧客の purchases テーブルが空になる可能性があることです。

購入テーブルを取り除き、フィールドを users テーブルに追加して問題を解決することを検討していましたが、それは一般的に悪い習慣と考えられていますか?

製品はアプリケーション内で固定され、変更されることはありません。それでも列名はコストと名前と各製品をレコードとして持った方が良いでしょうか?

この問題を解決するために私が取ることができるいくつかのアプローチは何ですか?

4

2 に答える 2

1

列 numProductA、numProductB のために、現在行っていることでさえ悪い習慣と見なされます。1000 個の製品があり、ユーザーがそれらすべてから異なる金額を注文するとどうなるでしょうか。これは、製品のリストが固定されている (つまり、アプリケーションにコード化されている) 場合にのみ機能し、多くのコーディングが必要です。

おそらく、id、purchase_id、product_id、num_product などのフィールドを持つ purchase_item テーブルを作成することをお勧めします。これは、標準の請求書の行のようなものです。purchase_id は、その行が属する請求書を識別します。product_id はその行の製品を示し、num_product はその行の金額 (乗数) を示します。

この方法では、新しい製品がデータベースに追加されたときにコードを変更する必要はありません。

于 2012-11-25T20:11:21.650 に答える
0

遭遇した問題の詳細な説明がなければ、それらを修正する方法を言うのは困難です. 説明した設計で必要なものを実装できるはずです。しかし、あなたはリレーショナル データベースを誤解しているようです。それが、あなたのデータベース アーキテクチャが眉をひそめている理由です。

データベース テーブルはスプレッドシートではありません。テーブルには何百万もの行を含めることができますが、通常、列の数ははるかに少ない数に制限されています。制限が問題にならない場合でも、リレーショナル データベースの設計方法は、多数の列にわたる均一なデータの格納には適していません。たとえば、データベースは、「最も売れている製品は何か」、「100 人以上の顧客が購入した製品はどれか」などの質問に答えることができません。

経験則として、各テーブルには一定数の列を含める必要があります。たとえば、新製品の販売を開始するときに列を追加する必要があることがわかった場合、それは間違っています。

アプリケーションでおそらく行うべきことは次のとおりです。

  • products利用可能な製品ごとに 1 つの行を持つテーブルで、製品ごとに固有idの 、価格、および名前、メーカーなどのその他の情報を含む必要があります。
  • purchases顧客が製品を注文した (顧客、製品) の組み合わせごとに 1 つの行を含める必要があります。行には、顧客 ID、製品 ID、および注文数量が含まれている必要があります。

SQL を使用すると、特定の顧客が注文した一連の製品を生成するクエリを簡単に作成できます。結合を使用すると、この情報を製品名と価格で強化できます。

于 2012-11-25T20:21:01.930 に答える