5

この質問はすでに尋ねられているかもしれませんが、検索方法がよくわかりません。

postgres-table「顧客」があり、各顧客には独自の名前があります。これを実現するために、この列に一意の制約を追加しました。

phpでテーブルにアクセスします。

ユーザーが既に使用されている名前で新しい顧客を作成しようとすると、データベースは「整合性制約違反」と表示し、php はエラーをスローします。

私がやりたいことは、html-input-field にエラーを表示することです:「顧客名は既に取得されています」というエラーが発生した場合。

私の質問は、これをどのように行うべきかです。

PDO 例外をキャッチする必要がある場合は、エラー コードが「UNIQUE VIOLATION」であるかどうかを確認し、例外メッセージに従ってメッセージを表示する必要があります。新しい列?

より良い実践とは? さらにSQLステートメントを作成するか、エラーコードをキャッチして分析します。

編集: 私はトランザクションを使用しており、ロールバックするために例外をキャッチしています。問題は、ユニーク違反を除外して、ロールバックに至らないようにする必要があるかどうかです。

EDIT2: 例外メソッドを使用している場合、一意の制約が実際に「名前」列に属していることを確認するために、例外メッセージを分析する必要があります。

これは私が例外から得たすべてです:

["23505",7,"FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint <customers_name_unique>\nDETAIL: Schlüssel <(name)=(test)> existiert bereits."]

列に関する情報を取得する唯一の方法は、「c​​ustomers_name_unique」(unique-constraint の名前) が存在するかどうかを確認することです。

ただし、ご覧のとおり、メッセージはドイツ語であるため、出力はシステムに依存し、変更される可能性があります。

4

5 に答える 5

7

PDO 例外をキャッチする必要があります。

レコードが既に存在するかどうかを調べて確認するよりも、データベースが失敗するのを待つ方が迅速です。

これにより、アプリケーションはデータベース内のビジネス ロジックを「あまり認識」しなくなります。実際にはビジネスロジックである一意のインデックスについてデータベースに伝える場合、データベースはその特定のロジックを処理しているため、他のレイヤー (アプリケーション) で同じチェックをスキップすることをお勧めします。

また、データベース層が例外を処理しているときは、競合状態を回避できます。アプリケーションが一貫性をチェックしている場合、最初のアプリケーションが利用可能であることをチェックした後で、別のユーザーが同じレコードを追加する危険性があります。

于 2013-07-16T12:22:48.293 に答える
2

質問はここに属していませんが、私はあなたに答えます。

例外とは、例外的なことが起こる状況です。これは、頻繁に発生する可能性のある状況を処理するためにそれらを使用すべきではないことを意味します。あなたがそれを行うと、それはGOTOコードのようなものです. より良い解決策は、重複する行があるかどうかを事前に確認することです。ただし、例外を使用したソリューションの方が簡単なので、何かを機能させたいのか、それとも機能するものをあるべきように記述したいのかを決定する必要があります。

于 2013-07-16T12:19:01.537 に答える
0

保存時に、存在するかどうかを確認します(単純なフィールド、この場合は Constraint 列)。肯定の場合 - 重複についてユーザーに通知を表示します。ただし、DB サーバーに強制的に例外を返させないでください。

于 2013-07-16T12:22:13.703 に答える