2014-09-19 7 views
2
PHP5

mysqli : 사용자, 학생,여러 삽입 내가 3 개 테이블이

사용자의 기본 키가 테이블 학생 (사용자 ID) 및 학생의 기본 키의 필드에 대한 외래 키 studentdetails을 A에 대한 외래 키 테이블 studentdetails (studentid)의 분야.

내가 SQL 스크립트 다음, 제출 한 3 표를 하나 개의 형태에서 데이터를 삽입해야합니다

$sql = " 

    INSERT INTO `tbluser`(`username`, `password`, `roleid`, `datecreated`) 
    VALUES ('$email','$password', '$role', CURRENT_TIMESTAMP); 

    SELECT @uid := MAX(`userid`) FROM `tbluser`; 

    INSERT INTO `tblstudent` (`userid`, `scholarnumber`, `firstname`, `middlename`, 
    `lastname`, `datecreated`) 
    VALUES ('@uid', '$scholar_no', '$first_name', '$middle_name', '$last_name', 
    CURRENT_TIMESTAMP); 


    SELECT @stuID := MAX(`studentid`) FROM `tblstudent`; 

    INSERT INTO `tblstudentdetails` (`studentid`,`dob`, `studenttype`, `gender`, 
    `religion`, `category`, `currentsuburbid`, `currentcityid`, `currentaddress1`, 
    `currentzipcode`, `currentstateid`, `currentcountryid`,`mobile`,`phone1`,`email1`, 
    `passportnum`, `permasuburbid`, `permaaddress1`, `dateofjoining`, 
    `admissionreferenceof`, `datecreated`, `dateupdated`) 

    VALUES ('@stuid', '$dob' ,'$studenttype' ,'$gender','$religion','$category', 
    '$currentsuburbid', ' $currentcityid', '$currentaddress1', '$currentzipcode', 
    '$currentstateid', '$currentcountryid', '$mobile', 
    '$phone1','$email1','$passportnum','$permanentsuburbid', '$permanentaddress1', 
    '$doj', ' $admissionreference',current_timestamp, current_timestamp); 

    "; 

내가 문제를 알아낼 수 아니다, 위의 스크립트는 (MySQL의 작동 phpmyadmin)하지만 php에서 작동하지 않습니다. 이해, 나는 multi_query (??) 사용할 필요가 있지만 어떤 오류를주지 않는 및 두 테이블에 삽입 있지만 세 번째 하나는 않습니다. 사이에 SELECT 문을 사용하는 것이 좋을 것이라고 생각합니까? 여기 끝나면 모든 도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+1

여러 SQL 문을 실행하는 것은 좋지 않습니다. 명령문을 여러 삽입으로 분할하고 별도로 실행하십시오. – GordonM

+0

더 많은 제어와 오류 처리를 할 수 있도록 별도의 SQL 문을 수행합니다. 그러나이 모든 데이터베이스 작업을 한 번에 수행해야한다고 생각한다면이 모든 작업을 수행하는 저장 프로 시저를 작성하십시오. –

답변

1

mysqli에서 세미콜론으로 구분 된 여러 개의 SQL 문을 실행하는 것처럼 보입니다. 그건 작동하지 않습니다. 각각의 별개의 진술을 별도로 발급해야합니다.

MySQL의 트랜잭션을 사용할 수 있습니다 (테이블에 InnoDB 또는 다른 액세스 방법을 사용하고 이 아님) MyISAM : MyISAM이 트랜잭션을 처리하지 않습니다.

당신은 다음과 같은 것을 할 거라고 : 동시에 표시되고,

$connection->begin_transaction(); 
/* issue your statements one by one */ 
$connection->commit(); 

이는 등, 모든 삽입의 원인이됩니다.

하지만 가장 최근의 자동 증가 ID 번호를 사용하려고합니다. 당신이 잘못하고 있어요.

SELECT @uid := MAX(`userid`) FROM `tbluser`; /*wrong*/ 

패턴 대신에 함수를 사용해야합니다. 이것은 LAST_INSERT_ID()이 첫 번째 삽입물에서 ID 값을 전달하므로 두 번째 삽입물이이 ID를 사용하기 때문에 작동합니다. MySQL이 각 프로그램 연결마다 별도의 값을 유지하기 때문에 여러 프로그램이 테이블에 항목을 삽입하더라도 안전합니다. 그것은 테이블을 볼 필요가 없기 때문에 가지고있는 것보다 빠르며, 사용하기 전에 프로그램에 값을 반환합니다.

이렇게하면 원하는 것을 얻을 수 있습니다.

/* do the first insert, using an autoincrementing uid column */ 
INSERT INTO `tbluser`(whatever, whatever, whatever) 
       VALUES (whatever, whatever, whatever); 
/* now LAST_INSERT_ID() contains the value inserted into tbluser.uid */ 

/* do the second insert, using the id from the first insert into tblstudent.userid */ 
INSERT INTO `tblstudent` (`userid`,   whatever, whatever, whatever) 
        VALUES (LAST_INSERT_ID(), whatever, whatever, whatever); 
/* now LAST_INSERT_ID() contains the value inserted into tblstudend.studentid */ 

/* use that value to insert into tblstudentdetails.studentid */ 
INSERT INTO `tblstudentdetails` (`studentid`,  whatever, whatever, whatever) 
         VALUES (LAST_INSERT_ID(), whatever, whatever, whatever); 
+0

감사합니다. 나는 InnoDB를 사용하고 last_insert_ID()를 사용하고 있었지만 어딘가에 항상 작동하지는 않을 것이라고 읽었지 만 지금은 변경했습니다. 또한 Gordan & Ed의 제안에 따라 멀티 쿼리를 사용하는 것이 좋지 않은지 물어볼 수 있습니까? 나는 매번 한 SQL을 전송하는 코드를 변경할 수 있지만 mysql이 한 번에 작업을 수행하고 php에 확인을 보내도록하는 것이 더 좋을 것이라고 생각 했습니까? 감사합니다. 감사합니다. 다시 한번 감사드립니다. – Anx

+1

'LAST_INSERT_ID()'는 코드에 따라 INSERT 문을 밀어 넣기 위해 코드를 편집하지 않는 한 매우 신뢰할 수 있습니다. 원하는 경우'multi_query'를 사용할 수 있습니다. 그러나 해당 API에는 구워진 트랜잭션 제어가 없습니다. –