PHP/MySQL插入功能逻辑错误

PHP/MySQL插入功能逻辑错误,php,postgresql,Php,Postgresql,我最近问了一个关于写入多个表的问题: 我现在已经尝试了这段代码,在实际代码中没有产生错误,但是我得到的结果很奇怪。当用户单击register时,将调用这个“insert.php”页面,代码可以在下面找到 <?php $username = $_POST["username"]; $password = $_POST["password"]; $institution = $_POST["institution"]; $conn = pg_connect("database conne

我最近问了一个关于写入多个表的问题:

我现在已经尝试了这段代码,在实际代码中没有产生错误,但是我得到的结果很奇怪。当用户单击register时,将调用这个“insert.php”页面,代码可以在下面找到

<?php

$username = $_POST["username"];
$password = $_POST["password"]; 
$institution = $_POST["institution"];

$conn = pg_connect("database connection information"); //in reality this has been filled
$result = pg_query($conn, "INSERT INTO institutions (i_id, name) VALUES (null, '$institution') RETURNING i_id");
$insert_row = pg_fetch_row($result);
$insti_id = $insert_row[0];

// INSTITUTION SAVED AND HAS ITS OWN ID BUT NO MEMBER OF STAFF ID

$resultTwo = pg_query($conn, "INSERT INTO staff VALUES (NULL, '$username', '$password', '$insti_id'");
$insert_rowTwo = pg_fetch_row($resultTwo);
$user_id = $insert_rowTwo[0];
// USER SAVED WITH OWN ID AND COMPANY ID
// ASSIGN AN INSTITUTION TO A STAFF MEMBER IF THE STAFF'S $company_id MATCHES THAT OF THE
// INSTITUION IN QUESTION
$update = pg_query($conn, "UPDATE institutions SET u_id = '$user_id' WHERE i_id = '$insti_id'");  

pg_close($conn);

?>
错误:

  • 第二条
    INSERT
    语句中缺少返回的
    子句

  • 为第二个
    INSERT
    语句提供列的明确列表

  • 如果希望列默认值(串行列?)生效,请不要在中提供
    NULL
    。使用关键字
    DEFAULT
    ,或者根本不提及该列

更好的解决方案是:

从PostgreSQL 9.1开始使用,可以在一条语句中完成所有操作,并节省开销和往返服务器的时间。(MySQL对此一无所知,甚至连普通的CTE也不知道)

另外,通过重新建模逻辑,跳过更新。检索一个id,只使用两个
INSERT
语句

假设此数据模型(您应该在问题中提供):

这一个查询完成了所有操作:

WITH x AS (
    INSERT INTO staff(username, password, i_id) -- provide column list
    VALUES ('$username', '$password', nextval('institutions_i_id_seq'))
    RETURNING user_id, i_id
    )
INSERT INTO institutions (i_id, u_id, name)
SELECT x.i_id, x.user_id, '$institution'
FROM   x
RETURNING u_id, i_id; -- if you need the values back, else you are done

数据模型 您可能会考虑将数据模型更改为经典的n:m关系。 将包括这些表和主键:

staff (u_id serial PRIMARY KEY, ...)
institution (i_id serial PRIMARY KEY, ...)
institution_staff (i_id, u_id, ...,  PRIMARY KEY(i_id, u_id)) -- implements n:m

如果一个用户只能属于一个
机构
,则始终可以定义
institution\u staff.i\u id UNIQUE
,如果用户只能属于一个
机构

,是否可以检查数据库并查看是否插入了行?执行此操作后,行为空。正确的,在每个pgu查询之后,添加以下内容,将$result替换为$resultTwo,并根据需要更新$if($result==false)回显pg_last_错误($conn);这段代码试图获取插入的结果,但是没有返回的插入没有要获取的结果。它也没有做任何错误检查。最重要的是,它到处都有SQL注入的漏洞。你说“MySQL”,但看起来你在使用PostgreSQL?非常感谢你的帮助!延迟回复,但如果我更改了数据模型,上面的查询还能工作吗?因为我有您假设的数据模型,但我在每个表中的u_id和I_id之间强制了引用完整性,所以它们是FK引用。
staff (u_id serial PRIMARY KEY, ...)
institution (i_id serial PRIMARY KEY, ...)
institution_staff (i_id, u_id, ...,  PRIMARY KEY(i_id, u_id)) -- implements n:m