准备好的语句从多个 table 中选择值并将其插入到单个 table 中

Prepared statement selecting and inserting values from multiple tables into a single table

我正在尝试 select 来自 2 个不同 table 的“演员”、“电影”的值,并将它们插入到新的 table“关系”中。我正在使用 PHP 来执行此操作,但我对如何使用准备好的语句来执行此操作感到很困惑。

$firstNamesForDb = trim($_POST["firstNames"]);  
$lastNameForDb = trim($_POST["lastName"]);
$movieForDb = trim($_POST["movieName"]);  

$selectInsertQuery = "INSERT INTO relationships (actorid, movieid) SELECT actors.actorid, movies.movieid FROM actors, movies WHERE actors.first_names = $firstNamesForDb AND actors.last_name = $lastNameForDb AND movies.title = $movieForDb VALUES(?, ?)";
$statement = $db->prepare($selectInsertQuery);
$statement->bind_param("ii", actorid, movieid);
$statement->execute();

现在我收到错误:

Fatal error: Uncaught Error: Call to a member function bind_param() on bool in D:\Apps\XAMPP\htdocs\iitajax\movies.php:82 Stack trace: #0 {main} thrown in D:\Apps\XAMPP\htdocs\iitajax\movies.php on line 82

第 82 行是 $statement->bind_param("ii", actorid, movieid);

我该如何解决这个问题?

我想你想要:

INSERT INTO relationships (actorid, movieid) 
VALUES (
    (SELECT actorid FROM actors WHERE first_names = ?),
    (SELECT movieid FROM movies WHERE title = ?)
)

请注意,只要两个子查询中的每一个 returns 只有一行,这就是安全的 - 这大概是您的意图。否则,你会得到错误 subquery returns more than one row.

解决方法是使用 insert ... select 语法:

INSERT INTO relationships (actorid, movieid) 
SELECT a.actorid, m.movieid
FROM actors a
CROSS JOIN movies m
WHERE a.first_names = ? AND m.title = ?

不过请注意此语法的含义:如果有多个演员具有相同的名字,或有几部电影具有相同的标题,那么所有这些都将插入到目标 table 中。