2012-10-16 107 views
1

我一直在研究我的第一個webapp,並且碰到了一堵牆。我在我的數據庫表設置如下:當創建新的主要記錄時填充多個表格

student_id數據(student_id數據,名字,姓氏,bdate,等...)

我也有成立類似於班幾個表這

class_table(ID,student_id數據,quiz_1,quiz_2,等...)

student_id是我怎麼想追蹤一切,從我的理解,這將是一個主鍵,將成爲類表上的外鍵。

我想要做的是當我寫的php腳本創建一個新學生時,爲每個班級表上的學生創建一個條目。這是我的查詢的樣子:

$query = "INSERT INTO student_id(0, '$first_name', '$last_name'.... etc);". 
     "INSERT INTO class_table(0, LAST_INSERT_ID(), '$quiz_1', $quiz_2'...etc)"; 

這是正確的方法嗎?我一直收到我的mysqli_query...錯誤,所以我猜這是問題所在。我將如何實現這一目標?

回答

0

mysqli_query()(和mysql_query())只會執行一個查詢。您需要執行兩個調用mysqli_query()或使用mysqli_multi_query(),這將在一次調用中執行多個查詢。

+0

我會今晚玩耍。這是否被認爲是一種「良好」的做法,或者是否有一種可行的方法? – royalenfield

0

你錯過了VALUES條款:

$query = "INSERT INTO student_id VALUES (0, '$first_name', '$last_name'.... etc);". 
     "INSERT INTO class_table VALUES (0, LAST_INSERT_ID(), '$quiz_1', '$quiz_2'...etc)"; 

,你將需要使用mysqli_multi_query()功能。見例如在http://www.php.net/manual/en/mysqli.multi-query.php#106126

if ($mysqli->multi_query($query)) { 
    $i = 0; 
    do { 
     $i++; 
    } while ($mysqli->next_result()); 
} 
if ($mysqli->errno) { 
    echo "Batch execution prematurely ended on statement $i.\n"; 
    var_dump($statements[$i], $mysqli->error); 
} 

你也可以創建一個存儲過程,並與所有需要的參數調用它:

CALL insert_student('$first_name', '$last_name', '$quiz_1', $quiz_2', ... etc); 

下面是一個例子:

CREATE PROCEDURE add_student(
    IN v_first_name VARCHAR(50), 
    IN v_last_name  VARCHAR(50), 
    IN v_quiz_1  VARCHAR(255), 
    IN v_quiz_2  VARCHAR(255) 
) 
DETERMINISTIC 
MODIFIES SQL DATA 
proc: BEGIN 
    START TRANSACTION; 

    INSERT INTO student_id VALUES (0, v_first_name, v_last_name); 

    IF ROW_COUNT() <= 0 THEN 
     ROLLBACK; 
     SELECT 0 AS result; 
     LEAVE proc; 
    END IF; 

    INSERT INTO class_table VALUES (0, LAST_INSERT_ID(), v_quiz_1, v_quiz_2); 

    COMMIT; 

    SELECT 1 AS result; 
END; 
+0

當我創建過程時是否可以使用調用插入到多個表中,還是與mysqli_query類似,被限制爲一個表上的一個插入? – royalenfield

+0

是的,我在答案中增加了一個例子。 –

相關問題