使用PHP和MySQLi在不同的数据库表中插入变量和数组
-
05-07-2019 - |
题
我正在学习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 会改变。
其他提示
- 您只需要一个数据库连接
- 是的,你需要循环
- 在每个表中使用
auto_increment
主键字段,然后使用$ stmt-> insert_id()
在每个插入后提取值代码>
- 如果可以,可以在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来识别其他值所属的电影等)。