2

YouTubeプレイリストのテーブル、ビデオ参照のテーブル、および多対多の関係でそれらを接続するジャンクションテーブルを含むデータベースがあります。YouTubeビデオ参照を「vids」テーブルに追加し、プレイリストIDとビデオIDをjunctionテーブルに挿入するPHP/mysqli関数を作成しようとしています。ビデオがすでにvidsテーブルにある場合は、レコードIDを取得する必要があります。そうでない場合は、ビデオを挿入し、mysqli_stmt_insert_idなどを使用して新しいIDを返します。

編集:投稿したコードは、正確に近いものではなかったため、削除しました。

4

1 に答える 1

1

最後にこれを行う方法を見つけました、そしてそれは複数のクエリで行われなければなりません。

テーブルは、新しいYouTubeビデオ参照をvidsテーブルに入力すると、自動インクリメントvid_idを取得するように設定されています。ジャンクションテーブルlist_vid_juncはMyISAMであり、 list_idvid_idsortの3つの列があります。主キーはlist_idsortで構成されています。sortはautoincrementに設定されています。これにより、リスト内の同じビデオの複数のエントリが可能になり、並べ替えの自動インクリメントで並べ替えることができます。

MyISAMテーブルでは、主キーインデックスがこのように分割されているため、mySqlは、すべての並べ替えを一意の番号にするのではなく、作成される新しいリストごとに1から並べ替えの自動インクリメントを開始することに注意してください。http://dev.mysql.com/を参照してください。 doc / refman / 5.5 / en / example-auto-increment.html#id583323。リスト1には1、2、3のソートIDを含めることができ、リスト2には1、2、3のソートIDを含めることもできます。番号のペアは、個々の番号ではなく一意です。

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 に答える