我有一个数据库,其中包含用于YouTube视频引用的表格,一个播放列表表格以及以多对多关系连接它们的联结表格。我一直在尝试创建一个PHP / mysqli函数,它将YouTube视频引用添加到“vids”表中,并将播放列表ID和视频ID添加到联结表中。如果视频已经在vids表中,我希望它获取ID,否则插入它并使用类似mysqli_stmt_insert_id的内容来返回新的ID。
我使用各种mysqli函数重写了几十次,无法使其正常工作。这是一个Flex应用程序,我不太了解PHP或mysqli,但是将它分解为3个更简单的函数,并发现它仍然无效。
编辑:我删除了我发布的代码,因为它甚至没有接近正确。
当然它应该比这更简单很多!任何人都可以解释这个或推荐一个函数/教程/示例来帮忙吗?到目前为止,我已经浪费了6天试图破解php.net的文档,现在想知道mysqli是否能够插入多对多关系。感谢。
答案 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;
}
}
我相信有很多方法可以改进,所以欢迎任何建议。