PHPをベースとしたWEB画像共有システム
まとめ
このシステムは主に現代社会における情報化の概念から出発し、既存の資料の分析、研究、整理を通じて、既存のWEB2.0モードに基づく画像共有システム開発の実現可能性、緊急性、必要性を判断します。現段階では、WEB2.0をベースとした国内の画像共有システムは始まったばかりであり、この市場にはまだ参入の余地が大きい。その中には、海外ではすでに非常に成熟した写真共有プラットフォームが存在します。WEB2.0時代になり、情報はサーバーリリースからユーザーリリースへと変わりました。つまり、サーバーを介してリソースを収集および公開する以前のモードから、ユーザーを介してリソースを提供するモードに、サーバーが整理、分類、および公開するモードになります。そして、このモデルは、Web サイトのユーザーにとって、従来のモデルよりもはるかに魅力的です。
この文書は、PHP および Ajax フレームワークに基づく環境で MVC 開発モデルを使用して、完全に機能する画像アップロードおよび画像管理システムを完成させ、画像の便利な追加、削除、分類を実現する方法を詳細に説明することを目的としています。主にユーザーとその写真の管理を実現し、関連する個人設定の変更を実現します。さらに、システムには、写真をアップロードするためのより直観的な進行状況表示が必要であり、写真の表示には、より親しみやすい表示効果が使用されます。
キーワード:モデルビューコントローラー、画像共有、Ajax
目次
3.1.2 ユーザーが写真をアップロードするためにサポートする必要がある形式
3.1.7 システムはマルチユーザーシステムであるため、システムのバックグラウンドにもユーザー管理機能が必要です
5.2.1 MVC に基づく Smartemplate アーキテクチャ
5.2.3 SmartTemplateとhtmlテンプレートの関係
5.3.1 フロントエンドユーザー向けの主なデータベーステーブル構造の設計
5.3.2 管理バックグラウンドデータベースのテーブル構造設計
7.4.1 一括アップロード接続の URL パラメータの漏洩
7.4.2 一括アップロード ページのソース コード内のコールバック スクリプトによりユーザー ID が漏洩する
1序章
少し前のWEB2.0の盛り上がりにより、BS全体の開発方向やWEB運用形態は徐々に別の方向に変化し始めました。AJAX を再利用することで、ユーザーの WEB エクスペリエンスが大幅に向上します。部分的なページ更新方法により、ユーザーがページにアクセスする時間が大幅に短縮されます。また、ユーザーはエクスペリエンスを向上させながらコンテンツ プロバイダーに参加できるようになります。従来のWEBシステムでは、Webサイトに必要なリソースを収集し、公開するために必ずWebサイト管理者などが存在していましたが、WEB2.0の台頭により、共有や経験が徐々にWebシステムの発展において重要な位置を占めるようになりました。ウェブサイト。その結果、Web サイトは以前の集中的な公開モードから、ユーザーがリソースを提供し、Web サイトがそれらを整理して公開するモードに徐々に変化してきました。最も一般的なものは、BLOG と WIKI です。中でも写真共有は大きな発展の可能性を秘めた方向です。まず、中国でデジタルカメラを所有する人の数は着実に増加していますが、現時点ではこの市場の可能性に気づいているウェブサイトは多くありません。ユーザーは写真を撮るとき、撮った写真を簡単に共有できる場所を探します。しかし、今日の従来の Web サイトは、操作が複雑すぎたり、共有に不便だったりします (たとえば、163 では外部接続された画像がサポートされていないため、サーバーの負荷は明らかに軽減されますが、ユーザー エクスペリエンスは大幅に低下します)。想像してみてください。ユーザーがアルバム内の特定の写真を友人に直接見せたい場合、そのアルバムを相手にも接続する必要があり、相手はアルバム内でその写真を見つけた後でのみその写真を見ることができます。さらに、163 にある写真は、デジタル写真用に特別に整理および分類されていない、つまり、多数はありますが正確ではありません。リソースの非効率的な使用につながります。現在、中国ではこの分野の Web サイトはそれほど多くはありませんが、海外では Flikre: www.flikre.com、Bababian: www.bababian.comなどの比較的よく知られた Web サイトがあります。このうち、Baba Change は基本的に FLIKRE リビジョンをモデルとしています。これまでのところ、市場にはまだ介入の余地が比較的大きい。
現在の観点から、写真共有システムが現在解決する必要がある主な問題は、ユーザーが写真をより速くアップロードできるようにする方法です。画像をより高速に表示する方法。その中で、システム開発に影響を与える主な問題は、1. 市場競争、2. ソフトウェアの使いやすさと安定性、3. 時間制限です。市場の一部はすでに初期の競合他社に奪われているため、使用可能なWebサイトシステムをできるだけ短期間で開発する必要があります。システムは当初 2 つの部分に分かれており、1 つは WEB インターフェイスとしての WEB エンドであり、もう 1 つは C/S モードを介してローカル画像をリモートアップロードするためのクライアント ツールです。
2システム概要
ユーザー投稿による画像共有では、まずユーザーのアップロードの効率を向上させ、ユーザーのアップロードエクスペリエンスやユーザーの閲覧が便利かどうかが重要です。一般的な画像共有 Web サイトは、単一のアップロード ページを通じてファイルをアップロードし、表示形式も単一であるため、ユーザーが使用したり閲覧したりするのは不便です。WEB2.0 では、ユーザー エクスペリエンスを向上させるための多数のコントロールが誕生し、写真の共有が従来の形式よりも美しく、より人間味のあるものになりました。
優れたユーザー エクスペリエンスに加えて、優れたシステム サポートも必要です。単なるプログラムではなく、ユーザーのニーズに応じて継続的に拡張できるビジネスプラットフォームと開発プロセス。この卒業プロジェクトは、比較的成熟したフレームワークを使用し、現在の WEB2.0 のニーズと特性に従って書かれています。
WEB2.0 の成熟したフレームワーク インターフェイスを適用すると、現在の高可用性アプリケーションの開発と設計を大幅にスピードアップできます。ユーザーの視点からアプリケーションを設計できるようになります。設計のプレッシャーとリスクを大幅に軽減します。システムは、さまざまな方法でユーザーの写真をアップロードおよび管理できます。また、より一般的なビジュアル フレームワークを使用して画像のプレゼンテーションを実現するため、ユーザー エクスペリエンスが大幅に向上します。
3全体のデザイン
3.1システム要件の分析
写真を共有する場合、考慮すべき 3 つの側面があります: 第 1 に、ユーザーが写真をアップロードする方法、第 2 に、ユーザーがアップロードできる写真の種類、第 3 に、これらの写真をどのように表示するかです。さらに、画像の簡単な構成と統計も実現する必要があります。
したがって、画像をアップロードするユーザーおよび画像を閲覧するユーザーがシステムサービスの主な対象となり、システムの機能には次の要件が提示されます。
3.1.1画像アップロードは方法をサポートする必要がある
画像アップロードは、現在最も使用されているページフォーム方式をサポートする必要があります。そして簡単に加工できます。
さらに、クライアント モードをサポートすることが最善です。また、ユーザーがクライアントをインストールすることなく、WEB上に写真を一括アップロードする機能を実装する必要があります。
3.1.2ユーザーが写真をアップロードするためにサポートする必要がある形式
1 つは JPEG、もう 1 つは PNG です。現在、ほとんどのデジタル カメラは画像の保存に JPEG 形式を使用していますが、著作権の問題を考慮すると、PNG 形式の画像もサポートする必要があります。
3.1.3分類
写真がアップロードされると、写真のラベルと写真のタスクに従って、写真は自動的にラベルとタスクに従って分類されます。
3.1.4画像管理
画像管理に含まれる基本コンテンツ: 画像の削除、画像の追加、画像カテゴリの追加と削除、画像タスクの追加と削除、画像ラベルの追加と削除。
同時に、写真管理では、ユーザーはアップロードした写真をより直感的な方法で表示できます。
3.1.5画像表示
エンドユーザーが閲覧できるように直感的に表示できる必要があります。
3.1.6クエリ機能
ユーザーは自分の分類にある写真の総量とタスクにある写真の状況を知る必要があり、ユーザーはさまざまな状況に応じて自分のカテゴリとタスクにある写真の統計を作成する必要があるため、システムにも分類が必要です。タスクとラベルの複数条件組み合わせクエリ機能。
3.1.7システムはマルチユーザーシステムであるため、システムのバックグラウンドにもユーザー管理機能が必要です
ユーザー管理には、ユーザーの追加、削除、クエリの機能が含まれます。また、ユーザーの写真の表示と削除、ユーザー カテゴリの表示と削除、ユーザー タグの表示と削除も可能です。
3.2全体構造
画像共有システムの主な機能モジュールの構成図は以下のとおりです。
図 3-1画像共有システムの機能ブロック図
画像共有システムは、ユーザーインターフェースとバックグラウンド管理の2つの部分から構成されており、ユーザーインターフェースはユーザーが目に見えて利用できる機能であり、バックグラウンド管理は管理者が使用できる機能である。
3.3画像共有システムの処理
- 画像共有システムのプロセス設計アイデアは次のとおりです。
- ユーザー(ここでは主にシステムを直接使用するエンドユーザーを指します。バックグラウンドで管理機能を持つユーザーは除きます)は、自分の画像形式に従って適切な画像を選択し、システムの処理側にアップロードします。
- システムは、ユーザーがアップロードした画像を受信した後、システムが現在アップロードを許可している画像の種類に応じて、ユーザーがアップロードしたファイルがシステムの要件を満たしているかどうかを判断し、ユーザーが割り当てたラベルを決定する必要があります。アップロードされた画像をアップロードし、アップロードされた画像の設定に従って画像を編集します 形式を分類して変更します このときの画像はシステムに保存されている最後の画像ではありません 画像はカットされ、保存されている形式で保存されていますシステム設定に従って変更されます。(画像フォーマットの統一、出力処理の容易化、画像保存時の処理インターフェースの統一を目的としています。)
- 写真が正常に追加されると、アップロードされた写真はユーザーのフォルダーに直接キャッシュされ、アップロード日に従って整理され、同時に写真のコピーがデータベースに保存されます。
- 写真が保存されると、アップロードされた写真が同時に最前面に表示され、設定されたラベルに写真が追加され、タスクに応じて写真が一括表示されます。
- ユーザーはユーザー管理コンソールで現在のすべての写真を管理でき、写真を削除するときは、単一の写真、カテゴリ、ラベル、およびタスクごとに写真を削除できます。
- アップロードされた写真は、ユーザーの写真表示リンクを通じて、第三者ユーザーに直接提供して閲覧することができます。または、システムによって生成された接続を通じて表示するために、サードパーティ ユーザーに直接送信します。
- バックグラウンド管理者は、システムが提供する機能を通じて、管理ユーザーを直接追加および変更できます。ユーザーに特定の機能を付与する必要がある場合、バックグラウンドユーザーの詳細設定を変更することでユーザー権限を変更できます。
- 管理者は、ユーザーがアップロードした写真を削除する必要がある場合、統合された写真管理インターフェイスを通じてユーザーの写真、カテゴリ、タグ、およびタスクを削除することもできます。
- 画像共有システムのフローチャートは以下の通りです。
図 3-2 画像共有システムのフローチャート
3.4画像共有システムモジュールの機能紹介
画像共有システムは、主に画像の追加と削除、画像ラベルの追加と削除の機能を完結します。複数のユーザーの管理やバックグラウンドでのユーザーの写真の管理も可能です。以下にサブモジュールの分割と各モジュールの機能紹介を記載します。
3.4.1ユーザーインターフェースのサブモジュール分割
図 3-3 ユーザーインターフェースのサブモジュール構造図
- ユーザー インターフェイス サブモジュール - パスワードの変更
パスワード変更は、ユーザー インターフェイス サブモジュールの一部として、主にユーザー パスワード変更の作業を完了します。実行プロセスは次のとおりです。ユーザーがメイン インターフェイスにログインした後、ナビゲーション バーのパスワード変更をクリックし、ユーザー パスワードを変更するためのインターフェイスに移動します。現在使用しているパスワードと変更したパスワードを入力し、変更したパスワードをもう一度入力し、最後にこの操作の確認コードを入力します (ユーザーの便宜のため、確認コードはバックグラウンドで自動的に入力されています)。上記の操作が完了したら、ユーザーは「送信」をクリックしてパスワードを変更します。
ユーザーが変更されたコンテンツを送信すると、ページ内のコードはまず、ユーザーが 2 回変更したパスワードが一致しているかどうかをチェックします。パスワードが一致していない場合は、パスワードが一致していないことを示すプロンプトがユーザーに表示されます。チェックに合格すると、情報がバックグラウンド システムに送信されます。バックグラウンド システムはまず検証コードが同じかどうかを判断し、同じであれば、ユーザーが入力した現在のパスワード ハッシュがデータベース内のパスワード ハッシュと一致するかどうかを比較します。2 つのハッシュが一致すると、バックグラウンド システムはユーザーの現在のパスワードをユーザーの変更されたパスワードに変更します。ユーザーが検証コードを入力しないか、検証コードが間違っている場合、現在のユーザーのパスワード ハッシュはデータベース内のパスワード ハッシュに対応できず、システムは対応するエラー プロンプトを表示します。そして、ユーザーに再度入力するように依頼します。
- ユーザー インターフェイス サブモジュール -写真のアップロード
画像をアップロードするには、ユーザーがシステムにログインした後、ナビゲーション バーの [画像のアップロード] をクリックして画像アップロード機能ページに入ります。この時点で、ユーザーはアップロードする単一の画像を選択することも、ニーズに応じて複数の画像をバッチで直接アップロードすることもできます。1) 単一ページのアップロード: このアップロードでは、ユーザーはシステム要件を満たさない画像をフィルタリングする必要があります。現在のシステムは JPEG と PNG のみをサポートしています。画像形式が要件を満たしていない場合、システムはエラー メッセージを表示します。ユーザーが選択した画像の形式が正しい場合、[アップロード開始] をクリックすると、システムは画像情報を設定するためのダイアログ ボックスをポップアップ表示します。ユーザーは画像の種類を選択し、画像のラベルを設定し、画像情報を設定する必要があります。写真の名前とその他の情報。すべての設定が完了したら、「アップロード用に送信」をクリックすると、ユーザーの写真がシステムにアップロードされ始めます。2) 複数の画像をバッチで直接アップロード: ユーザーが [バッチ アップロード] タブをクリックすると、システムは、この機能には JAVA ランタイム サポートが必要であることを示すプロンプト (名前、説明、分類、タグ、その他の情報) を表示します。次に、バッチアップロードインターフェイスに移動します。具体的な操作手順は一括アップロードページで詳しく解説しています。
画像を管理するには、ユーザーがシステムにログインした後、ナビゲーション バーの [画像のアップロード] をクリックして画像管理ページに入ります。
ページは上段、中段、下段に分かれており、タスク、カテゴリー、タグごとに分類されたユーザー画像の一覧となっています。このリストでは、ユーザーはタスク、カテゴリ、またはラベルに従って画像をバッチで操作できます。同時に、この機能ページでは、カテゴリ、タスク、タグを削除することもできます。
3.4.2管理背景サブモジュール分割
図 3-4管理バックグラウンドサブモジュールの構造図
- 管理者バックグラウンドサブモジュール -システム管理
バックグラウンド管理の重要な部分として、システム管理は主に現在のシステムの環境変数といくつかの説明情報を設定するために使用されます。これらの設定は主に、バックグラウンド管理者がシステムを保守し、システムを初期化するときに決定されます。設定完了後、システムの性能問題やシステム移行以外の場合は、設定した情報を保持することができます。
この関数は、システムがシステム環境変数を拡張するためのより便利な方法を提供します。システムのドメイン名の変更やその他のシステム環境情報の変更など、システムの一般的な設定を後から変更したり、システムの簡単な移行を容易にするのに便利です。
システムの各設定はシステム情報テーブルに記録され、本モジュールの変更はシステム情報テーブルにフィードバックされます。
管理者管理は主に、現在のシステムのバックグラウンドで機能を操作できるユーザーを設定し、そのユーザーがバックグラウンドでどの機能を使用できるかを設定するために使用されます。この機能により、バックグラウンド管理がより柔軟になり、アクセス許可を簡単に管理できるようになります。さらに、特定の機能の運用を専門とするマネージャーを設置することも可能で、管理の煩雑さを簡素化します。
この機能は、システム管理チームを拡張するための便利な方法をシステムに提供します。中期・後期段階での特定の要件を満たすために特定の機能の管理を容易にするために、その機能を専任担当者に割り当てることができます。
同時に、このモジュールは管理者情報を変更する機能も提供します。管理者にとって、さまざまな機能を切り替えたり、既存の権限を変更したりするのに便利です。
ユーザー管理は、現在システムに正常に登録されており、本システムの写真共有機能を利用しているユーザーを管理するために使用します。システムの登録は、フォアグラウンドで提供される登録ページにユーザーを登録するだけでなく、ユーザー管理権限を持つバックグラウンド管理者がバックグラウンドで追加することもできます。ユーザーは自身の管理パネルで自分の情報を変更できるほか、管理者は本モジュールのユーザー編集機能を通じてユーザー情報を変更できます。同時に、検索機能を通じて特定のユーザー名のユーザーを見つけることができるため、操作が必要なユーザーをより迅速に見つけることができます。
画像管理は、現行システムに通常登録している利用者が本システムの画像共有機能を利用してアップロードした画像を管理するために使用します。
このモジュールでは、バックグラウンド管理者は、ユーザーがアップロードした写真を単一のユーザーに従って管理できます。ユーザーの写真を管理するためのインターフェイスは、ユーザー フロントエンドの管理インターフェイスと同じです。さらに、ユーザー管理と同様に、バックグラウンド管理者も特定のユーザー名を検索してユーザーをすばやく見つけ、そのユーザーがアップロードした写真を管理できます。
ユーザーが写真をアップロードする過程で、ユーザーの誤操作により、ユーザーがアップロードした写真が分類またはラベル付けされない場合がありますが、この場合、管理者は写真クリーニング機能を使用してこれらの写真をクリーンアップすることができます。冗長性や不正確なデータによって引き起こされるシステムの不安定性や統計データのエラーを回避します。
4つのオプション
4.1スキームの比較
4.1.1システムモードの比較
現在の開発モデルには主に C/S 構造と B/S 構造が含まれます。
C/S構造、つまりクライアント/サーバー(クライアント/サーバー)構造はソフトウェアシステムのアーキテクチャとしてよく知られており、クライアントとサーバーにタスクを合理的に割り当てることにより、システムの通信オーバーヘッドが削減され、両方の機能が実現されます。ハードウェア環境のメリット。
B/S 構造、つまり Browser/Server (ブラウザ/サーバー) 構造は、インターネット技術の台頭により C/S 構造が変更または改良された構造です。この構造では、ユーザーインターフェイスは完全にWWWブラウザを通じて実現され、ビジネスロジックの一部はフロントエンドで実現されますが、主要なビジネスロジックはサーバーサイドで実現されます。B/S構造とは、成熟化・普及が進んでいるブラウザ技術を利用し、複雑な専用ソフトウェアが必要であった強力な機能を実現し、開発コストを削減する、全く新しいソフトウェアシステム構築技術です。
4.1.2プログラミング言語の比較
現在人気のあるプログラミング言語には、主に ASP、JSP、PHP があります。
ASP の正式名は Active Server Pages です。これは、動的で対話型の高性能 WEB サービス アプリケーションを生成および実行できる WEB サーバー側の開発環境です。ASP は、独自の開発言語としてスクリプト言語 VBScript (Java スクリプト) を使用します。
JSP は、Sun によって発売された新世代の Web サイト開発言語 Java Server Page です。Serverlet と JavaBean のサポートにより、JSP は強力なサイト プログラムを完成させることができます。
PHP (「PHP: Hypertext Preprocessor」) は、広く使用されているオープン ソースの多目的スクリプト言語であり、特に Web 開発に適しており、HTML に埋め込むことができます。
これら 3 つはすべて、HTML コード内に特定のプログラム コードを混合し、言語エンジンにプログラム コードを解釈して実行させる機能を提供します。ただし、JSP コードはサーブレットにコンパイルされ、Java 仮想マシンによって解釈および実行されます。このコンパイル操作は、JSP ページが初めてリクエストされたときにのみ実行されます。PHP、ASP、JSPの環境では、主にHTMLコードで情報の表示形式を記述し、プログラムコードで処理ロジックを記述します。通常の HTML ページは Web サーバーにのみ依存しますが、PHP、ASP、および JSP ページでは、プログラム コードを分析して実行するために追加の言語エンジンが必要です。プログラムコードの実行結果はHTMLコードに再埋め込まれ、ブラウザにまとめて送信されます。PHP、ASP、および JSP はどちらも Web サーバー指向のテクノロジーであり、クライアント ブラウザーには追加のソフトウェア サポートは必要ありません。
ただし、ASP や JSP と比較すると、PHP は導入が容易で、開発が迅速で、柔軟に使用できるという特徴があります。PHPはJSPに比べて複雑な処理が少ないため、実行速度もJSPよりもある程度高速であり、中小規模のシステムの迅速な開発に適しています。
4.2スキームの選択
要約すると、システム開発オプションは次のとおりです。
この画像共有システムは、主なプログラム開発言語として PHP と JavaScript を使用し、smarttemplate + 独立したバックグラウンド管理テンプレートと mysql データベースのフレームワークを採用しています。B/S構造を採用。システムインターフェースは美しく、コンテンツが豊富で、ユーザーとのインタラクションが非常にうまく実現されています。
4.3システム技術プラットフォーム
開発環境:WindowsServer2003 Datacenter Edition SP1、MySql 4.2、Apache2。
開発ツール: ZendStudio、DreamweaverMX、PhotoShop、メモ帳。
システムアーキテクチャ: PHP+Smarttemplate+JavaScript+MySql4.2;
開発言語:PHP5。
4.4開発環境の構築
ネットワークからダウンロードしたファイルを解凍するには、次の操作が必要です。
php.ini ファイルを開き、次の内容を変更します。
最大実行時間 = 600;
max_input_time = 600;
メモリ制限 = 16M
post_max_size = 20M
file_uploads = オン
アップロード最大ファイルサイズ = 20M
デフォルトソケットタイムアウト = 60
上記のオプションは、ユーザーが大きすぎる画像をアップロードしたことによる PHP 処理のタイムアウトを回避します。
register_globals = オフ
magic_quotes_gpc = オン
上記のオプションは、ユーザーが悪意を持って送信するのを防ぐためのものです。
extension_dir = "D:\PHP\PHP\ext"
上記のオプションは、PHP の拡張機能が配置されるフォルダーを設定するために使用されます。
拡張子=php_mbstring.dll
この拡張機能は長い文字セットをサポートするために使用されます
拡張子=php_exif.dll
この拡張機能は、PHP が写真の EXIF 情報を読み取ることをサポートするために使用されます。
拡張子=php_gd2.dll
この拡張機能は、PHP の画像操作と検証コードの生成に使用されます。
拡張子=php_mysql.dll
extension=php_mysqli.dll 上記の 2 つの項目は、PHP が MYSQL をサポートするために使用します。
拡張子=php_sockets.dll
この拡張機能は、PHP の SOCKET サポートに使用され、主にアップロード時にアップロードの進行状況を表示する UPU ライブラリをサポートするために使用されます。
ネットワークからダウンロードしたファイルを解凍するには、次の操作が必要です。
- Apache 構成ファイルを変更します。
解凍ルート ディレクトリの下にある conf ディレクトリを入力します。httpd.conf ファイルを開き、次の内容を変更します。
実行タイムアウトを設定: タイムアウト 300
リスニングポート80を設定: Listen 80
PHP の APACHE サポートを有効にします。
ロードモジュール php5_module d:/php/php/php5apache2.dll
URL 書き換え機能を有効にします: LoadModule rewrite_module modules/mod_rewrite.so
WEBサービスのルートディレクトリを設定します:DocumentRoot "E:\web"
URL 書き換えの範囲を設定します: <Directory />
オプション FollowSymLinks
すべてのオーバーライドを許可
</ディレクトリ>
中国語サポートを設定します。
言語の追加 zh-CN .zh-cn
言語の追加 zh-TW .zh-tw
言語の追加 zh-cn .cn
デフォルトの言語を設定する
AddDefaultCharset GB2312
デフォルトのインデックス ページを設定します。
DirectoryIndex インデックス.html インデックス.html.var インデックス.htm インデックス.php
PHP ファイルを解析するように APACHE を設定します。
AddType application/x-httpd-php .php
- APACHE をサービスとしてインストールします。
コマンド ラインを入力し、APACHE フォルダーの下の BIN フォルダーに移動して、次のコマンドを実行します。
apache -k インストール
- Apacheサーバーを起動します
次のコマンドを実行します。
ネットスタートApache2
- インターネットからダウンロードした MYSQL を解凍し、その構成ファイルを次のように変更します。
default-character-set=utf8 //システム全体が UTF-8 を使用するため、データベースも均一にエンコードされます
key_buffer_size=20M
max_allowed_packet=15M //上記の設定は、画像をデータベースに保存するために大量の情報データを処理するために使用されます。
- MySQLInstanceConfig.exe を実行して MYSQL を初期化します。
- MYSQLサービスをインストールする
mysql d-nt.exe –install を実行して、MYSQL プロセスをシステム サービスとして実行します。
- MYSQLADMIN を使用して MYSQL 管理者を管理する
phpmysdminの設定ファイルを見つけて以下の箇所を修正します。
$cfg['Servers'][$i]['host'] = 'localhost';//localhost に設定します (デバッグのみ)
$cfg['Servers'][$i]['port'] = '3306';//MySQL ポート
$cfg['Servers'][$i]['connect_type'] = 'tcp';//MySQL への接続方法を設定します
$cfg['Servers'][$i]['compress'] = FALSE;//送信には圧縮プロトコルを使用する
$cfg['Servers'][$i]['auth_type'] = 'config';//PHP インストール モードが Apache の場合は、http と Cookie を使用できます。PHP インストール モードが CGI の場合は、Cookie を使用できます。 ; デフォルトはconfigです
$cfg['Servers'][$i]['user'] = 'root';//MySQL 接続ユーザー
$cfg['Servers'][$i]['password'] = '';//MySQL 接続パスワード
5実装テクニックとデータ構造
5.1システムアーキテクチャ設計
5.1.1ネットワークアーキテクチャ
全体のネットワーク アーキテクチャ システムは次のとおりです。
図5-1 画像共有システムのネットワーク構成図
5.1.2システムロジックサーバー
論理的には、使用されるサーバーは 3 つのカテゴリに分類でき、それぞれに異なる機能があります。
Webサーバー: Web上に公開し、一般ユーザーの業務用の操作インターフェース(Webページ)を提供するサーバーであり、処理後に生成されるデータベースクエリを通じてユーザーの操作パラメータをデータベースサーバーに返すと同時に、結果は解析および処理され、再コーディング後に生成されたデータは Web ページを通じてユーザーのフロントエンドに返されます。同時に、WEB サーバーはユーザー要求を解析し、ユーザーが表示できる Web ページを動的に生成する役割も果たします。
データベース サーバー: MySQL データベース システムがこのサーバーにインストールされており、データベース システムの設計は主にこのサーバー用に行われます。システム内で使用されるオリジナルデータやその他の構造データはすべてここに保管され、ユーザーや管理者による情報の追加、変更、削除はすべて最終的にサーバーに反映されます。同時に、サーバーはWEBサーバー経由で送信されたクエリリクエストを処理し、クエリ結果をアプリケーションサーバーに返す必要があります。
5.2システム処理の流れ
本システムはB/SモードとSmartemplate構造を採用しており、利用者はインターネットブラウザをインストールするだけで他のソフトウェアをインストールする必要がありません。システムの処理フローを次の図に示します。
図 5-2 システムの処理フロー
5.2.1 MVC に基づく Smartemplate アーキテクチャ
システムはMVCベースのフレームワークで実現されています。モデルはビジネス ロジックを実装する PHP 解析スクリプトで構成され、コントローラーは SmartTemplate によって実現され、ビューは SmartTemplate 形式のタグを含む HTML ファイルのセットで構成されます。次の図は、ワークフローを簡単に説明しています。
図 5-3 ユーザーのリクエストに応答するワークフロー
MVC は、アプリケーションの入力、処理、出力の分離を強制する設計パターンです。MVC では、アプリケーションをモデル、ビュー、コントローラーの 3 つのコア モジュールに分割し、それらの関係を次の図に示します。
図 5-4 MVC設計パターン
5.2.2 SmartTemplate テクノロジーの概要
このシステムを作成する過程で、数多くの SmartTemplate テクノロジーが使用されますが、SmartTemplate テクノロジーについての私の理解を次のように表現します。
SmartTemplate は、大規模な WEB アプリケーションをサポートするテンプレート エンジンであり、サーバーによって呼び出されて実行される PHP ライブラリです。SmartTemplate 自体はプロトコルに依存しません。
SmartTemplate を理解するには、まずテンプレート エンジンがどのように機能するかを理解する必要があります。
通常のテンプレート エンジンの動作: PHP スクリプトは HTML テンプレートを指定し、動的コンテンツを指定して表示します。テンプレート パーサーは、テンプレート内のすべてのプレースホルダーを割り当てられたコンテンツに置き換えて、ユーザーに表示します。
SmartTemplate はテンプレートのコンパイルと同様に機能し、テンプレートを実行可能な PHP スクリプトに変換し、後で再利用できるように保存します。新しいテンプレートを初めて使用するとき、テンプレート内のすべてのプレースホルダーは、指定されたコンテンツを出力する単純な PHP コード要素に置き換えられます。たとえば、テンプレート フラグメント <H3>{TITLE}</H3> は <H3><?php echo $TITLE; ?></H3> に変換されます。コンテンツを正しい変数に代入すると、テンプレート分析の必要はありません。プログラムで行う必要があるのは、コンパイルされたテンプレートをインクルードして実行することだけです。このキャッシュ方法により、テンプレート エンジンの実行時間を大幅に短縮できます。
5.2.3 SmartTemplateとhtmlテンプレートの関係
システムの移植性を高め、ソースコードを変更せずに Windows、NT、UNIX、Linux 環境でシステムを実行できるようにするために、PHP テクノロジが使用されます。WEB ベースのソフトウェア システムを開発し、PHP スクリプト ツールを使用し、PHP ダイナミック ライブラリを使用してデータベースにアクセスし、一部のオブジェクトのプロパティとメソッドを PHP クラス ライブラリにカプセル化し、クライアント インターフェイスは HTML と JavaScript で完成させ、サーバー側のアプリケーション処理を実行します。 PHP スクリプト + SmartTemplate エンジンを使用して実装できます。
HTML テンプレートは主に最終表示ページを定義するために使用され、PHP スクリプトは主に多数のロジック処理を完了するために使用され、SmartTemplate は処理されたデータを HTML テンプレートに動的にカプセル化し、最終的に表示されるページに使用されます。 PHP エンドで解析された後、顧客に送信されます。つまり、カプセル化および解析された HTML テンプレートは主にフロントエンド ユーザーに送信するために使用され、PHP スクリプトは主にユーザーのリクエストに応答し、リクエストの論理処理を完了すると同時に、次のように機能します。コントローラーであり、応答、トランザクション処理を担当します。
SmartTemplate 自体にはビジネス処理ロジックはなく、PHP スクリプトによって定義されたオブジェクトを取得し、事前定義された HTML テンプレートに動的コンテンツを挿入するだけです。
PHP スクリプトは、SmartTemplate に必要な変数とオブジェクトを作成し、ユーザーの動作に応じてどの HTML テンプレートを処理してユーザーに送信するかを決定します。
実際の開発プロセスでは、多くの場合、最初に HTML テンプレートが開発され、その後、動的に生成する必要がある HTML テンプレートの部分が、事前定義された SmartTemplate タグに置き換えられます。この利点は、HTML のページ パフォーマンス機能を最大限に活用し、ページ パフォーマンスにおける PHP スクリプトの不足を回避し、開発サイクルを大幅に短縮できることです。
以下は、最終的なページ オブジェクトに変換されたプログラム コード内の HTML テンプレートからの抜粋です。
- まず、HTML 編集ツールを使用して HTML ページを作成します。
……。…。…。
<form action="search.php" id="find_photo" method="post">
<div align="left">
画像の検索: <input type="text" name="key" size="24" />
<input id="findbutton" type="submit" name="find_photo" value="搜索" />
</div>
</form>
<!--これはスライドショーの内容です-->
<!-- dojoslidshow の親の ID は変更しないでください --->
{フラッシュ_スライドショー}
</div>
<!--agl:cssobject id="indexphotolist" type="3 列" /->
<!-- BEGIN img_thb_block -->
<div class="threecolbox_indexphotolist">
<a href="{org_link}" class="thickbox" rel="gallery-plants">
<img src="{link}" alt="" width="70" height="70" border="0" />
</a>
</div>
<!-- END img_thb_block -->
…。…。…。
- PHP 解析を通じて、対応するコンテンツを HTML テンプレートに入力します。
……。…。…。
<?php
if (!empty($_obj['img_thb_block'])){
if (!is_array($_obj['img_thb_block']))
$_obj['img_thb_block']=array(array('img_thb_block'=>$_obj['img_thb_block']));
$_tmp_arr_keys=array_keys($_obj['img_thb_block']);
if ($_tmp_arr_keys[0]!='0')
$_obj['img_thb_block']=array(0=>$_obj['img_thb_block']);
$_stack[$_stack_cnt++]=$_obj;
foreach ($_obj['img_thb_block'] as $rowcnt=>$img_thb_block) {
$img_thb_block['ROWCNT']=$rowcnt;
$img_thb_block['ALTROW']=$rowcnt%2;
$img_thb_block['ROWBIT']=$rowcnt%2;
$_obj=&$img_thb_block;
?>
<div class="threecolbox_indexphotolist">
<a href="
<?php
echo $_obj['org_link'];
?>
" class="thickbox" rel="ギャラリー植物"><img src="
<?php
エコー $_obj['リンク'];
?>
" alt="" width="70" height="70" border="0" /></a>
</div>
…。…。…。
5.3データベース設計
上図はシステム設定テーブル(setting)、管理者操作記録テーブル(adminlog)、管理者情報テーブル(admin_info)、画像キャッシュ記録テーブル(hash_cache)、スケッチテーブル(photothumbs)の12個のデータテーブルを要件に応じて設計したものです。 、写真テーブル(photo)、ユーザーグループテーブル(group_setting)、ユーザー情報テーブル(member_info)、ユーザーログイン記録テーブル(loginlog)、写真分類テーブル(sort_setting)、ユーザーアップロードアルバムテーブル(job)、およびタグテーブル(tags_setting)。
表は主に次のセクションに分かれています。
5.3.1フロントエンドユーザー向けの主なデータベーステーブル構造の設計
ユーザー アップロード アルバム テーブル (ジョブ) は、ユーザーがアップロードした一連の写真の基本情報を保存するために使用されます。
表 5-1 ジョブテーブル
名前 |
タイプ |
説明 |
ジョブID |
BIGINT(11) |
シリアルナンバー |
記事 |
メディアテキスト |
アルバムの内容の説明 |
記事のタイトル |
小さなテキスト |
アルバムタイトル |
記事情報 |
小さなテキスト |
アルバム紹介 |
著者 |
varchar(40) |
著者 |
執筆済み |
BIGINT(11) |
著者ID |
並べ替えID |
BIGINT(11) |
カテゴリID |
アルバムID |
BIGINT(11) |
アルバムID |
ヒット曲 |
中整数(7) |
クリック数 |
返信 |
中整数(7) |
返信数 |
返信_ページ |
中整数(7) |
返信のページネーション |
子メール |
BIGINT(11) |
最後の返信 |
最後の投稿者 |
varchar(30) |
最終応答者 |
子ども向けポスター |
BIGINT(11) |
最終返信ユーザーID |
ポストタイム |
BIGINT(11) |
発行時間 |
隠れた |
int(2) |
隠すかどうか |
イスパースール |
int(2) |
引用するかどうか |
IPアドレス |
varchar(16) |
ユーザーのIPを公開する |
ユーザー情報テーブル (member_info) は、写真をアップロードするユーザーの詳細情報に使用されます。写真テーブルと 1 対多の関係があります。
表 5-2 member_info テーブル
名前 |
タイプ |
説明 |
ID |
BIGINT(11) |
ユーザーID |
reg_time |
BIGINT(11) |
登録時間 |
名前 |
varchar(32) |
ユーザー名 |
写真アルバム名 |
varchar(32) |
写真の名前 |
ブログ_アルバム_説明 |
ブロブ(100) |
説明 |
ガンダー |
文字(1) |
性別 |
障害者 |
varchar(64) |
ユーザーのパスワード |
ジッド |
中整数(6) |
ユーザーのグループID |
Eメール |
varchar(64) |
ユーザーのメールボックス |
5.3.2管理バックグラウンドデータベースのテーブル構造設計
システム設定テーブル(設定)は、システムの基本的な設定情報を格納するために使用されます。
表5-3 設定表
名前 |
タイプ |
説明 |
ID |
int(5) |
シリアルナンバー |
変数名 |
varchar(255) |
設定名 |
設定 |
varchar(255) |
設定の説明 |
価値 |
文章 |
設定値 |
タイプ |
varchar(20) |
設定タイプ |
管理者操作記録テーブル(adminlog)。管理者のバックグラウンドでの操作記録を保存するために使用されます。
表 5-4 管理者ログテーブル
名前 |
タイプ |
説明 |
管理者ログ |
int(5) |
レコード番号 |
ウイド |
BIGINT(11) |
管理者番号 |
ユーザー名 |
varchar(32) |
管理者名 |
アクション |
varchar(50) |
操作の名前 |
脚本 |
varchar(255) |
アクションによって呼び出されるスクリプト |
日にち |
int(10) |
アクションが実行されたとき |
IPアドレス |
varchar(16) |
アクションを実行した管理者のIPアドレス |
管理者情報テーブル(admin_info)は、管理者の基本情報を格納するために使用されます(システムの複雑さを軽減するために、管理者の権限と管理者の情報は同じテーブルに直接書き込まれ、管理者の情報は書き込まれません) 2 つのテーブルに独立して分割)
表 5-5 admin_info テーブル
名前 |
タイプ |
説明 |
援助 |
BIGINT(11) |
管理者番号 |
管理者名 |
varchar(32) |
管理者名 |
障害者 |
varchar(64) |
管理者パスワード |
ジッド |
中整数(6) |
管理者グループID(予約) |
can_admin |
int(1) |
システム管理を行う権限 |
can_user |
int(1) |
ユーザー管理を行う権限 |
can_category |
int(1) |
カテゴリ管理を行う権限 |
缶設定 |
int(1) |
設定管理を行う権限 |
6特殊な問題に対する解決策
このシステムの設計と開発の過程でも、多くの問題に遭遇しましたが、より特殊な問題の分析と解決策は次のとおりです。
6.1コード化け問題
在做设计的时候,遇到了乱码问题。在页面间传递时汉字会乱码,如果直接从数据库添加数据显示没有乱码,但是从后台管理添加数据就会在添加成功后的显示页面出现在乱码。对于这个问题,原因是开发平台在WINDOWS下,WINDOWS默认的编码格式是GB2312,但是运行环境却是UTF-8环境,要避免乱码,必须统一整个开发环境的字符编码:
- 首先,统一在数据库中的编码:
在创建数据库以及查询数据库时,将编码首先置为UTF-8
SET CHARACTER_SET_CLIENT = utf8,
CHARACTER_SET_CONNECTION = utf8,
CHARACTER_SET_DATABASE = utf8,
CHARACTER_SET_RESULTS = utf8,
CHARACTER_SET_SERVER = utf8,
COLLATION_CONNECTION = utf8_general_ci,
COLLATION_DATABASE = utf8_general_ci,
COLLATION_SERVER = utf8_general_ci,
AUTOCOMMIT=1";
- 在HTML模版的HEADER部分注明编码标准:
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
- 在PHP输出前在HEADER内容中申明所用的字符流编码:
header('Content-Type: text/html; charset=utf-8');
6.2动态显示上传进度
通过表单上传有一个缺陷,就是不能动态的显示当前文件上传了多少。这样在用户上传比较大的图片时很不方便用户判断上传所耗时间以及浏览器是否超时。解决方法:经过查找,发现一个通过JAVASCRIPT以及PHP的SOCKET库动态生成上传进度的PHP库:UGiA PHP UPLOADER。该库的使用方法很简单,下面具体说明其调用方法:
调用方法:
1.对于upu/misc/upu.js, 修改var basePath = "/upload/upu/"; 为upu相对于网站根目录的路径
2.然后在包含上传表单的页面中加入
<script type="text/javascript" src="upu/misc/upu.js"></script>,这里的
upu/misc/upu.js为upu.js的路径,然后在<form>标签中加入
οnsubmit="return upuInit(this)"
3.在你文件上传后处理的页面中使用$_POST来获取表单数据
4. upu/temp为上传临时文件存放目录, upu/files为文件存放目录,这两个目录可以在upu.class.php中指定。
5. <form>中要有enctype="multipart/form-data"这个属性,action为文件上传成功后的处理页面,也就是说你的<form>完全按照正常的思路来写就可以了,唯一不同的是需要加入οnsubmit="return upuInit(this)"
6. 上传成功后,可以使用$_POST来获取表单数据,如果是普通表单,直接
$_POST['表单名称']即可获得其值,如果是一个文件,则返回这样一个数组
$_POST['表单名字'] = Array (
[filename] =>
[clientpath] =>
[savepath] =>
[filetype] =>
[filesize] =>
[extension] =>
)
6.3图片随意批量上传问题
一般的表单上传模式中,虽然可以动态的生成并且随意添加提供文件上传的表单,但是会给用户带来很多不便,而且导致后台的处理变得更加复杂,故最好的方法是利用后台已有的对单个文件处理的接口来实现随意批量上传的问题。经过具体比较,最终选择jupload的Applet库用作对图片批量上传的中间处理。同时,为了实现对批量上传的文件进行处理,还需要手工编写对上传后的文件进行处理的回调脚本,具体实现原理如下:
首先,jupload在上传一个文件后便会自动调用一个回调脚本来处理上传过后的文件。通过这个回调脚本,可以将上传后的图片手工构造成符合5.2节中的$_POST[表单名称]变量。
具体代码如下:
<?php
include_once('../sys.php');
function message_sender($can_save){
// send error response to jupload
// format depends on API version
switch(php_sapi_name())
{
case 'cgi':
case 'cgi-fcgi':
$sz_htstatus = 'Status: ';
break;
default:
$sz_htstatus = 'HTTP/1.0: ';
break;
}
// fake error message
// if jupload gets != 200 status code, it prints out the error message
if (!$can_save) {
$sz_message='406 It is not acceptable to save this file';
}
else {
$sz_message='200 JUpload uploaded ok';
}
header($sz_htstatus.$sz_message);
}
//未登陆的直接退出
$result = $_GET['jid'];
if (!is_numeric($result) || $result <= 0) {
message_sender(false);
exit(0);
}
$_SESSION['job_title'] = $_GET['job_title'];
$_SESSION['job_cat'] = $_GET['job_cat'];
$_SESSION['job_content'] = $_GET['job_content'];
$_SESSION['job_tags'] = $_GET['job_tags'];
$_SESSION['jid'] = $_GET['jid'];
$_SESSION['uid'] = $_GET['uid'];
$uptp = $_SESSION['job_title'] . '|' . $_SESSION['job_cat'] . "|" . $_SESSION['job_content'] . "|" . $_SESSION['job_tags'];
//处理APPlet字符集编码问题
$uptp = auto_decoding($uptp);
$jid = $_SESSION['jid'];
//$hash_path = $_GET['hashdir'];
//$i = 0;
foreach($_FILES as $tagname=>$objekt)
{
//构造UPU数组
$save_path = ROOT_PATH . 'sys/upu/files/';
$_POST['FileUp']['clientpath'] = $objekt['name'];
$_POST['FileUp']['filesize'] = $objekt['size'];
$_POST['FileUp']['filename'] = basename($objekt['name']);
$_POST['FileUp']['filetype'] = $objekt['type'];
$ext = explode('.',basename($objekt['name']));
$ext = $ext[(count($ext) - 1)];
$_POST['FileUp']['extension'] = $ext;
$_POST['FileUp']['savepath'] = $save_path . sha1(basename($objekt['name']) . time()) . mt_rand(100,999) . '.' . $ext;
// move them to the upu directory
if (!file_exists($_POST['FileUp']['savepath'])) {
move_uploaded_file($objekt['tmp_name'],$_POST['FileUp']['savepath']);
}
$_POST['jid'] = $jid;
$_POST['uptp'] = $uptp;
save_pic(false);
}
//缓存信息
//file_put_contents($hash_path,$post_str);
//构造伪应答信息
if (count($_FILES) == 0){
$can_save = false;
}
else {
$can_save = true;
}
message_sender($can_save);
?>
其中,构造UPU数组段,就是通过对上传后的文件进行构造的代码。通过该代码,后台处理便能直接进行后续处理,不用在单独重写对该内容进行处理的脚本。
以下为处理上传后图片的脚本(整个图片处理抽象为单独的一个类,由于代码太多,故略去)
$pic_info = $_POST['uptp'];
$pic_info = explode('|',$pic_info,4);
$pic_title = trim($pic_info[0]);
$pic_cat = trim($pic_info[1]);
$pic_des = trim($pic_info[2]);
//注意这里的TAG是数组
$pic_tags = explode(',',trim($pic_info[3]));
//用户ID就是相册ID
$album_id = $_SESSION['uid'];
if ($album_id == '') {
$album_id = $_GET['uid'];
}
//处理上传文件
$photo = get_photo_obj($_POST['FileUp'],$db_settings,'DGBN_B6.TTF',80,80);
//得到上传文件的物理路径
$result = $photo->save_pic($db_settings,$pic_cat,$jid,$album_id,'',$pic_title,$pic_des,true,true);
if ($result < 0) {
if ($with_error_exit) {
show_normal_mesR('非法图片<br />您的图片类型为:' . $_POST['FileUp']['filetype'],'非法图片','图片上传');
}
else
return;
}
其中,粗体部分为从之前构造的数组中提取有效信息的代码。
7结果测试、性能分析
7.1运行模块组合
系统根据业务需求,分配相应的模块操作权限、数据库操作权限即相关的角色,所授予的模块和数据库操作权限通过菜单框架结构和页面组合,形成用户操作平台及操作界面。
7.2系统登陆界面
图7-1 系统登录界面图
7.3模块应用举例
7.4系统现存问题
由于时间以及经验有限,系统仍然存在部分问题,还需老师批评指正。
7.4.1批量上传连接的URL参数泄漏
批量图片上传连接暴露了相册ID,用户可以通过非法途径创建并不存在的相册或者通过该URL进行注入点测试
尝试从安全上限制这里提交的JID必须为数字。
7.4.2批量上传页面源代码中回调脚本泄漏用户ID
在批量上传的页面中,批量上传的控件会调用一个回调的PHP脚本,URL:http://192.168.0.43/DOJO_pic_share/sys/jupload/jupload.php?jid=11805460158693&job_title=asdf&job_cat=20060810&job_content=sdfas&job_tags=asdfa&uid=1
从该连接可以直接得到用户的ID这个比较敏感的信息
尝试通过SESSION传递该信息。
7.4.3无法正常返回
用户管理图片时,删除某个分类或者相册的最后一张图片时无法正确的回退到合法页面。当用户删除该图片后会自动回退到上一页面,但是由于该分类或者相册下已经没有图片了,导致出现分类或者相册不存在(因为设计时如果用户删除最后一张图片时,将同时删除该分类或者相册)
尝试修改该处理方法,通过让用户选择返回的页面或者直接返回主页。
7.5改进意见
对于当前系统所存在的各种问题,其中,部分问题需要更改当前的架构设计以满足日后需求。同时,对于系统的界面也需要重新设计,由于当前的页面是基于活动图层结构,部分图层使用了固定位置,导致程序生成时不太灵活,需要修改界面模版。
同时,系统主页生成时间过长,可以使用文件缓冲来替代从数据库中读取。
结 论
目前,经过紧张而有序的毕业设计,图片系统主体功能已全面实现。系统界面简洁,操作方便,功能齐全,实现了用户自注册,上传图片,管理图片,图片分类,图片标签,管理分类,以及管理标签,后台的用户管理,系统管理的功能,实现了图片共享的基本功能。但是也有需要进一步改进的地方,如:在批量上传图片时,受到最大HTTP封包的限制,不能一次传送完毕所有图片,还有在图片管理时标签以及分类的删除对用户端的表现不是很明了。另外,本系统还没有提供给后台管理员一个比较方便的统计功能。
本系统的设计与开发在老师的领导下都参照软件开发公司的设计与开发模式。通过对本系统的需求分析,概要设计、详细设计、编码、测试等每一部分的学习和实践。使我体会到系统的设计阶段有举足轻重的地位,设计的阶段的质量优劣,直接影响到以后系统质量。需求是否准确,影响到最后系统是否能达到用户的要求,概要设计的数据结构的设计,影响数据库的设计是否优越,如果设计合理,在编码阶段实现就相对容易了。详细设计中的相关类的设计和函数的定义,对编码阶段铺垫,使编码水到渠成。
在本系统的实现过程中,本人充分认识到所学的东西还有很多不足,并且从系统实现的过程中获得了许多关于针对具体项目所应当具备的能力,并且相信这对于以后的工作应该有比较大的帮助。
参考文献
[1] 陈浩. PHP 程序设计[M].北京:电子工业出版社,2005。
[2] 邵煜. PHP和MYSQL WEB开发[M].北京:机械工业出版社,2005。
[3] DAVID LANE[美].PHP & MYSQL WEB数据库应用开发指南[M].南京:东南大学出版社,2006。
[4] MIHAI BUCICA[美].AJAX与PHP WEB开发[M].北京:人民邮电出版社,2007。
[5] PETER MOULDING[英].PHP技术内幕[M].北京:中国水利水电出版社,2003。
[6] NARAMORE[美].PHP5、APACHE、MYSQL网络开发 [M].北京:电子工业出版社,2005。
致 谢
この論文は、Chen Yuanheng 氏と Gao Honyu 氏の熱心な配慮と指導の下で完成されました。彼らの深い知識と厳格な学術スタイルは、私に多大な恩恵をもたらし、このプロジェクトを無事に完了する上で大きな役割を果たしました。ここに彼に心から感謝の意を表したいと思います。
陳元亨氏と高紅宇氏の長期にわたるご支援に感謝します 陳元亨氏と高紅宇氏は、長い間、辛抱強く細心の注意を払って私たちを指導し、重要な知識のポイントを補ってくれました。同時に、チェン先生はシステムの論理関係を詳細に分析するのにも協力してくれました。また、ガオ先生はプログラム設計で多大な助けを与えてくれたので、問題の分析と解決に非常に役立ちました。また、論文を完成させるまでに、他の先生方や多くのクラスメートの熱心なご支援をいただきましたこと、心より感謝申し上げます。
このグループに良い学習環境を提供してくださった学校指導者の皆様のおかげで、グループのメンバーの相互協力と助けにより、卒業プロジェクトは無事に完了しました。
ブロガーに注目してください。次の記事はもっとエキサイティングです
ワンクリックでスリーインワン!!!
ワンクリックでスリーインワン!!!
ワンクリックでスリーインワン!!!
ワンクリックトリプルありがとうございます!!!