-1

私はPHPとデータベースにかなり慣れていないので、必要なデータベースの作成に問題があります。ここの誰かが私を助けてくれることを願っています!おそらく非常に愚かな質問です...

私がやろうとしているのは、非常に単純なムービーライブラリを作成し、phpmyadmin内からテーブルを作成することです。このためのPHPコードはまだ書き始めていませんが、データベーステーブルを正しく作成したことを確認したいだけです。

ID、TITLE、DIRECTOR、YEAR、CATEGORY_IDのフィールドで1つのテーブル(MOVIES)を実行しています。

このテーブルは、カテゴリの別のテーブルとの関係を持っている必要があります。したがって、最初のテーブルのCATEGORY_IDフィールドは、カテゴリを格納するテーブルに接続する必要があります。

CATEGORY_IDフィールドに問題があります。最初のIDフィールドがプライマリおよび自動インデントとして設定されているため、CATEGORY_IDフィールドにそれを設定することはできません。したがって、phpmyadmin内からテストとして映画を追加すると、カテゴリIDのID番号0が取得されます。

私が行ったテーブルレイアウトを表示するためだけに:

MOVIE TABLE-ID(主キー、自動インデント)、TITLE、DIRECTOR、YEAR、CATEGORY_ID
CATEGORY TABLE-CATEGORY_ID、CATEGORY

4

3 に答える 3

1

完全な助けを得るには、もう少し勉強する必要があります。グーグルをして、次のような記事を読むことをお勧めします。

http://www.sitepoint.com/mysql-foreign-keys-quicker-database-development/

[編集]

質問を編集し、必要な変更を加えていただき、ありがとうございます。

サンプルデータベーススキーマ

カテゴリ表

CATEGORY_ID int auto_increment (11) (primary key)
CATEGORY

映画の表:

ID int auto_increment (Primary Key) 
TITLE, 
DIRECTOR, 
MOVIE_YEAR
CATEGORY_ID int(11) (Foreign Key)

これで、外部キーの意味がわかります。上記のスキーマは、質問とサンプルに基づいています。年の列の名前を変更しただけです。予約語と競合する可能性のある単語や名前には注意が必要です。私はそれをMOVIE_YEARと呼んだ。TITLEフィールドは一意ではありません。その必要はありません。必要に応じて重複を防ぐために、データベースに一致するものを照会できます。しかし、2つの映画が同じ名前である可能性があるので、それらのIDはそれらを区別する必要があります。

Mysql

テーブルに2つの自動インクリメント列は必要ありません。カテゴリテーブルを作成し、カテゴリの値をロードすることから始めます。Id列は自動インクリメントする場合としない場合があります。そうでない場合は、手動でIDを指定する必要があります。次に、moviesテーブルを作成します。あなたは1対多の関係をしています。つまり、1つのカテゴリが映画テーブルの多くの映画と一致する可能性があります。したがって、0があれば、エラーは発生しません。この問題は、PHPスクリプトによって解決されます。列はnull以外に設定されている可能性があるため、デフォルト値が提供されます。

PHPスクリプティング

PHPでは、カテゴリテーブルからドロップダウン選択やクリック可能なリンクなどに値をプルして、非表示のフォーム要素に渡すコードを作成します。選択を使用すると、より速くなる可能性があります(以下の例を参照)。新しいムービーを追加するために必要なselectおよびその他のフォーム要素は、1つのhtmlフォームになります。したがって、フォームを送信すると、データがムービーテーブルに追加されます。そのデータには、ユーザーが挿入しているcategory_idが含まれます。これにより、現在の0が置き換えられます。

選択ドロップダウンの作成

category_id列をnull以外に設定した場合、0の方が幸せです。何も奇妙なことはありません。更新中、同じプロセスが繰り返されます。選択には、以下に示すような特別な形式があることに注意してください。

<?php while($row = mysqli_fetch_assoc($connection, $recordset)){ ?>
    <select name='category_id' id='categories_id'>
        <options value='<?php echo $row['category_id'] ?>'><?php echo $row['category_name'] ?></option>
    </select>
<?php } ?>

これらの値はデータベースから取得する必要があり、選択メニューに入力されます。これで始められるはずです。したがって、現在使用しているデータベースを使用して、PHP側で作業してみてください。PHPコードをお持ちの場合は、それを表示して、すべてを微調整することができます。

賛成票と反対票を忘れてください、私たちはここで競争に参加していません。それは評判と呼ばれます。たくさんあるようです。:)

レコードの表示

表示は難しい部分です。そこで参加する必要があります。次の行の何か:

$sql='SELECT * FROM movies LEFT JOIN category ON movies.category_id = category.id';
$recordset_all = mysqli_query($connection, $sql);

そのようなものはあなたに映画のすべての記録とカテゴリーの一致する記録を与えるでしょう。そうすれば、すべての映画で機能するカテゴリ名が得られます。また、列名の競合はないように思われるため、すべて問題ないはずです。一致する行のみが必要な場合は、LEFTという単語を削除して、映画の外部キーと一致するcategory_idを持たない映画が選択されないようにします。

小見出し

カテゴリ名の小見出しに行をロードする場合は、ケースが複雑になります。この場合、2つのデータベース選択を実行し、対応する映画を呼び出して返す関数を作成する必要があります。より良い方法があるかもしれません。必要に応じて、その部分に来たら修正します。

于 2013-03-05T21:45:10.970 に答える
0

あなたが探しているかもしれませんINNER JOIN

SELECT ... FROM table1 t1
INNER JOIN table2 t2 ON t1.key = t2.key
WHERE ...

テーブル結合の詳細については、こちらをご覧ください。

列名の前にテーブルのエイリアスを付けることを忘れないでください(この場合、エイリアスはt1t2

お役に立てれば。

編集:これは、categoryIDを更新し、後で内部結合を使用して選択するために使用できるサンプル更新および選択クエリです。

UPDATE MovieTable 
SET categoryID = (number here)
WHERE (use unique identifier like ID or Title if it is unique) = (value)


SELECT my.Title FROM MovieTable mt
INNER JOIN CategoryTable ct ON mt.categoryID = ct.categoryID
WHERE ct.categoryID = (value)
于 2013-03-05T21:39:29.867 に答える
0

これは、1対多の関係の非常に一般的なデータベース設計の例です。CATEGORIESには、MOVIESを関連付けるために使用される主キーがあり、FOREIGNKEYステートメントを使用していることに注意してください。TITLEは一意でなければならないことにも注意してください(私は推測しています)。

create table CATEGORIES (
  ID int not null auto_increment,
  Description varchar(100),
  PRIMARY KEY (ID)
  );
create table MOVIES(
  ID int not null auto_increment,
  TITLE varchar(30),
  DIRECTOR varchar(30),
  YEAR datetime,
  CATEGORY_ID int,
  PRIMARY KEY (ID),
  UNIQUE KEY (TITLE),
  FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORIES(ID)
) 
于 2013-03-05T21:48:36.873 に答える