PS: KJ Daniel の記事。昨日友人と話しているときに、ADO のコマンド クエリについて言及しました。私の記憶力がかなり悪いようです。ぜひ読んでみてください。一般に、ASP PHP コードを書く友人は、おそらく SQL の直接操作を使用します~
次のコードを見てください
<%
ディムコン、RS
set conn=CreateObject(Adodb.Connection)
接続して開いて....
set rs=conn.execute(ニュースから * を選択);
...
トラバースrs....
%>
実装速度が速いのは確かですが、もちろん構造ロジックの1文半なんて関係ありません!ステートメントが多すぎると問題が発生します。
パラメータはフィルタリングされておらず、SQL インジェクションなどが存在します。OK、次に設計モデルを変更しましょう。
3層構造+ORMを採用
ORM: オブジェクト関係マッピング
では、ORM テクノロジーとは何でしょうか? JAVA .NET 開発に詳しい友人は、オブジェクト リレーショナル マッピングについてよく知っているはずです。
テーブルをクラス フィールドにマップし、テーブルをプロパティにマップし、レコードをオブジェクトにマップする...現在、多くの JAVA ORM 永続層フレームワークが存在します。
たとえば、hibernate ibatis EntityBean (EJB の 1 つ)
ASPについてはどうですか? 導入もお待ちしております。
3層構造:WEBプレゼンテーション層、中間層、永続化層
こちらは簡単なニュース表です
テーブルニュースを作成(
ID 整数、
タイトル varchar(200)、
連絡先 varchar(50000)
)
それをクラスとしてマッピングします
<%
クラスニュース
プライベートID、タイトル、連絡先
サブセットID(sid)
id=Cint(sid)
エンドサブ
関数 getID
取得ID=id
終了機能
サブセットタイトル(タイトル)
title=mid(stitle,1,200)' は長さを制限します
エンドサブ
....
終了クラス
%>
次に、データベースを操作してオブジェクトに変換する方法のコードを設計します。
<%
クラス NewsDataAccessObject
ディムコン、rs、cmd
'ニュースをクエリする
関数 getNewsByID(id)
set conn=Application(connection)' 接続プール内の接続を取得します
set cmd=GetCmd() ' GETCMD 関数の実装 return createobject(Adodb.Command)
selectString=select * from NEWS where id = @id
cmd.ActiveConnection = 接続
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = selectString
'今 @id にパラメータを追加します。定数 adInteger = 3 adParamInput=1
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , id)
' SQL ステートメントを実行し、結果セットを返します
set rs=cmd.execute()
新たに薄暗い
set anew=新しいニュース
もし rs.eof なら
それ以外
anew.setID(rs(id)&)
anew.setTitle(rs(タイトル)&)
anew.setContect(rs(Contect)&)
終了する場合
rs.close
rs=何も設定しない
cmd=何も設定しない
conn=何も設定しない
getNewsByID=新たに設定
終了機能
'ニュース記事を挿入
機能追加News(新規)
ディムコン、cmd
if isempty(anew) then addNews=false
set conn=Application(connection)' 接続プール内の接続を取得します
set cmd=GetCmd() ' GETCMD 関数の実装 return createobject(Adodb.Command)
insertString=NEWS(id,title,contect) 値に挿入 ( @id 、 @title 、 @contect )
cmd.ActiveConnection = 接続
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = insertString
'@id @title @contect にパラメーターを追加します。定数 adInteger = 3 adParamInput=1 adVarWChar = 202
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , anew.getID() )
cmd.Parameters.Append cmd.CreateParameter(@title,adVarWChar, adParamInput, 200, anew.getTitle() )
cmd.Parameters.Append cmd.CreateParameter(@contect,adVarWChar, adParamInput, 50000, anew.getConect() )
'SQL文を実行
cmd.execute()
cmd=何も設定しない
conn=何も設定しない
addNews=true
終了機能
関数 findByTitle(タイトル)
....
終了機能
関数 getPageNews(ページ,サイズ)
....
終了機能
終了クラス
%>
上記は、データベースを操作し、その結果をオブジェクトにカプセル化するか、オブジェクトをデータベースに書き込むことです。
この実装の速度は若干遅くなりますが、全体的な論理構造は非常に明白であり、変数がフィルタリングされているかマルチフィルタリングされているかを気にする必要はありません。
Web ページ層のデザイナーはインターフェイスに重点を置きます。
以下にニュースコードを追加して送信してください
<%
薄暗いID、タイトル、連絡、新規、ダオ
id=リクエスト(id)
title=リクエスト.フォーム(タイトル)
contact=リクエスト.フォーム(連絡)
set anew=新しいニュース
anew.setID(id)
anew.setTitle(タイトル)
anew.setContect(接続)
set dao=new NewsDataAccessObject
if dao.addNews(anew) then
'応答.書き込み
エコー成功
それ以外
エコーエラー
終了する場合
%>
ニュースを確認して表示する
<%
ディムID、ダオ、新たに
id=リクエスト(id)
set dao=new NewsDataAccessObject
set anew=dao.getNewsByID(id)
if anew.getID()<> then
%>
タイトル:<%=anew.getTitle()%>
コンテンツ:<%=anew.getContect()%>
……
上記のコードスニペットに誤りや脱落があった場合は、アドバイスをありがとうございます~~~
このデザイン手法を使用すると、XXXBLOG XXXBBS XXX のような記事システムを使用する必要がなくなります。
Replace(SQL,','') を忘れてインジェクションが発生しました。
ページのクリーンさの観点から、接続などの SQL ステートメントは存在せず、アーティストは自分の作業に責任を負い、オブジェクトのプロパティを対応する位置に配置します。
そして、ユーザー認証について考える友人もいるかもしれません。ユーザーテーブルのユーザーオブジェクトをセッションに入れるだけの方が簡単です。
<%
if isempty(session(user)) または session(user)= then
'ジャンプ
それ以外
auser=セッション(ユーザー)を設定します
エコーようこそ: & auser.getName()
%>