我有一个包含 YouTube 播放列表表、视频参考表和以多对多关系连接它们的连接表的数据库。我一直在尝试创建一个 PHP/mysqli 函数,该函数将 YouTube 视频引用添加到“vids”表中,并将播放列表 ID 和视频 ID 插入到联结表中。如果视频已经在 vids 表中,我希望它获取记录 ID,否则插入它并使用 mysqli_stmt_insert_id 之类的东西来返回新 ID。
编辑:我已经删除了我发布的代码,因为它甚至没有接近正确。
我有一个包含 YouTube 播放列表表、视频参考表和以多对多关系连接它们的连接表的数据库。我一直在尝试创建一个 PHP/mysqli 函数,该函数将 YouTube 视频引用添加到“vids”表中,并将播放列表 ID 和视频 ID 插入到联结表中。如果视频已经在 vids 表中,我希望它获取记录 ID,否则插入它并使用 mysqli_stmt_insert_id 之类的东西来返回新 ID。
编辑:我已经删除了我发布的代码,因为它甚至没有接近正确。
终于找到了一种方法来做到这一点,它必须通过多个查询来完成。
这些表的设置使得当您在 vids 表中输入新的 YouTube 视频参考时,它会获得一个自动增量vid_id。联结表list_vid_junc是 MyISAM 并且有 3 列:list_id、vid_id和sort。主键由list_id和sort组成。排序设置为自动增量。这允许列表中同一视频的多个条目,可以通过排序自动增量进行排序。
请注意,在 MyISAM 表中,因为主键索引以这种方式拆分,所以 mySql为每个创建的新列表从 1开始排序自动增量,而不是使每个排序都成为唯一编号,请参阅http://dev.mysql.com/ doc/refman/5.5/en/example-auto-increment.html#id583323。列表 1 可以包含排序 ID 1,2,3,列表 2 也可以包含排序 ID 1,2,3。数字对是唯一的,而不是单个数字。
class DbService {
var $username = "user";
var $password = "password";
var $server = "localhost";
var $port = "3306";
var $databasename = "database";
var $connection;
public function __construct() {
$this->connection = mysqli_connect(
$this->server,
$this->username,
$this->password,
$this->databasename,
$this->port
);
$this->throwExceptionOnError($this->connection);
}
// returns array of (vidID, sort); adds duplicate vids to list if run 2+ times
public function addToPlaylist($ytRef, $listID) {
$stmt = mysqli_prepare($this->connection, "INSERT IGNORE INTO vids(yt_ref) VALUES (?)");
mysqli_bind_param($stmt, 's', $ytRef);
mysqli_stmt_execute($stmt);
$vidID = mysqli_stmt_insert_id($stmt); // 0 if video already exists
mysqli_stmt_free_result($stmt);
if ($vidID == 0) {
$stmt = mysqli_prepare($this->connection, "SELECT vid_id FROM vids WHERE yt_ref = ? LIMIT 1");
mysqli_bind_param($stmt, 's', $ytRef);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $vidID);
mysqli_stmt_fetch($stmt);
mysqli_stmt_free_result($stmt);
}
$stmt = mysqli_prepare($this->connection, "INSERT IGNORE INTO fr_list_vid_junc(vid_id, list_id) VALUES(?, ?)");
mysqli_stmt_bind_param($stmt, 'ii', $vidID, $listID);
mysqli_stmt_execute($stmt);
mysqli_stmt_free_result($stmt);
mysqli_close($this->connection);
$arr = array($vidID, mysqli_stmt_insert_id($stmt));
return $arr;
}
}