1

私は最初の webapp に取り組んでいて、少し壁にぶつかりました。次のように設定されたデータベースにテーブルがあります。

student_id(student_id、first_name、last_name、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...ので、これが問題の場所であると推測しています。どうすればこれを達成できますか?

4

2 に答える 2

0

mysqli_query()(およびmysql_query()) は単一のクエリのみを実行します。mysqli_query()または useを 2 回呼び出す必要がありmysqli_multi_query()ます。これにより、1 回の呼び出しで複数のクエリが実行されます。

于 2012-10-16T01:01:35.453 に答える
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;
于 2012-10-16T03:27:30.427 に答える