0

最近、複数のテーブルへの書き込みについて質問しました:送信時に PHP/MySQL が複数のデータ テーブルに挿入されます。

このコードを試してみましたが、実際のコードではエラーは発生しませんでしたが、得られた結果は奇妙です。ユーザーが登録をクリックすると、この「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句が 2 番目のINSERTステートメントにありません。

  • INSERT2 番目のステートメントにも列の明示的なリストを指定します。

  • 列のデフォルト(シリアル列?)を有効にする場合NULLは、INSERTステートメントに指定しないでください。キーワードを使用するDEFAULTか、列についてまったく言及しないでください。

より良い解決策:

PostgreSQL 9.1 以降で利用可能なデータ変更 CTEを使用して、すべてを 1 つのステートメントで実行し、オーバーヘッドとサーバーへの往復を節約します。(MySQL は、単純な CTE でさえ、そのようなことは何も知りません)。

UPDATEまた、ロジックを再モデリングしてスキップします。で 1 つの ID を取得し、2 つのステートメント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);

この1 つのクエリですべてを実行できます。

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ユーザーが 1 つの にしか所属できない場合は、いつでも を定義できますinstitution

于 2012-08-23T17:14:49.470 に答える