在创建新主记录时填充多个表

时间:2012-10-16 00:56:02

标签: php mysql mysqli

我一直在研究我的第一个网络应用程序而且我打了一个墙。我的数据库设置如下表:

  

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...的错误,所以我猜这就是问题所在。我怎么做到这一点?

2 个答案:

答案 0 :(得分:0)

mysqli_query()(和mysql_query())只会执行一次查询。您需要对mysqli_query()执行两次调用或使用mysqli_multi_query(),这将在一次调用中执行多个查询。

答案 1 :(得分: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;