-1

我对 PHP 和数据库还很陌生,在创建我需要的数据库时遇到了一些问题。我希望这里有人可以帮助我!可能是一个非常愚蠢的问题......

我要做的是创建一个非常简单的电影库并从 phpmyadmin 中创建表。我还没有开始为此编写任何 PHP 代码,我只是想确保我正确地创建了数据库表。

我正在使用以下字段制作一张表(电影):ID、TITLE、DIRECTOR、YEAR 和 CATEGORY_ID。

该表应该与另一个类别表有关系。所以第一个表中的 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 字段不是唯一的。没有必要这样做。如果需要,为了防止重复,您可以查询数据库以查找匹配项。但是看到两部电影可能有相同的名字,他们的 id 应该把它们区分开来。

mysql

您不需要表中的两个自动增量列。首先创建类别表并加载类别的值。Id 列可以是自动增量,也可以不是。如果不是,您必须手动提供 ID。然后创建电影表。你正在做一对多的关系。意思是,一个类别可以匹配电影表中的许多电影。所以有 0 没有错误。该问题将由您的 PHP 脚本解决。该列可能设置为不为空,因此提供了默认值。

PHP 脚本

在 PHP 中,创建代码以将类别表中的值提取到下拉选择或可点击链接之类的内容中,并将它们传递给隐藏的表单元素。使用 select 可能会更快(参见下面的示例)。添加新电影所需的 select 和其他表单元素将采用一个 html 表单。因此,当您提交表单时,它会将数据添加到电影表中。该数据将携带用户正在插入的 category_id。这将取代您现在拥有的 0。

创建选择下拉菜单

如果您将 category_id 列设置为不为空,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匹配外键的电影就不会被选中。

子标题

如果您打算在类别名称的子标题中加载行,您的情况会变得复杂。在这种情况下,您必须进行两次数据库选择并创建一个函数来调用和返回相应的电影。可能有更好的方法。如有必要,我们会在您到达该部分时解决该问题。

于 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

这是一个非常常见的一对多关系数据库设计的示例。注意 CATEGORIES 有一个用于关联 MOVIES 的主键,它使用 FOREIGN KEY 语句。另请注意,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 回答