2

我有一个包含 YouTube 播放列表表、视频参考表和以多对多关系连接它们的连接表的数据库。我一直在尝试创建一个 PHP/mysqli 函数,该函数将 YouTube 视频引用添加到“vids”表中,并将播放列表 ID 和视频 ID 插入到联结表中。如果视频已经在 vids 表中,我希望它获取记录 ID,否则插入它并使用 mysqli_stmt_insert_id 之类的东西来返回新 ID。

编辑:我已经删除了我发布的代码,因为它甚至没有接近正确。

4

1 回答 1

1

终于找到了一种方法来做到这一点,它必须通过多个查询来完成。

这些表的设置使得当您在 vids 表中输入新的 YouTube 视频参考时它会获得一个自动增量vid_id。联结表list_vid_junc是 MyISAM 并且有 3 列:list_idvid_idsort。主键由list_idsort组成。排序设置为自动增量。这允许列表中同一视频的多个条目,可以通过排序自动增量进行排序。

请注意,在 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;
    }
}
于 2012-11-01T22:12:34.920 回答