2011-12-15 99 views
3

我寫了一個簡單的webform,將用戶的信息(通過POST)插入到數據庫中。這不是我典型的編程類型,但它足夠基本,我沒有任何麻煩。如何同步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(或任何適合/類似的內聯文檔工具用於您的語言)來記錄可接受的參數和限制,並將它們提供給藝術部門(或任何人)作爲漂亮的HTML頁面可以假裝閱讀。

如果你是,而是指SQL表列,那麼有很多工具可以直接從SQL服務器生成相當不錯的文檔,從SHOW CREATE TABLE foo以上...... SQL DDL本身就是訂單上的模式的XSD。

0

對CGI程序更新的持久性數據(即文件或數據庫)可能有操作系統特定的鎖定。更具體地說,假設一個Linux系統運行用C++編寫的CGI程序,如果數據位於一個文件(例如文本)中,那麼可以用flock系統調用來鎖定該文件(在CGI中)。如果您使用GDBM文件,則GDBM庫可能會爲您鎖定。如果它是一個MySQL數據庫,有辦法序列化訪問它(並且MySQL服務器負責它)。

+1

通過「同步」仔細瞭解OP的真正含義。他並不是想要鎖定資源,而是爲了確保輸入字段得到適當的識別。 – Christopher 2011-12-15 18:37:42

+0

@克里斯托弗:是的,這就是我所追求的正確意思。我想不出一個更好的詞。 – Eric 2011-12-15 18:40:37

3

我認爲通過「同步」,您指的是數據模型的演變,而不是指關鍵代碼段的互斥鎖定。

解決此問題的一種(部分)方法是生成HTML並從定義字段的共享數據庫驅動CGI腳本。

+2

這是實用的方法。也是正交的。亨特和托馬斯會很自豪! :)假設你總是從數據庫模式中生成你的字段標籤,這裏增加的好處是你可以避免錯誤的字段。但問題並不在於提供規範或其他維護人員的例程來調用 - 而是讓他實際調用它! :) – Christopher 2011-12-15 18:40:35