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]);
您的艺术家陈述也是如此。
我正在创建一个存放音乐专辑的网站。当用户点击专辑时,它将把他们带到显示所有曲目和关于该专辑的信息的页面。但是,在主相册页面上,它显示了通过将一对 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]);
您的艺术家陈述也是如此。