この記事では、サードパーティのデータベースを使用して電子商取引やその他の複雑で動的な Web サイトを開発するための効果的なツールである MySQL について説明します。 MySQL は、高速、マルチスレッド、フル機能の SQL サーバーです。この記事では、MySQL システムの基本アーキテクチャの説明に加えて、データベースでサポートされる Web アプリケーションの開発に役立つ、Tcl および C++ で記述された簡単な例も提供します。 この記事では、サードパーティのデータベースを使用して電子商取引やその他の複雑で動的な Web サイトを開発するための効果的なツールである MySQL について説明します。 MySQL は、高速、マルチスレッド、フル機能の SQL サーバーです。この記事では、MySQL システムの基本アーキテクチャの説明に加えて、データベースでサポートされる Web アプリケーションの開発に役立つ、Tcl および C++ で記述された簡単な例も提供します。
大量の情報を保存またはアクセスする必要があるアプリケーションでは、サードパーティのデータベース製品を使用すると大きなメリットが得られます。これは、プログラムの複数のインスタンスで情報にアクセスする必要がある場合に特に当てはまります。 Web ベースのアプリケーション (電子取引を含む) がその好例です。
スタンドアロン データベースを使用する理由は何ですか?
Web サーバーには、後でアクセスできるように、処理スクリプトが状態に関する情報を保存する方法が必要です。テキスト ファイルへのダンプや自家製ミニデータベースの開発など、より原始的な方法を使用することもできますが、より複雑な Web アプリケーションに必要なすべてのサービスを提供できるのは、本格的なデータベース アプリケーションだけです。この目的のために無料で利用できるソフトウェア パッケージがいくつかあるため、アプリケーション固有のカスタム データベース エンジンを作成するメリットはあまりありません。 さらに、サードパーティのデータベースを使用すると、Web 開発者がデータベースの開発と保守の作業に専念する必要がなくなります。
MySQLデータベース
データベースを Linux アプリケーションに統合することは、スクリプト言語や C などのコンパイル済みシステム言語を使用することで非常に簡単になります。無料で利用できる MySQL (GNU Public License に基づいて配布) データベースは、高度な SQL 関数のセットを提供し、アプリケーションに簡単に統合できます。 MySQL は高速でマルチスレッドであり、ANSI および ODBC SQL 標準をサポートしています。 MySQL は、サードパーティ ソフトウェアと連携して、トランザクション処理アプリケーション向けのトランザクションセーフなテーブルをサポートします。
注: トランザクション処理とは何ですか?
トランザクションは、アトミックに実行する必要があるデータベースに対する一連の変更です。それらをすべて実行するか、どれも実行しないかのどちらかです。 たとえば、Web 上で製品を販売するときに必要なデータベースの変更はすべて、単一のトランザクションで行われます。
データベースは顧客口座残高と製品在庫の両方を減算する必要があります。そうでない場合、データベースは失敗し、どちらの操作も実行されません。
何らかの理由でサーバーがクラッシュしても、トランザクションが部分的に実行されることがあってはなりません。たとえば、部分的に完了したトランザクションの結果として、過剰請求、製品の未配達、または不正確な在庫が発生する可能性があります。
トランザクション処理をサポートするデータベースでは、トランザクション内の一連のデータベース コードをカプセル化できます。トランザクションの実行中に障害が発生すると、データベースはトランザクションが開始される前の状態にロールバックされます。
これは、すべてのデータベース操作のログと元の状態テーブルのコピーを維持することで実現され、障害後にサーバーが次回再起動されるときにロールバック操作が可能になります。 この時間とスペースのオーバーヘッドは、トランザクションセーフなデータベース システムにとって必要なトレードオフです。
単一の MySQL サーバーが一連のデータベースを制御し、そのすべてがサーバーを通じて同様の方法でアクセスされます。各データベースは実際には任意の数のテーブルのセットであり、概念としては他の SQL データベースのユーザーと同様です。各テーブルは型指定されたデータ列で構成されます。データは、整数、実数値、文字列、または生のバイナリ ストリームを含むその他のタイプにすることができます。 テーブル内の各行は、データベースに保存されているレコードです。
MySQL はクライアント/サーバーとして設計および構造化されています。サーバー mysqld は、インターネットからアクセスできる任意のマシン上で実行できます (適切な応答時間を確保するために、Web サーバーと同じマシンか、できるだけ近いマシン上で実行することが望ましい)。 MySQL クライアントは、リクエストを使用して MySQL サーバーに接続し、サーバーが所有するデータベースを変更またはクエリします。データベース対応 Web アプリケーションでは、データベース クライアントは Web サーバー、または Web サーバーによって生成された CGI スクリプトです。これらのクライアントは、その言語用のデータベース API が存在する限り、高レベルのスクリプト言語または低レベルのシステム言語で作成できます。 Linux では、ほとんどのスクリプト言語は C で実装されており、MySQL C API が存在するため、既存のスクリプト言語またはツールに MySQL サポートを追加するのは簡単です。ほとんどのスクリプト言語は、このステップをすでに完了しています。
MySQL API
MySQL API は、Web サイトのバックエンドの作成に実際に使用されるほぼすべての言語を含む、さまざまな言語で利用できます。 これらの API を使用すると、Web サーバーによって制御される MySQL クライアントを構築できます。
API (データベース アクセス用) は接続ベース モードで動作します。クライアントが最初に行う必要があるのは、MySQL サーバーへの接続を開くことです。これには、サーバーに認識されているユーザー名とパスワードを使用して接続を適切に認証することが含まれます。接続が確立されると、サーバーは使用する特定のデータベースを選択します。初期化が決定されると、クライアント アプリケーション (この場合、サーバー側 CGI スクリプト) は 2 つの方法のいずれかで自由にデータベースと対話できます。テーブルの追加と削除を含む通常の SQL コマンドを実行することと、テーブルにレコードを追加することです。結果を返すデータベースに対してクエリを実行することもできます。クエリは、クエリに一致するレコードのセットを生成します。その後、クライアントは、すべてのレコードが表示されるまで、またはクライアントが保留中のレコードの取得をキャンセルするまで、一度に 1 つずつレコードにアクセスできます。スクリプトがデータベースでの作業を終了すると、サーバーへの接続が閉じられます。
データベース アクセスを統合する Web サイトを構築するには、データベースの状態に基づいて動的な結果を生成する CGI スクリプトを作成する必要があります。 Web サーバーは CGI スクリプトを起動し、適切にフォーマットされた HTML を標準出力ストリームに出力します。 Web サーバーは HTML をキャプチャし、リクエストが静的な HTML ページに対するものであるかのようにクライアントに送り返します。 HTML の生成プロセスにおいて、スクリプトはデータベースを変更したり、クエリを実行して結果を出力に組み込んだりすることができます。
上記のプロセスを簡単に説明する例として、次のコード (C および Tcl で記述) は、企業が販売する製品のリストを含むデータベースにクエリを実行します。 これは、両方の言語の MySQL API のすべての機能を使用しているわけではありませんが、データベースの内容に対して任意の SQL コマンドを実行できる、迅速かつ簡単に拡張可能な例を提供します。 この例では、スクリプトは特定の価格以下のすべての製品を表示します。実際には、ユーザーは Web ブラウザに価格を入力し、それをサーバーに送信します。 HTML フォームの値を決定するための環境変数からの読み取りの詳細は省略しました。これは、データベースをサポートしていない CGI スクリプトでの実行と変わらないためです。 明確にするために、特定のパラメーター (クエリ対象の価格など) が事前に設定されていると仮定します。
次のコードは、無料で利用できる Tcl Generic Database Interface を使用して Tcl に実装されています。このようなインターフェイスの利点は、Tcl が解釈され、コードを迅速に開発および変更できることです。
Tclの例
#このコードはデータベース内のすべての製品を出力します
# 指定された価格を下回る価格 (決定されたものとみなします)
# 事前に設定し、変数 targetPrice に格納します)
# 出力は HTML テーブル形式であり、CGI 出力に適しています
#SQL 共有オブジェクト ライブラリをロードすることもできます。
#ライブラリでコンパイルされているため、この行は不要です
/home/aroetter/tcl-sql/sql.so をロードします
#これらは事前に明確に定義されているか、または定義されている可能性があります
#スクリプトに渡される
DBNAME「clientWebSite」を設定します。
TBLNAME「製品」を設定します。
DBHOST「backend.company.com」を設定します
setDBUSER "mysqluser"
DBPASSWD「abigsecret」を設定します
targetPrice 200 を設定します。
#データベースに接続する
ハンドルを設定 [SQL 接続 $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# テストデータベースを取得
#指定されたSQLコードを使用してクエリを実行します
SQL クエリ $handle "select * from $TBLNAME where Price <= $targetPrice"
#html テーブルのヘッダーを出力
「<table border=4>」を入れます
「<th>製品 ID <th width=200>説明 <th>価格 ($)」を入力します
#output table rows - 各 fetchrow は 1 つの結果を取得します
#SQL クエリから
while {[set row [sql fetchrow $handle]] != ""} {
set prodid [lindex $row 0]
説明を設定 [lindex $row 1]
価格を設定 [lindex $row 2]
put "<tr><td>$prodid <td align=center>$descript <td>$price"
}
「</table>」を入れます
#クエリ結果バッファを空にする - この場合はすでに空になっているはずです
SQLエンドクエリ$ハンドル
#データベース接続を閉じます - 実際にはこれと同じ接続です
#は複数のクエリに使用されます
SQL切断$ハンドル
以下のコードは、公式 MySQL C++ API MySQL++ を使用して C++ で書かれた同等のスクリプトです。このバージョンの利点は、コンパイルされるため、インタプリタ型言語よりも高速であることです。特定のサイトで頻繁に使用されるデータベース コードは、C または C++ で記述し、スクリプトによってアクセスするか、Web サーバーから直接アクセスして、全体的な実行時間を向上させる必要があります。
C++ の例
#含む
#含む
#含む
const char *DBNAME = "clientWebSite";
const char *DBTABLE = "製品";
const char *DBHOST = "backend.company.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":
int main() {
試す {
//データベース接続を開いてクエリを実行します
接続 con(DBNAME、DBHOST、DBUSER、DBPASSWD);
クエリクエリ = con.query();
// 有効な SQL コードをクエリ オブジェクトに書き込みます
クエリ << "select * from " << DBTABLE;
// クエリを実行し、結果を保存します
結果 res = query.store();
// HTML テーブルのヘッダーを書き出す
cout << "<table border=4>n";
cout << "<th>製品 ID <th width=200>説明"
<< "<th>価格 ($)" << endl;
結果::イテレータ curResult;
行行;
//各結果を反復処理し、それを HTML テーブルに入れます
for (curResult = res.begin(); curResult != res.end(); curResult++) {
行 = *curResult;
cout << "<tr><td align=center>" << row[0]
<< "<td>" << 行[1]
<< "<td>" << row[2] << endl;
}
cout << "</table>" << endl;
} catch (BadQuery er) {
// 不正なクエリを処理します (通常は SQL 構文エラーが原因です)
cerr << "エラー: " << er.error << endl;
-1 を返します。
} キャッチ (BadConversioner) {
//データベースからの変換エラーも処理します
cerr << "エラー: "" << er.data << "" を "" に変換できません
<< er.type_name << ""." << endl;
-1 を返します。
}
0を返します。
}
安全
Web 上で Web ベースのアプリケーションを作成するには、開発者が考慮する必要がある問題がいくつかあります。 Web サーバーの処理権限やスクリプト側の入力チェックなど、Web サーバー上の CGI プログラムに関連するすべての問題は依然として考慮する必要があります。
また、データベースシステムのセキュリティも維持する必要があります。これには、データベース サーバーの権限システムを保護し、データベース クライアントからサーバーへの接続を安全にすることが含まれます。
MySQL は、「高度ではあるが標準ではない」と表現する人もいる徹底したセキュリティ システムを提供します。 MySQL では、ユーザー名、クライアント ホスト、およびアクセスするデータベースに基づいてクライアント アクセスが可能です。安全なシステムを作成するには、すべてのユーザーに強力なパスワードを使用させ、絶対に必要でないアクセス権をユーザーに与えないでください。これには、他のユーザーのパスワードを変更するプロセスを含む、実行中のすべてのプロセスをユーザーに表示できるハンドル権限など、一見無害な権限が含まれます。最善の方法は、サーバー プロセス自体を特権のない Unix ユーザーとして実行して、1 つのデータベースが侵害されてもシステム全体がダウンしないようにすることです。これは、root ではなくユーザー none として httpd を実行するのと似ています。 システム アクセスを記述するテーブルは別個の MySQL データベースとして保存され、MySQL root ユーザーによって更新できます。 MySQL サーバーは、Unix ユーザー名とは異なる MySQL ユーザー名に基づいて権限を付与することに注意してください。ただし、データベースに対する完全な権限を持つ MySQL root ユーザー名が存在します。サーバーが、接続しているクライアントが誰で、何に接続しようとしているかを判断すると、アクセスは、指定された一連の権限に基づいて制御されます。アクセス テーブル内のホスト名が DNS によってスプーフィングされるのを防ぐには、すべてのホストの IP アドレスを入力するか、サーバーに IP アドレスを元のホスト名に解決するように依頼して、他のユーザーによる DNS 要求と応答の傍受をより困難にします。 。
サーバー アクセス テーブルに加えて、サーバーとの通信も安全である必要があります。クライアントからサーバーにログオンする場合、パスワードはプレーン テキストで送信されません。ただし、後続の SQL コマンドはすべてプレーン テキストで送信されます。セキュリティを強化するには、ssh を使用してポート転送を設定します。サーバーとクライアント間のすべての通信が暗号化され、転送中に誰かが通信を観察することができなくなります。クライアントからのデータは、ローカル SSH サーバーがリッスンしているクライアントのローカル マシン上のポートに送信されます。これはローカル ssh サーバーによって使用され、暗号化されてリモート ssh サーバーに送信され、リモート ssh サーバーで復号化されて MySQL サーバー ポートに転送されます。
実際には、最も安全なアプローチは、Web サーバーと同じマシン上でデータベース サーバーを実行し、Web サーバーによって生成された CGI スクリプトが UNIX (ネイティブ) ソケット経由で MySQL サーバーと通信できるようにすることです。この設定により、データベース管理者は MySQL サーバーへのすべてのリモート接続を無効にすることができます。 Web サーバーとデータベース サーバーを別のマシン上に配置する必要がある場合は、それらの間のすべての通信を暗号化するか、物理的に分離された専用のネットワークを介して 2 つのマシンを接続します。 Web サーバーがデータベース サーバーにログインするために使用するユーザー アカウント (root ユーザーを除く) を 1 つだけ作成します。
データベース駆動型 Web サイトは、開発者が更新情報を提供し、クライアントが開始した変更を複数のセッションにわたって維持できる動的サイトを作成できる強力なツールです。電子商取引やその他のアプリケーションのユーザーを管理するには、バックエンド データベースの使用が不可欠です。無料で利用できるソフトウェアを使用すると、データベース接続をサイトの既存の CGI アーキテクチャに安全に統合するデータベース駆動型のサイトを構築できます。