1

我正在学习 PHP 和 MySQL,并且正在创建一个用于学习目的的电影网站。

我想将包含电影信息的变量和数组插入数据库但在不同的表中。

这就是我现在所拥有的:

include('inc/connection.php');
$conn = dbConnect();

// create SQL
$sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
    VALUES(?, ?, ?, ?, ?)';

// initialize prepared statement
$stmt = $conn->stmt_init();
if ($stmt->prepare($sql)) {
    // bind parameters and execute statment
    $stmt->bind_param('isiis', $movieid, $title, $year, $runtime, $plot);
    $stmt->execute();
}

这会将变量插入到电影表中。

但我还需要(同时)插入电影的类型、演员、语言等......它们在数组中并进入不同的表(也可能在不同的行中)。例如在流派表中包含流派(动作、犯罪、戏剧)流派的数组,以及在演员表中的演员等等......然后我将使用多对多和一对多表来显示信息。

有人可以向我解释如何做到这一点吗?我需要多次连接数据库??我需要循环吗?我对 PHP 和 MySQLi 真的很陌生,所以请尽可能多地解释。

谢谢。

4

4 回答 4

1
  1. 您只需要一个数据库连接
  2. 是的,您确实需要循环
  3. 在每张表中使用一个auto_increment主键字段,然后在每张表之后使用$stmt->insert_id()提取值insert
  4. 如果可以,请InnoDB在 MySQL 服务器上使用以获取事务支持,然后commit一起进行相关更新,以确保如果您的脚本在更新中途退出,您的数据库是一致的。更常见的MyISAM数据库表格式不支持事务。
于 2009-03-07T15:31:04.017 回答
1

INSERT一次只支持一个表,因此INSERT如果您有复杂的数据进入多个表,您肯定必须执行多个语句。

如果您已插入特定$movieid值,movies那么您知道需要向其他表的行插入什么值,以满足引用完整性(伪代码如下,不是完整功能示例):

$movies_sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
        VALUES(?, ?, ?, ?, ?)';

// execute ($movieid, ...)

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (?, ?)';

foreach ($actorlist as $actorid) {
    // execute ($movieid, $actorid)
}

$lang_sql = 'INSERT INTO movie_languages (movieid, language) 
    VALUES (?, ?)';

foreach ($languagelist as $language) {
    // execute ($movieid, $language)
}

如果您的movies表使用AUTO_INCREMENT主键,那么您可以INSERT通过调用$mysqli->insert_id()或使用内置函数来获取第一次生成的值LAST_INSERT_ID()

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (LAST_INSERT_ID(), ?)';
foreach ($actorlist as $actorid) {
    // execute ($actorid) -- only one param in this INSERT
}

请注意,它会LAST_INSERT_ID()报告当前会话期间最近自动生成的值,因此如果您插入到另一个使用自动主键的表中,则该值会发生变化。但是报告的值在您的会话期间是稳定的;如果另一个客户端会话同时进行插入,它不会改变。

于 2009-03-08T01:45:00.217 回答
0

您不需要使用多个数据库连接——事实上,您根本不应该这样做,因为您无法将插入分组到一个原子事务中。

你应该做的(摘要)是:

BEGIN;
INSERT INTO Genres...;
INSERT INTO Actors...;
INSERT INTO othertable....;
and so on, for referenced columns/tables.
INSERT INTO Movies....;
COMMIT;

这样,您应该始终拥有一致的数据集。

于 2009-03-07T15:02:37.873 回答
0

您可能正在寻找外键 - 使用基表中的一个 ID 来识别其他表中的其他关系(使用其他表中的 movieid 来识别其他值属于什么电影等)

于 2009-03-07T15:44:39.367 回答