我一直在研究我的第一个网络应用程序而且我打了一个墙。我的数据库设置如下表:
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...
的错误,所以我猜这就是问题所在。我怎么做到这一点?
答案 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;