PHP PDO更新加入table

PHP PDO update a joined table

我正在创建一个存放音乐专辑的网站。当用户点击专辑时,它将把他们带到显示所有曲目和关于该专辑的信息的页面。但是,在主相册页面上,它显示了通过将一对 table 连接在一起而在查询中收集的信息。我不明白在处理多个 table 时如何使用 UPDATE 语句更新 table 的信息。我想我可以 运行 分离查询并一个接一个地执行它们。在代码的最底部(在 // execute the album update query 下),我能够执行 $album_statement 但随后出现错误:

    Fatal error: Uncaught PDOException: SQLSTATE[HY093]: 
    Invalid parameter number: 
    number of bound variables does not match number of tokens

我不明白这个错误。我是 PHP 和 PDO 的新手。我以为我需要绑定参数,但是当我尝试 Binding multiple values in pdo 所说的时,我仍然在同一个地方遇到同样的错误。

    // execute the album update query
    $album_statement->execute(array(':album_name' => $album_name, 
                                    ':record_label' => $record_label, 
                                    ':release_date' => $release_date, 
                                    ':album_id' => $album_id));
    $genre_statement->execute(array(':genre' => $genre));
    $artist_statement->execute(array(':stage_name' => $stage_name));

这是我的代码。

    // grabbing the id of the album that was selected to be edited
        $album_id = $_GET['album_id'];
        $sql = 'SELECT albums.album_id, albums.genre_id, albums.album_name, 
                       artists.stage_name, genres.genre, albums.record_label, 
                       albums.release_date 
                FROM Albums 
                  JOIN Artists ON Albums.artist_id = Artists.artist_id
                  JOIN Genres ON Albums.genre_id = Genres.genre_id
                    WHERE album_id = :album_id';
        
        // prepare the query
        $statement = $connection->prepare($sql);
        $statement->execute([':album_id' => $album_id]);
        $album = $statement->fetch(PDO::FETCH_OBJ);
        
        // if all values are set, assign them to variables
        if (isset($_POST['album_name']) && 
            isset($_POST['stage_name']) && 
            isset($_POST['genre']) && 
            isset($_POST['record_label']) && 
            isset($_POST['release_date'])) {
          $album_name = $_POST['album_name'];
          $stage_name = $_POST['stage_name'];
          $genre = $_POST['genre'];
          $record_label = $_POST['record_label'];
          $release_date = $_POST['release_date'];
        
          $album_update = 'UPDATE albums SET album_name=:album_name, record_label=:record_label, release_date=:release_date WHERE album_id=:album_id'; 
          $album_statement = $connection->prepare($album_update);
          $genre_update = 'UPDATE genres SET genre=:genre WHERE albums.genre_id=:album_id';
          $genre_statement = $connection->prepare($genre_update);
          $artist_update = 'UPDATE artists SET stage_name=:stage_name WHERE artist_id=:album_id';
          $artist_statement = $connection->prepare($artist_update);
        
          // execute the album update query
          $album_statement->execute([':album_name' => $album_name, ':record_label' => $record_label, ':release_date' => $release_date, ':album_id' => $album_id]);
          $genre_statement->execute([':genre' => $genre]);
          $artist_statement->execute([':stage_name' => $stage_name]);
        
          header("Location: index.php");
        }

这里有2个占位符,:genre:album_id

$genre_update = 'UPDATE genres SET genre=:genre WHERE albums.genre_id=:album_id';

但是您只向执行语句提供了一个。

$genre_statement->execute([':genre' => $genre]);

您只需传递所有参数即可。

$genre_statement->execute([':genre' => $genre, ':album_id' => $album_id]);

您的艺术家陈述也是如此。