使用PHP / mysqli进行多对多插入查询

时间:2012-10-30 04:48:54

标签: php insert mysqli many-to-many junction

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

我使用各种mysqli函数重写了几十次,无法使其正常工作。这是一个Flex应用程序,我不太了解PHP或mysqli,但是将它分解为3个更简单的函数,并发现它仍然无效。

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

当然它应该比这更简单很多!任何人都可以解释这个或推荐一个函数/教程/示例来帮忙吗?到目前为止,我已经浪费了6天试图破解php.net的文档,现在想知道mysqli是否能够插入多对多关系。感谢。

1 个答案:

答案 0 :(得分:1)

最后找到了一种方法来实现这一点,并且必须通过多个查询来完成。

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

请注意,在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;
    }
}

我相信有很多方法可以改进,所以欢迎任何建议。