Php 创建新主记录时填充多个表
我一直在开发我的第一个网络应用程序,我遇到了一些麻烦。我在数据库中设置了一个表,如下所示: 学生id(学生id、名、姓、日期等) 我还有几个类似于此设置的类的表 班级表格(id、学生id、测验1、测验2等)Php 创建新主记录时填充多个表,php,mysql,mysqli,Php,Mysql,Mysqli,我一直在开发我的第一个网络应用程序,我遇到了一些麻烦。我在数据库中设置了一个表,如下所示: 学生id(学生id、名、姓、日期等) 我还有几个类似于此设置的类的表 班级表格(id、学生id、测验1、测验2等) student\u id是我想要跟踪一切的方式,据我所知,这将是一个主键,将成为类表上的外键 我想做的是,当我正在编写的php脚本创建一个新学生时,在每个类表上为学生创建一个条目。我的查询是这样的: $query = "INSERT INTO student_id(0, '$first_na
student\u 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\u查询中得到一个错误…
,所以我猜这就是问题所在。如何实现这一点?mysqli\u query()
(和mysql\u query()
)将只执行一个查询。您需要执行两次调用mysqli\u query()
或使用mysqli\u multi\u query()
,这将在一次调用中执行多个查询。您缺少value
子句:
$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)";
你需要使用这个函数。请参见下面的示例:
您还可以创建一个存储过程,并使用所有需要的参数调用它:
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;
CREATE PROCEDURE add\u student(
以v_的名字VARCHAR(50),
在v_姓VARCHAR(50)中,
在v_quick_1 VARCHAR(255)中,
在v_测验_2中VARCHAR(255)
)
确定性
修改SQL数据
程序:开始
启动交易;
插入学生id值(0,v_名字,v_姓氏);
我今晚就玩这个。这被认为是一种“良好”实践,还是有一种更好的方法来实现这一点?我可以在创建过程时使用call插入多个表,还是类似于mysqli_查询,仅限于在一个表上插入一个表?是的,我在答案中添加了一个示例。
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;