はじめに: 現在、インターネット上にはさまざまなフォーラムがありますが、ごちゃごちゃしたディスカッション情報の中から目的のコンテンツを探すのは非常に時間と労力がかかる、という状況に遭遇したことはありませんか。 will I don’t want to go to any forum anymore.それでは、Web サイトのフォーラムのコンテンツに監査機能を追加できますか?つまり、ネットユーザーがフォーラムに投稿したすべての記事は、ウェブマスターまたはモデレーターによって審査され、他のネットユーザーに推奨する必要があると判断された場合には公開されます。それ以外の場合は、スペースを無駄にしてハイライト領域のように見えることを避けるために削除してください。このようにして、フォーラムは通常のフォーラムよりも明確で有益なコンテンツを提供できます。あなたのウェブサイトに掲載すると、より多くのネチズンが訪問するようになるはずです。このアイデアは確かに実現できるので、以下に簡単に作り方を紹介します。
注: この記事は、ACCESS データベース、HTML、および ASP についてある程度の知識がある読者に適しています。
1. フォーラムの構造分析
上記の機能要件分析を通じて、フォーラムの制作を 4 つの部分に分けることができます。
(1) ネットユーザー登録および管理モジュール: ウェブマスターまたはモデレーターが導入されているため、Web マスターまたはモデレーターで制御できなければなりません。フォーラムを認証します。このモジュールの機能は、登録されたネチズンを管理し、関連するクエリを提供することです。たとえば、指定した著者によるすべての公開記事をクエリしたり、最も多くの記事を公開した 10 人のネチズンをクエリしたりするなどです。フォーラムがそれほど大きくない場合は、このモジュールを省略してモデレータ認証の機能のみを持たせ、登録とクエリに関する部分を削除することができます。
(2) 記事表示モジュール: モデレータによってレビューされ、推奨に値すると判断されたすべての記事を表示します。
(3) 記事公開モジュール: 登録されたネチズンが意見を公開し、公開後モデレーターによるレビューを待つ場所を提供します。
(4) 記事レビューモジュール: モデレーターは、Web サイトに公開されたもののレビューされていないすべての記事を処理し、公開するか削除するかを決定します。
特定の機能要件を理解した後、モジュールに従ってフォーラムの設計を開始できます。もちろん、これらのモジュールはフォーラム構造を機能的に分割するだけであり、実際には完全に独立して設計することはできません。このような小規模なアプリケーションの場合、完全なモジュール設計は必要なく、適切な計画を立ててプログラム コードを直接記述する方が簡単な場合があります。
フォーラムを実装するには、通常、ファイルを使用する方法とデータベースを使用する方法の 2 つがあります。比較的言えば、データベースを使用する方が簡単かつ効率的で、フォーラムをより適切に制御でき、データの検証と保護も行うことができます。ここでは ACCESS データベースを使用しています。一般的な小規模および中規模のアプリケーションの場合は、ACCESS で十分な役割を果たします。
上記の分析から、4 つのテーブルが必要であることがわかります。以下に各テーブルの構造を示します。
(1) 著者テーブル (著者情報の格納に使用):
ID: テキスト型、必須。是网友代号。
パスワード: テキストタイプ、必須。
昵称: 文本类型,必填。
EMAIL: テキストタイプ、必須。
位置: 数値タイプ、必須。 -1 は一般のネチズンを表し、0 はウェブマスターを表します。 0 より大きい数字はモデレータを表します。
記事数: 数値タイプ、必須。网友发表的文章总数。
名前: テキストタイプ、オプション。
性別: テキストタイプ、オプション。
電話: テキストタイプ、オプション。
(2) コンテンツ テーブル (特定の記事コンテンツと関連情報を格納するために使用されます):
ID: 検索を高速化するために自動的に番号付けされ、インデックスが付けられます。
カンバン ID: カンバン リストからの数値タイプ。記事が属するカンバン ボードを示します。
トピック ID: トピック テーブルからの数値タイプ。記事が属するトピックを示します。
著者 ID: 著者テーブルからのテキスト タイプで、記事の著者を示します。
日付: 日付/時刻タイプ。事前に設定された初期値は関数 NOW() で、現在のシステム時刻が値として自動的に取得されます。
タイトル: テキストタイプ。記事のタイトル。
公開: はい/いいえタイプ。「True」は記事がレビューされ、公開できることを意味します。「No」は記事がまだレビューされていないことを意味します。
推奨度:数値型、記事の推奨度。
内容: コメントの種類、記事の具体的な内容。
クリック数: 数値タイプ、記事のクリック数。
(3) かんばんリスト(かんばんに関する情報を格納するために使用):
ID: 同様にインデックスも設定されます。
名前: テキストタイプ、ボードの名前。
モデレータ: テキスト タイプ、ボード モデレータの ID。
トピック数: 数値タイプ、ボードに含まれるトピックの数。
(4) トピックテーブル (トピックに関する情報を格納するために使用):
ID: 自動的に番号付けされ、インデックスが設定されます。
タイトル: トピック名を示すテキストタイプ。
カンバン ボード: カンバン ボード リストからの番号タイプ。トピックが属するカンバン ボードを示します。
記事数: 数値タイプ、トピックに含まれる記事の数。
すべてのテーブルの設計は完了しましたが、データベースの設計はまだ完了していません。そのため、データ エラーを回避するためにデータベースが相関チェックを実行できるように、テーブル間の関係を確立する必要があります。テーブル間のリレーションシップを確立することのもう 1 つの利点は、それを通じて複雑な JOIN クエリを簡単に確立できることです。
通常、ASP でデータベースを操作するときは、実行中に生成されたクエリを使用します。クエリは、解釈および実行のためにデータベースに渡されます。ここではストアドクエリを使用します。ストアド プロシージャには、実行時クエリよりも多くの利点があります。
これはデータベースに保存され、ASP プログラム コードから独立しているため、作成と変更が容易になり、クエリ効率が向上し、デバッグして ASP ページで使用できるため、多くの問題を回避できます。また、ストアド クエリを使用する ASP プログラム コードは、読み取りと変更が容易です。おそらく誰もが、ASP で SQL クエリ、特にコンマやセミコロンなどを使用することにイライラしているのではないでしょうか。注意しないとエラーが発生する可能性があります。ストアド クエリを使用した後は、これらの問題を心配する必要はありません。もちろん、事前に保存されたプログラムを使用する際には注意する必要があることがいくつかあります。その使用方法については後ほど詳しく説明します。 ACCESS でストアド プログラムを作成するのは非常に簡単なので、ここでは詳しく説明しません。ここでは、各クエリの SQL ステートメントのプログラム コードのみを示します。
使用するすべてのクエリを事前に保存されたプログラムとしてデータベースに保存しました。主なクエリは次のとおりです。
(1) ID によるクエリ記事:
タイトル AS トピック名、名前 AS カンバン名。目次。*
FROM トピックテーブル INNER JOIN (コンテンツテーブル INNER JOIN かんばんリスト ON コンテンツテーブル.かんばん ID = かんばんリスト.ID) ON トピックテーブル.ID = コンテンツテーブル.トピック ID
WHERE (((コンテンツテーブル.ID)=[記事ID]));
(2) モデレータパスワードクエリ:
SELECT カンバンリスト.ボードオーナー、著者テーブル.Password
FROM 著者テーブル INNER JOIN かんばんリスト ON 著者テーブル.ID = かんばんリスト.ボード所有者
WHERE (((かんばんリスト.ID)=[id];
(3) 著者を問い合わせる:
SELECT author table.*
著者テーブルから
WHERE (((著者テーブル.ID)=[id]));
(4) 公開記事リスト:
SELECT [目次テーブル].[ID], [目次テーブル].[タイトル], [目次テーブル].[著者ID] ] AS 著者、[目次].[日付]、[目次].[おすすめ]、[目次].[クリック数] AS クリック数。
目次から
WHERE ((([目次].[トピック ID])=[トピックインデックス]) And (([目次].[公開済み])=True));
目次
.ID AS 記事を選択します
。id、トピック table.ID AS トピック ID、トピック table.title AS トピック、content table.title AS タイトル、content table.author ID AS 著者、content table.date AS 日付
FROM 主题表INNER JOIN 内容表ON 主题表.ID = 内容表.主题ID
WHERE (((コンテンツ テーブル。パブリッシュ)=False) AND ((コンテンツ テーブル。カンバン ID)=[ボード ID]));
(5) トピック リスト:
SELECT トピック テーブル.*、カンバン リスト名。
FROM かんばんリスト INNER JOIN トピックテーブル ON かんばんリスト.ID = トピックテーブル.kanban
WHERE (((主题表.看板)=[boardIndex]));
还有一些查询,因为大多类同,我就不一一列出了。
上記のクエリ ステートメントでは、クエリ パラメータである「[」と「]」で囲まれたものがいくつか見られます。パラメータ値は実行中に指定する必要があり、実行前にパラメータ値がクエリ ステートメントに取り込まれます。もう 1 つ注意すべき点は、これらの INNER JOIN クエリを確立するときに、テーブル間のリレーションシップをデザイン ビューに追加する必要があることです。そうしないと、INNER JOIN クエリ ステートメントが自動的に生成されません。
この時点でデータベースの設計は終了し、次の作業はASPです。
2. 構築
1. メイン フォームを構築するには
、まずネチズンが登録情報を入力できるフォームを提供する必要があります。これらは HTML コンテンツですが、登録を実装する ASP スクリプトを詳しく見てみましょう。
(1) 情報中のシングルクォーテーションを2つのシングルクォーテーションに変更し、前後にシングルクォーテーションを追加します。
関数 SqlStr(データ)
SqlStr = "'" & Replace( data,"'", "''" ) & "'"
End Function
注: これは、ユーザー入力の一重引用符 (') を 2 つの一重引用符 ('') に変換するために使用されるカスタム関数です。 ASP では、文字列は二重引用符で囲まれるため、上記の「'」は一重引用符が 1 つだけある文字列を表します。 1 つの一重引用符を 2 つの一重引用符に置き換える必要がある理由は、SQL ステートメントでは変数を表すために一重引用符が使用されるためです。混乱を避けるために、文字列内の単一引用符は 2 つの単一引用符で表す必要があります。すべてのユーザー入力は SQL ステートメントに変数として埋め込まれる必要があるため、この関数は必須です。
(2)存贮准备
id=リクエスト("id")
パスワード=リクエスト("パスワード")
nickname=Request("nickname")
email=リクエスト("メール")
セックス=リクエスト("セックス")
注: ユーザー入力フォームの内容を変数に保存する必要はありませんが、読み書きが容易になります。
if Request("name")=""then name=" " else name=request("name")
if Request("phone")=""then Phone=" " elsephone=request("phone")
これらの内容は入力必須ではないため、ユーザーが何も入力せずにデータベース操作エラーが発生することを防ぐため、の場合は、「未入力のフィールドをスペースに置き換える」である必要があります。
(3) 接続を確立する
set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
注: このセクションでは、データベース接続を確立します。データベースの名前は bbssystem.mdb です。このセクションの内容 唯一注意すべき点は、Server.MapPath 関数の適用です。一般に、特定のディレクトリが関係する場合は、ディレクトリ名を直接使用せず、代わりに Server.MapPath 関数を使用します。 Server.MapPath や Request.ServerVariables() などの関数をうまく活用すると、WEB アプリケーションの移植性を高めることができます。
Set cmd = Server.CreateObject("ADODB.Command")
(4) 作成者が既に存在するかどうかを問い合わせます
Set cmd.ActiveConnection = conn
cmd.CommandText = "查询作者"
ReDim param(0) 'パラメータ配列を宣言
param(0) = CStr(id) ' Cint は無視できません
Set rs = cmd.Execute(,param)
注: このセクションは、保存されたプログラムを実行するために使用されます。 ADO でクエリを実行するにはさまざまな方法がありますが、ストアド プロシージャの場合は Command オブジェクトのみを使用できます。まず、cmd という Command オブジェクトを作成し、cmd オブジェクトの ActiveConnection プロパティに conn 接続オブジェクトを設定し、CommandText プロパティに実行するクエリの名前「Query Author」を設定して、クエリパラメータ。クエリ「Query Author」にはパラメータが 1 つしかないため、パラメータ配列 param(0) を宣言しました。つまり、配列のコンポーネントは 1 つだけです。一般に、クエリに複数のパラメータがある場合は、対応する数のコンポーネントを含むパラメータ配列を宣言する必要があります。パラメーターが現れる順序は、配列内のコンポーネントの順序に対応します。パラメータクエリを使用するプロセスでは、パラメータの型が厳密に一致する必要があることに特に注意する必要があります。一致しないとエラーが発生するため、上記の CStr() 型変換関数は必須です。
if not (rs.eof or rs.bof) then
response.write "エラー。入力した ID 番号は占有されています。別の ID 番号を試してください。"
それ以外
sql = "著者テーブルに挿入 (ID、ニックネーム、電子メール、パスワード、名前、学校、学部、性別、電話番号) Values("
sql = sql & SqlStr(id) & ","
sql = sql & SqlStr(nickname) & ","
sql = sql & SqlStr(email) & ","
sql = sql & SqlStr(password) & ","
sql = sql & SqlStr(name) & ",&", "
sql = sql & SqlStr(sex) & ","
sql = sql & SqlStr(phone) & ")"
conn.Execute sql は、
SQL Insert ステートメントを使用してデータベースにデータを挿入します。実際、このクエリを事前に保存されたプログラムにしてデータベースに配置することもできます。私は少し怠け者でした:-) しかし、比較すると、事前に保存されたプログラムの利点もわかります。 troublesome to write the query during execution.
2. 記事表示モジュールを構築する
前述したように、特定の記事は掲示板と本体に属します。したがって、記事を表示する場合、特定のトピックの記事一覧を取得する前に、掲示板リストと件名リストの 2 ページを参照する必要があります。
(1) ボード一覧表示ページ:
<html>
<頭>
<title>カンバンリスト</title>
<meta http-equiv="Content-Type"content="text/html; charset=GB2312">
< /head>
(2)打开连接,显示看板列表
< %Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
sql = "select * from 看板列表"
set rs=conn.execute(sql)
%>
注: 単純な SQL クエリは、カンバン ボードに関するすべての情報をレコード セット RS に返します。次のタスクは、記録されたコンテンツを表示し、対応するボード名にボードのトピックを表示するリンクを作成することです。
< body bgcolor="#FFFFFF">
< h2 align="center">看板列表</h2>
<表の幅="60%" 境界="0"セル間隔="0" セルパディング="0" 整列="センター">
<tr bgcolor="#FFFFCC">
< td height="35" width="25%">スキャンボード名</td>
<td height="35" width="21%">モデレーター</td>
<td height="35" width="23%">トピック数</td>
<td height="35" width="31%">モデレータログイン</td>
</tr>
注: この部分は、テーブルの各列のタイトルを表示するためのものであり、RS レコードの内容を表示するための統一関数は使用しません。これにより、テーブルの外観とスタイルをより詳細に制御できるようになります。 . 使い方 立ち上がるのが少し面倒ですが、その方が柔軟です。
< %
する
ボードid=rs("id")
ボード名=rs("名前")
boardmanager=rs("取締役会の所有者")
response.write "<tr><td><a href=qBoard.asp?boardid="& ボードid& "&boardname=" & ボード名& ">" & ボード名 &"< /a>< /td>"
注: この行は重要なのは、各ボードの名前をクリックすると、ボードのテーマを表示するページに接続できることです。プログラムコードは少し複雑に見えますが、分解して説明しますので、理解していただけると思います。クリックすると、ブラウザーはパラメーター boardid を使用して qBoard.asp ページを要求します。これは、表示されるボードの ID 番号を表すために、要求ページとパラメーターを区切るために疑問符 (?) が使用されます。 Boardid は先ほど設定した変数で、対応するボードの ID 番号が含まれます。この接続には、ボード名を qBoard.asp ページに渡すために使用される別のパラメーター boardname も含まれています。在多个参数间使用"&"来分隔。このパラメータは、qBorad.asp でボード名をクエリするためにボード ID を再度使用することを避けるために渡されます。一般に、データベース操作の使用はできる限り少なくする必要があり、これにより ASP ページのパフォーマンスが向上します。 Response.Write ステートメントはパラメータとして文字列を使用するため、上記の文字列と変数の間に「&」接続文字が使用されます。 ASPページの説明の最終結果は次のようになります
<td><a href=qBoard.asp?boardid=1&boardname=システムボード>システムボード</a><td>。
response.write "< td>< a href=qAuthor.asp?author="&boardmanager & ">" &boardmanager & "< /a></td>"
response.write "< td>" &rs("トピック数") & "< /td>"
response.write "< td>< a href=managerlogin.asp?boardid="&boardid & ">ボード処理< /a></td>< /tr>"
注: この表では、接続に加えて、カンバン テーマのコンテンツには、モザイク クエリ部分とボード サービス処理部分もあります。モデレータ クエリは、データベースから作成者情報を取得して表示するだけです。言った。ボードの処理は、managerlogin.asp ページによって処理されます。これは記事レビューモジュールに属しますが、後で詳しく説明します。
rs.movenext
rs.eofまでループする
%>
注: do... ループを通じて、レコード セット内のすべてのメッセージが表示されます。
</テーブル>
<div align="center"><br>
ボード名をクリックするとトピックリストが表示され、ボード所有者名をクリックするとボード所有者のメッセージが表示されます。
</div>
</本文>
</html>
< %
rs=何も設定しない
接続閉じる
set conn=nothing
%>
(3) qBaord.asp ページを作成します。
<%
boardid=request("boardid") '取出由上个页面传递过来的看板ID号
set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = "主题列表"
ReDim param(0) //注意: パラメータ配列を宣言します
param(0) = CLng(boardid)//注: CLng は無視できません
Set rs = cmd.Execute( ,param)
%>
html>
<頭>
< title>主题列表< /title>
<meta http-equiv="Content-Type"content="text/html; charset=GB2312">
</頭>
<本文 bgcolor="#FFFFFF">
< h1 align="center"><%=rs("かんばん名")%>ボードテーマ一覧</h1>
< table width="80%" border="0"cellspacing="0" cellpadding="0"align="center">
<tr bgcolor="#FFFFCC">
<td width="89%" height="21">テーマ</td>
<td width="11%" height="21">記事数</td>
</tr>
<%
する
propicid = rs( "id")
トピック名= rs( "title")
sum=rs("記事数")
response.write "< tr>< td><a href=qtopic.asp?topicid=" & topicid& "&boardname=" & ボード名& ">" & トピック名 &"< /a>< /td>"
response.write "< td>" &sum & "< /td>< /tr>"
rs.movenext
rs.eofまでループ
%>
</テーブル>
</本文>
</html>
注: qBoard.asp は、特定のフォーラムのすべてのトピックをリストします。トピック名をクリックすると、対応するトピックの記事リストが表示されます。このリストは、ASP スクリプト qTopic.asp によって実装されます。 Qtopic.asp のプログラム コードは本質的には qBoard.asp とほぼ同じですが、それぞれの詳細に違いがあるため、ここではこれ以上詳しく説明しません。
(4) 記事リストの記事タイトルをクリックすると、記事コンテンツ閲覧ページarticle.aspに移動します。
<%
記事ID=リクエスト("記事ID")
set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver(*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn を設定します
cmd.commandtext = "idによるクエリ記事" "
ReDim param(0) ' 声明
param(0) = CLng(articleid) ' Cint は無視できません
Set rs = cmd.Execute( ,param )
author=rs("作者id")
title=rs("タイトル")
data=rs("日付")
rate=rs("推奨度")
boardid=rs("看板id")
トピックID=rs("トピックID")
ボード名=rs("ボード名")
topicname=rs("主题名")
content=rs("コンテンツ")
content=replace(content,vbCrlf,"</p><p>")
content="< p>" & content& "< /p>"
注: コンテンツ フィールドにはメモ型のテキストが含まれており、改行文字を含めることができます。 HTML の表示では、改行文字 (つまり、vbCrlf 定数) を HTML 段落記号に置き換える必要があります。このようにして、段落間の接続によって元の入力形式が損なわれることはありません。デザインを改善したい場合は、CSS を使用して <P> タグをリセットし、その test-indent 属性を設定して、各段落の先頭にスペースを確保できます。
(5) クリック数に1を加算します。
sql="Update 内容表Set 点击次数=点击次数+1Where ID=" & articleid
conn.execute sql
注: ここには SQL ステートメントがあり、ページが表示されると、対応するテーブルのクリック数フィールドが 1 つ増加し、記事のビュー数がカウントされ、順番にランク付けされます。 Article文を実行すると、本来SQL文では埋め込み変数名を一重引用符で区別する必要があるのですが、ここでarticleid変数に一重引用符を付けずに実際に通してしまい、次のように書くと、以前は常にエラーが発生していましたが、ADO の新しいバージョンが原因なのでしょうか。
cmd=何も設定しない
%>
<html>
<頭>
<title>無題ドキュメント</title>
< meta http-equiv="Content-Type"content="text/html; charset=GB2312">
</頭>
<本文 bgcolor="#E9E9E4">
<表幅="89%" 境界="0"セル間隔="0" セルパディング="0" 整列="センター">
<tr bgcolor="#CCCCCC">
<td>著者:<font color="#FF3366"><a href="qauthor.asp?author=< %=author%>">< %=author%> < /a>< /font>発行日: < font color="#FF3333"><%=data%>< /font>
カンバン ボード:< font color="#FF3333"><a href="qboard.asp?boardid=< %=boardid%>">< %=boardname%>< /a>< /font>ボード所有者の推奨:< font color="#FF3333">#rate#</font>< /td>
</tr>
<tr bgcolor="#CCCCCC">
<td>タイトル:<font color="#FF3333"><%=title%>
トピック: < a href="qtopic.asp?topicid=<%=topicid%>"> < %=topicname%>< /a> < /font>< /td>
</tr>
<tr valign="トップ">
<td>
<時>
< font color="#FF3366">記事内容:< /font>< br>
<br>
< font color=blue>< %response.writecontent%>< /font>
<br>
<br>
</td>
</tr>
<tr valign="トップ">
< td height="18">
<table width="50%" border="0"cellspacing="0" cellpadding="0"align="right" bgcolor="#CCCCCC">
<tr>
< td width="0%"> < /td>
<td width="65%">このトピックについて<a href="submit.asp?topicid=< %=topicid%>&boardid=<%=boardid%>">コメントを残す< /a></td>
この接続により、ネチズンはこのコメントのトピックについて自分の意見を表明できるようになります。これについては次のモジュールで説明するので、ここでは触れません。
</tr>
</テーブル>
</td>
</tr>
</テーブル>
</本文>
</html>
< %
rs=何も設定しない
conn.close
conn=何も設定しない
%>
この時点で記事表示部分も完成です。記事公開部分がどのように実装されているかを見てみましょう。
3. 記事公開部分を構築します。
記事公開モジュールには 2 ページのみがあり、1 つは入力フォームを提供するために使用される前述の submit.asp で、もう 1 つはフォームを処理するために使用される subresult.asp です。入力。前のページは基本的に HTML フォームです。subresult.asp の内容を見てみましょう。
<html>
<頭>
< title>发表文章< /title>
<meta http-equiv="Content-Type"content="text/html; charset=GB2312">
</頭>
<本文 bgcolor="#FFFFFF">
< %
著者=リクエスト("著者")
パスワード=リクエスト( "パスワード")
topicid=request("topicid")
boardid=request("boardid")
content=リクエスト("コンテンツ")
title=request("title")
注: このセクションでは、submit.asp で送信されたテーブルの内容を取り出し、対応する変数に入れます。
<html>
<頭>
<title>記事を公開</title>
< meta http-equiv="Content-Type"content="text/html; charset=GB2312">
</頭>
<本文 bgcolor="#FFFFFF">
< %
著者=リクエスト("著者")
パスワード=リクエスト("パスワード")
トピックID=リクエスト("トピックID")
ボードID=リクエスト("ボードID")
content=リクエスト("コンテンツ")
title=request("title")
(1) 著者が存在するかどうかを問い合わせる
cmd.CommandText = "select * from 作者表where id='" & author &"'"
Set rs = cmd.Execute()
(2) 権限を確認する
cmd.CommandText = "select * from author table where id='" & author &"'"
Set rs = cmd.Execute()
注: このセクションでは、作成者の権限を確認し、アカウントが存在しない場合やパスワードが間違っている場合は、それに応じてエラーを処理します。ここでは、現在の ASP スクリプトを終了するために使用される response.end の使用法を確認できます。 if ステートメントと組み合わせると、プログラム内で予期されるエラーを処理できます。優れた WEB アプリケーションでは、エラー処理が不可欠です。
(3)将资料中的单引号改成两个单引号,并且在前后加上单引号
関数 SqlStr(データ)
SqlStr = "'" & Replace( data,"'", "''" ) & "'"
終了機能
'データベースへの書き込み
sql = "コンテンツ テーブルに挿入 (ボード ID、トピック ID、作成者 ID、タイトル、コンテンツ)Values( "
sql = sql & SqlStr(トピックID) & ","
sql = sql & SqlStr(boardid) & ","
sql = sql & SqlStr(作成者) & ","
sql = sql&sqlstr(title)& "、"
sql = sql & SqlStr(content) & ")"
conn.Execute sql
%>
h2>この記事はデータベースに送信されており、モデレーターがレビューした後に見ることができます<H2>
</本文>
</html>
この時点で記事はデータベースに保存されました。ただし、すぐに表示することはできず、モデレータの承認が必要です。次に、フォーラムの管理部分を見てみましょう。
4. フォーラムの管理部分は
フォーラムの中核ですが、その実装に関して特別なことは何もありません。还是那些老东西:窗体处理,数据库查询,在用ASP把他们有机的结合起来。記事レビューモード(前述のボード処理)に入るとき、最も重要なことはモデレータの身元を確認することです。モデレーターのログイン ページを見てみましょう。
< %
ボードID=リクエスト("ボードID")
(注:boardid はこのページへの接続によって渡され、処理されるボードの ID です。これを通じてのみ、どのボードが処理されているかを知ることができます。)
Set conn = erver.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn を設定します
cmd.CommandText = "モデレーターのパスワードのクエリ"
ReDimパラメータ(0)
param(0) = CLng(boardid) //注:CLng 不可忽略
Set rs = cmd.Execute( ,param)
boardmanager=rs("取締役会の所有者")
cmd=何も設定しない
%>
<html>
<頭>
<title>無題ドキュメント</title>
<meta http-equiv="Content-Type"content="text/html; charset=GB2312">
</頭>
<本文 bgcolor="#FFFFFF">
< p>ボード所有者 < %=boardmanager%> のみがこの場所に入ることができます </p>
<P>検証パスワードを入力してください。認証を維持するには、ブラウザのCookieをオンにしてください。 </p>
<フォームメソッド=”ポスト”アクション=“managerloginrest.asp”>
< input type="password" name="password">
< input type="hidden" name="boardid"value=< %=boardid%>>
<input type="submit" name="submit"value="OK">
</フォーム>
注: このページはログイン専用です。Mozhu にパスワードを入力してもらった後は認証を行うことはできません。代わりに、次のページで認証作業が行われます。実際、パスワードの入力と認証作業は1ページで完了しますが、プログラムコードの構造配置が少し面倒です。
</本文>
< /html>
< %
rs=何も設定しない
接続閉じる
conn=何も設定しない
%>
モデレータ ID と入力されたパスワードが取得されたので、次の検証作業が行われます。managerloginrest.asp は、上記のファイルのフォームの内容を受け取り、関連する処理を実行します。
< %
Response.Buffer = True
注:使用を許可するバッファーを設定します。一般に、この項目は各 ASP ページのヘッダーに追加する必要があります。これにより、ASP ページのパフォーマンスが向上します。バッファを開いた後、ASP には対応する特別な使用法がいくつかありますが、これについては後で説明します。
boardid=request("boardid")
パスワード=リクエスト("パスワード")
set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
Set cmd = Server.CreateObject("ADODB.Command")
cmd.activeconnection = connを設定します
cmd.commandtext = "モデレーターパスワードクエリ"
redim param(0) '宣言
param(0) = CLng(boardid)//注:CLng不可忽略
Set rs = cmd.Execute( ,param)
boardmanager=rs("取締役会の所有者")
if パスワード<>rs("パスワード")then %>
<html>
<頭>
<title>認証</title>
<メタhttp-equiv = "content-type" content = "text/html; charset = gb2312">
</頭>
< body bgcolor="#FFFFFF">
パスワードが違います</body>
</html>
< %
それ以外
session("beenthere")=boarded
注: Session を使用してモデレータの ID を維持するには、クライアント ブラウザの Cookie がオンになっている必要があります。セッションはCookieを介して実装されるためです。ここで、そこにある Session 変数にボード ID を代入し、モデレーターが ID 認証に合格したことを示します。後続の各バージョン処理ページで、bethered が対応するバージョン ID と一致するかどうかを確認します。
url="boardmanager.asp?boardid="& ボード ID
Response.redirect URL
補足: ASP を初めて学んだとき、私はいつも response.redirect メソッドに戸惑い、不満を感じていました。ここでいくつかのテクニックを説明します。これを使用する前に、response.buffer=true を渡して ASP ページがバッファを使用できるようにする必要があります。このとき、ASP は HTML プログラム コードに解釈される前にバッファに置かれ、クライアントのブラウザには直接送信されません。もう 1 つ知っておく必要があることは、response.redirect を使用する前に、実際の HTML プログラム コードをクライアント ブラウザに送信することはできません。送信しないとエラーが発生します。もちろん、HTML プログラム コードが response.redirect の前に解釈されている場合は、response.clear メソッドを使用してバッファをクリアし、それを使用してリセットすることができます。
終了する場合
%>
注:下面就是在上面身份验证通过后复位向的目标:boardmanager.asp。処理されたすべての記事がリストされます。
< %
ボードID=リクエスト("ボードID")
if session("beenthere")<>boardidthen response.redirect "forums.asp"
注: ここでモデレータの身元が確認されます。モデレータは Cookie を通じて Bamboo のブラウザでマークされているため、セッションを渡すことができます。司会者。タグが一致しない場合は、response.redirect を通じて元のログイン ページに戻ります。モデレータのブラウザの Cookie がオンになっていない場合、seesion (「beenthere」) の値は空になり、このページにもアクセスできなくなります。
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft AccessDriver (*.mdb)};dbq=" & Server.MapPath("bbssystem.mdb")
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn を設定します
sql="select 名称from 看板列表whereid=" & boardid
set rs=conn.execute(sql)
ボード名=rs("名前")
cmd.commandtext="未公開記事リスト"
ReDimパラメータ(0)
param(0) = CLng(boardid)//注: Clng は無視できません
Set rs = cmd.Execute( ,param)
cmd=何も設定しない
%>
<html>
<頭>
<title>出版処理</title>
<メタhttp-equiv = "content-type" content = "text/html; charset = gb2312">
</頭>
<body bgcolor = "#ffffff">
<H1 align = "center"
<HR>
<%
rs.eofまたはrs.bofの場合、response.write "<H2>/h2>を処理する記事はありません" "
応答.終了
%>
注:ネチズンによって新しい記事が投稿されていない場合、これにより、対応するプロンプトと使用の応答を使用して、このページの表示を終了します。
<テーブル幅= "90%" border = "0" cellspacing = "0" cellpadding = "0" align = "center">
<tr bgcolor = "#ffffcc">
<TD幅= "40%" height = "20"
<TD幅= "40%" height = "20">記事タイトル</td>
<td幅= "8%" height = "20"
<td幅= "12%" height = "20">日付</td>
</tr>
<%
する
propicid = rs( "topicid")
artureId = rs( "articlid")
data = rs( "日付")
datastr = cstr(year(data))& " - "&cstr(month(data))& " - "&cstr(day(data)))
著者= rs( "著者")
articlename = rs( "title")
トピック名= rs( "トピック")
respons.write "<tr >< td >< a href = qtopic.asp?topicid ="&topicid& ">"&topicname& "< /a >< /td>"
respons.write "<td >< a href = managearticle.asp?articleid ="&artureid& "&boardid ="&boardid& "&"&articlename& "< /a >< /td>"
respons.write "<td >< a href = qauthor.asp?author ="& ">&"& "< /a >< /td>"
respons.write "<td>"&datastr& "< /td >< /tr>"
rs.movenext
rs.eofまでループ
%>
</テーブル>
</html>
<%
rs=何も設定しない
conn.close
conn =何も設定しません
%>
</body comperion
対応する記事のリンクをクリックすると、記事の処理ページmangearticle.asp:を入力します。
<%
artureId = request( "articlid")
boardid = request( "boardid")
session( "Beenthere")
conn = server.createObject( "adodb.connection")を設定します
conn.open "driver = {microsoft accessdriver(*.mdb)}; dbq ="&server.mappath( "bbssystem.mdb")
cmd = server.createobject( "adodb.command")を設定します
cmd.activeconnection = connを設定します
cmd.commandtext = "idによるクエリ記事" "
redim param(0)
param(0)= clng(articleId)//注:clngは無視できません
rs = cmd.execute(、param)を設定します
著者= rs( "Authorid")
title = rs( "title")
data = rs( "日付")
レート= rs( "推奨度")
boardid = rs( "kanbanid")
propicid = rs( "topicid")
boardName = rs( "ボード名")
トピック名= rs( "トピック名")
content = rs( "content")
コンテンツ=交換(content、vbcrlf、 "</p><p>")
content = "<p>"&content& "< /p>"
CMD =何も設定しません
%>
html>
<頭>
<タイトル>無題のドキュメント</タイトル>
<メタhttp-equiv = "content-type" content = "text/html; charset = gb2312">
</頭>
body body bgcolor = "#e9e9e4">
<テーブル幅= "89%" border = "0" cellspacing = "0" cellpadding = "0" align = "center">
<tr bgcolor = "#cccccc">
<TD著者:<Font色= "#ff3366" pont color = "#ff3333" ><%= data%>< /font>
カンバンボード:<フォント色= "#ff3333" font color = "#ff3333">#reate#< /font >< /td>
</tr>
<tr bgcolor = "#cccccc">
<TD>タイトル:<フォント色= "#ff3333" ><%= title%>
トピック:a href = "qtopic.asp?topicid = <%= toppid%>"
</tr>
<valign = "top">
<TD>
<HR>
<Font色= "#ff3366">記事コンテンツ:< /font
<br>
<フォントカラー=青><%応答
<br>
<HR>
</td>
</tr>
<valign = "top">
<form method = "post" action = "manageresult.asp">
<TD height = "18">
table幅= "100%" border = "1" cellspacing = "1" cellpadding = "1">
<tr>
td width = "29%">
<div align = "right">
<入力タイプ= "hidden" name = "boardid" value = "<%= boardid%>">
<入力タイプ= "hidden" name = "topicid" value = "<%= toppid%>">
<入力タイプ= "hidden" name = "articlid" value = "<%= articlid%>">
記事の処理:< /div>
</td>
<td幅= "12%" bordercolor = "#006666">削除:
<入力タイプ= "Radio" name = "manage" value = 1>
</td>
<td width = "30%" bordercolor = "#006666">投稿者:
<入力タイプ= "Radio" name = "manage" value = 2>
推奨レベル<名前を選択= "select">
<オプション値= "1"
<オプションvalue = "2" >2 </オプション>
<オプション値= "3"選択された> 3 </オプション>
<オプションvalue = "4" >4 </オプション>
<オプション値= "5"
</select>
</td>
td width = "20%" bordercolor = "#006666">後でプロセス:
<入力タイプ= "Radio" name = "manage" value = 3>
</td>
<TD幅= "9%">
<入力タイプ= "submit" name = "submit" value = "ok">
</td>
</tr>
</テーブル>
</td>
</フォーム>
</tr>
</テーブル>
</本文>
</html>
<%
rs=何も設定しない
conn.close
conn =何も設定しません
%>
注:このページは基本的に、記事ディスプレイモジュールのASPと同じです。
次に、モデレーターの処理プロセスに従って、データベースの対応する部分を変更する必要があります。
<%response.buffer = true%>
html>
<頭>
<タイトル>記事処理/タイトル>
<メタhttp-equiv = "content-type" content = "text/html; charset = gb2312">
</頭>
body body bgcolor = "#e9e9e4">
<%
artureId = request( "articlid")
boardid = request( "boardid")
propicid = request( "topicid")
manage = request( "manage")
'フォームコンテンツを受け入れます
Response.Write Manage 'show buzhu id
session( "Beenthere")
conn = server.createObject( "adodb.connection")を設定します
conn.open "driver = {microsoft accessdriver(*.mdb)}; dbq ="&server.mappath( "bbssystem.mdb")
前のページのモデレーターの操作によると、対応する処理は以下に実行されます。
clng(request( "manage"))= 1 thenの場合
sql = "delete from content table where id ="&artured
conn.execute sql
response.write「<H1>記事が削除されました</h1>」
response.write "<a href => back </a>"
elsef clng(request( "manage"))= 2then
sql = "更新コンテンツテーブルセットパブリッシュ= true whereid ="&articleid
conn.execute sql
sql = "更新トピックテーブルセット記事数=記事の数+1つのwhere id ="&topicid
conn.execute sql
Response.Write「<H1>記事が公開されています</H1>」
response.write "<a href => back </a>"
それ以外
Response.Clear
Response.Redirect "boardmanager.asp?boardid ="&bearded
終了する場合
%>
</本文>
</html>
<%
conn.close
conn =何も設定しません
%>
上記の手順の後、すべての部品は基本的に完了します。使用できるようにしたい場合は、レイアウト設計、クライアントデータ検証などにより多くの努力をする必要があります。しかし、これらはすべてHTMLコンテンツであり、ASPとはほとんど関係がないので、ここで詳しく説明しません。