0

我最近问了一个关于写入多个表的问题:PHP/MySQL insert into multiple data tables on submit

我现在已经尝试了这段代码,实际代码中没有产生错误,但我得到的结果很奇怪。当用户点击注册时,这个“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);

?>

这样做的结果只是浏览器等待服务器响应,但它只是不断地等待。几乎就像我假设的无限循环。没有产生当前错误,所以我认为这可能是逻辑错误。有任何想法吗?

4

1 回答 1

2

错误:

  • RETURNING第二个语句中缺少子句INSERT

  • INSERT也为您的第二个语句提供一个明确的列列表。

  • 如果您希望列默认值(串行列?)启动,请不要NULLINSERT语句DEFAULT中提供。使用关键字或根本不提及该列。

更好的解决方案:

使用自 PostgreSQL 9.1 起可用的数据修改 CTE可以在一条语句中完成所有操作,并节省到服务器的开销和往返行程。(MySQL 对此一无所知,甚至连普通的 CTE 也不知道)。

UPDATE另外,通过重新建模逻辑来跳过。用 检索一个 id nextval(),只用两个INSERT语句就可以了。

假设这个数据模型(你应该在你的问题中提供它):

CREATE TABLE institutions(i_id serial, name text, u_id int);
CREATE TABLE staff(user_id serial, username text, password text, i_id int);

这个查询完成了所有工作

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_staff.i_id UNIQUE,如果一个用户只能属于一个institution

于 2012-08-23T17:14:49.470 回答