我正在学习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();
}

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

但我还需要插入(同时)电影的类型,演员,语言等......它们在数组中并进入不同的表(也可能在不同的行中)。例如,在genres表中包含类型(Action,Crime,Drama)类型的数组,以及actors表中的actor等等......然后我将使用多对多和一对多表来显示信息。

有人可以向我解释如何做到这一点?我需要多次连接数据库?我需要循环?我是PHP和MySQLi的新手,所以请尽量解释。

感谢。

有帮助吗?

解决方案

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 期间生成的值href =“http://php.net/mysqli_insert_id”rel =“nofollow noreferrer”> $ 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()会报告当前会话期间最新的自动生成的值,因此如果您插入到使用自动主键的另一个表,则值会更改。但报告的价值在会议期间保持稳定;如果另一个客户端会话同时进行插入,它 not 会改变。

其他提示

  1. 您只需要一个数据库连接
  2. 是的,你需要循环
  3. 在每个表中使用 auto_increment 主键字段,然后使用 $ stmt-> insert_id()在每个插入后提取值
  4. 如果可以,可以在MySQL服务器上使用 InnoDB 来获取事务支持,然后将 commit 相关更新放在一起,以确保在脚本丢失时数据库保持一致通过更新中途。更常见的 MyISAM 数据库表格式不支持事务。

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

你应该做什么(摘要)是:

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

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

你可能正在使用外键 - 使用基表中的一个ID来识别其他表中的其他关系(在其他表中使用movieid来识别其他值所属的电影等)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top