2011-12-15 8 views
3

ユーザーの情報を(POST経由で)取得してデータベースに挿入する簡単なWebフォームを作成しました。これは私の典型的なタイプのプログラミングではありませんが、基本的には問題はありませんでした。CGIプログラミングをどのように同期させますか?

とにかく、WebフォームはHTMLページに存在し、かなり標準です。以下の(単純化の例)のようなもの:

<form method="post" action="/cgi-bin/submit_form" enctype="x-www-form-encoded" id="frm"> 
    <input id="txtName" type="text" /> 
    <input id="txtPhone" type="text" /> 
    <input id="btnSubmit" type="submit" value="Submit" /> 
</form> 

そして、私はそれが送信されたときに実行され、データベースにデータを格納するC++アプリケーション(cgi-bin/submit_form)を持っています。

私は次のようになりますこれは、基本的に出力を解析し、非常に基本的なCGIライブラリを書いた:

txtName=<name>&txtPhone=<phone>&btnSubmit=Submit

とライブラリは、このようなmap<string, string>にそれを解析します

myMap["txtName"] = "John"; 
myMap["txtPhone"] = "1.800.555.5555"; 

これは、データベースに入れるのがかなり簡単です。しかし、私のアプリケーションがhtml要素の変数名(txtName、txtPhone)に完全に依存していることは明らかです。それらのいずれかが変更された場合、私のアプリケーションは突然動作を停止します。


私の質問は:どのようにして、サーバー側のアプリケーションにCGIからデータを取得するプロセスを同期させることができますか?

私はhtmlとサーバースクリプトの両方を担当していることは非常に幸運です。しかし、ある人がウェブサイトを管理し、別の人がスクリプトを管理するシナリオが存在しなければならず、何も悪いことが起こらないように調整する必要があります。

これらのタイプの状況では、ICDを使用できます。たとえば、XMLデータを渡すときには、XSDを使用してデータ構造を定義することができます。

CGIプログラミングでこれがありますか?私は非常に壊れやすいと私のアプリケーションを壊すのは簡単に怖いです。

答えて

3

HTML要素名とCGIスクリプトで解析されるフィールドの間の変更を参照していますか?

XSDのように正式である限り、私はそう信じません。

一般に、これは

  • UNIXシェルコマンドラインシステムとしてソリューションの同じクラスです。
  • 環境変数。
  • HTTPヘッダーフィールドとSMTPヘッダーフィールド。

...つまり、POST値は完全に自由形式の文字列であり、あなたのサーバーが読み取り時に無視するか、または文句を言い渡すまでです。 (自分の環境やSMTPヘッダーに「ガベージ」を自由に含めることができるのと同じように、送信するシステムの許容範囲の上限まで)。

そうだとすれば、に別のデザイナーがかなりのHTML文書を書いており、別の人が投稿したアプリケーションを書いているので、共同作業するためのアドホックな方法がいくつかあります。個人的には、私は一般的にPerlのPODやJavadoc(または、あなたの言語に適した/適切なインラインドキュメントツールがあれば)を使用して、受け入れられたパラメータと限界を文書化し、アート部門(または誰でも)読むふりをすることができます。

SQLテーブルの列を意味するのであれば、SQLサーバーから直接適切な文書を生成するツールがいくつかあります。SHOW CREATE TABLE foo以上... SQL DDL自体は、 XSDの

+0

ありがとう。それはまさに私が意味することです:HTML要素名と解析されるフィールドの調整。私はあなたの洞察に感謝します。 – Eric

0

CGIプログラムによって更新された永続データ(ファイルまたはデータベース)にオペレーティングシステム固有のロックを設定できます。

はC++でコーディングされたCGIプログラムを実行しているLinuxシステムを想定し、具体的にはデータが1つ(例えば、テキスト)ファイル内にある場合、あなたはflockシステムコールを(自分のCGI内で)そのファイルをロックすることができます。 GDBMファイルを使用すると、おそらくGDBMライブラリがロックを行います。もしそれがMySQLデータベースであれば、そこへのアクセスをシリアライズする方法があります(そしてMySQLサーバがそれを担当しています)。

+1

OPが本当に意味することを「同期」することで詳しく見てください。彼は、入力フィールドが適切に識別されるようにするために、リソースをロックすることを意味しません。 – Christopher

+0

@Christopher:はい、それは私が行っていた正しい意味です。私はそれについてより良い言葉を考えることができませんでした。 – Eric

3

"同期する"とは、データモデルの進化を指し、コードの重要なセクションの相互排他ロックではないと思います。

これに対処する方法の1つは、HTMLを生成し、フィールドを定義する共有データベースからCGIスクリプトを駆動することです。

+2

これは実用的なアプローチです。また、直交。ハント&トーマスはとても誇りに思うでしょう! :)あなたが*常に*データベーススキーマからフィールドラベルを生成すると仮定した場合の利点は、フィールドの誤った名前付けを避けることです。しかし、問題は、別のメンテナがコールするための仕様やルーチンを提供することではなく、実際に呼び出すようにすることです! :) – Christopher

関連する問題