문제

PHP와 MySQL을 배우고 학습 목적으로 영화 웹 사이트를 만들고 있습니다.

영화 정보가 포함 된 변수와 배열을 데이터베이스에하지만 다른 테이블에 삽입하고 싶습니다.

이것이 제가 지금 가지고있는 것입니다.

include('inc/connection.php');
$conn = dbConnect();

// create SQL
$sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
    VALUES(?, ?, ?, ?, ?)';

// initialize prepared statement
$stmt = $conn->stmt_init();
if ($stmt->prepare($sql)) {
    // bind parameters and execute statment
    $stmt->bind_param('isiis', $movieid, $title, $year, $runtime, $plot);
    $stmt->execute();
}

이렇게하면 변수를 영화 테이블에 삽입합니다.

그러나 영화의 장르, 배우, 언어 등을 (동시에) 삽입해야합니다. 그들은 배열에 있으며 다른 테이블로 들어갑니다 (아마도 다른 행으로도). 예를 들어 장르 테이블의 장르 (액션, 범죄, 드라마) 장르를 포함하는 배열과 배우 테이블의 배우가 ... 나는 많은 마니와 일대일 테이블을 사용합니다. 정보를 표시합니다.

누군가 나에게 어떻게 이것을하는지 설명 할 수 있습니까? 데이터베이스에 여러 번 연결해야합니까 ?? 루프가 필요 해요? 저는 PHP와 MySQLI를 처음 접 했으므로 가능한 한 많이 설명해주십시오.

감사.

도움이 되었습니까?

해결책

INSERT 한 번에 하나의 테이블 만 지원하므로 여러 가지를 실행해야합니다. INSERT 문장 여러 테이블에 들어가는 복잡한 데이터가있는 경우.

특정 것을 삽입 한 경우 $movieid 가치 movies 그런 다음 참조 무결성을 만족시키기 위해 다른 테이블의 행에 삽입해야 할 값을 알고 있습니다 (Pseudocode는 완전히 기능적 인 예제가 아닙니다) :

$movies_sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
        VALUES(?, ?, ?, ?, ?)';

// execute ($movieid, ...)

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (?, ?)';

foreach ($actorlist as $actorid) {
    // execute ($movieid, $actorid)
}

$lang_sql = 'INSERT INTO movie_languages (movieid, language) 
    VALUES (?, ?)';

foreach ($languagelist as $language) {
    // execute ($movieid, $language)
}

당신의 경우 movies 테이블을 사용합니다 AUTO_INCREMENT 기본 키, 그러면 첫 번째 동안 생성 된 값을 얻을 수 있습니다. INSERT 전화로 $ mysqli-> insert_id (), 또는 내장 기능을 사용하여 LAST_INSERT_ID().

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (LAST_INSERT_ID(), ?)';
foreach ($actorlist as $actorid) {
    // execute ($actorid) -- only one param in this INSERT
}

주목하십시오 LAST_INSERT_ID() 현재 세션 동안 가장 최근의 자동 생성 값을보고하므로 자동 기본 키를 사용하는 다른 테이블에 삽입하면 값이 변경됩니다. 그러나보고 된 가치는 세션 중에 안정적입니다. 그렇습니다 ~ 아니다 다른 클라이언트 세션이 동시에 삽입 된 경우 변경하십시오.

다른 팁

  1. 하나의 데이터베이스 연결 만 있으면됩니다
  2. 예, 고리가 필요합니다
  3. an을 사용하십시오 auto_increment 각 테이블의 기본 키 필드를 다음 사용하여 사용합니다. $stmt->insert_id() 각각의 값을 추출합니다 insert
  4. 가능하다면 사용하십시오 InnoDB MySQL 서버에서 트랜잭션 지원을받은 다음 commit 스크립트가 업데이트를 통해 중간에 떨어지면 데이터베이스가 일관되게 유지하기 위해 관련 업데이트가 함께 있습니다. 더 일반적인 MyISAM 데이터베이스 테이블 형식은 트랜잭션을 지원하지 않습니다.

하나 이상의 데이터베이스 연결을 사용할 필요가 없습니다. 실제로 삽입물을 하나의 원자 트랜잭션으로 그룹화 할 수 없기 때문에 전혀 수행하지 말아야 할 것입니다.

당신이해야 할 일 (추상)은 다음과 같습니다.

BEGIN;
INSERT INTO Genres...;
INSERT INTO Actors...;
INSERT INTO othertable....;
and so on, for referenced columns/tables.
INSERT INTO Movies....;
COMMIT;

이렇게하면 항상 일관된 데이터 세트가 있어야합니다.

당신은 아마도 외국 키를 따라 가고있을 것입니다 - 기본 테이블에서 하나의 ID를 사용하여 다른 테이블의 다른 관계를 식별하십시오 (다른 테이블의 movieid를 사용하여 다른 값이 속한 영화를 식별하십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top