/************************************/
/* 著者: 年長の若者
/* 電子メール:wenadmin@sina.com
/* 送信元: http://blog.csdn.net/hahawen
/************************************/
「最もシンプルな」Web スクリプト言語として、PHP は国内市場でますます大きくなり、PHPer も増えていますが、モードの問題がどのようなものであるかについては、ほとんどの人が考慮されていないように感じます。あなたの現在の仕事に最も適しているのはどれですか? 結局のところ、効率が最も重要です (節約された時間をゲームをプレイするために使用するのは、どれほど美しいことでしょう...)。 MVC が第一の選択肢です。www.sourceforge.net には、MVC に基づく優れたオープンソース プロジェクトが多数あります。
数日前、私は記事公開システムに重点を置いた会社の Web サイトを刷新しました。私の上司は、バックエンドは好きなように設計できる、唯一の前提条件は高速であることだと言いました。そこで、シンプルな出版システムのフレームワークを構築しました。純粋に記事公開システムに注目すると、基本的に「中小規模」の企業 Web サイト向けの記事公開システムの要件を満たすことができ、バックグラウンドの PHP コードの合計は 800 行を超えず、任意の拡張をサポートします。そしてプラグイン機能。
これ以上ナンセンスではありません。以下に私の構造について話させてください。お役に立てば幸いです。
注: 開始する前に、テンプレート処理ツール クラス:「smarttemplate」をダウンロードし、いくつかのテンプレートの簡単な使用法を理解する必要があります。
私のテスト環境: windows2k/apache2/php4.3.2/smarttemplate クラス ライブラリ
まず、Web サイト全体でのファイルの配布について説明します。次の章では、次のディレクトリとファイルが作成され、埋められます。サーバーの Web ルート ディレクトリは「C:/Apache2/htdocs/」です
Web サイトのメイン フォルダーとして以下のフォルダー「cmstest」を作成しました
フォルダー「cmstest」の下のサブファイル構造は次のとおりです:
/config. .php
/list1.php
/list2.php
/new.php
/add.php
/view.php
/page.js
/src/MysqlUtil.php
/src/ArticleUtil.php
/src / CoreUtil.php
/src/ParseTpl.php
/src/lib/smarttemplate/*.* このディレクトリは、smarttemplate クラス ライブラリの保存に使用されます
/smart/template/list1.htm
/smart/template/list2.htm
/smart/template/new.htm
/smart/template/add.htm
/smart/template/view.htm
/smart/cache/
/smart/temp/
設計手順:
自社の Web サイトの機能と機能を検討する設計したテンプレートの構造を把握し、実装する機能をまとめてリスト化します。
関数リストを分析し、関数を分類します。各タイプの関数には共通点があり、同じ方法で実装できます。
関数に基づいてデータベースのテーブル構造を設計します
データベース名を含むWebサイトの基本情報を記録する構成ファイルconfig.inc.phpを設計します
関数の種類ごとにデータベースクエリを設計しますインターフェース関数、そのため、将来の同様の操作では、このインターフェイスを呼び出すだけで済みます。これにより、将来発生する可能性のある多数のコード重複操作が回避され、コード再利用の目的が達成されます。
今後テンプレート ツールを呼び出すときに、独自のパッケージ化関数を定義するだけで済みます。
基本的な機能はこれでOKです。簡単なページの実装とテンプレートの処理を始めましょう。
ここからは、「最も単純な記事公開システム」を段階的に実装する方法を確認するために、単純なシステムの設計を開始します。はるかに複雑です。
1. 私のケースの分析:
はは、この顧客プロジェクトはとてもシンプルで満足です...
list1.php: 3 つの記事リストと 1 つのボタンがあります。「PHP 開発記事リスト」「PHP 開発人気記事リスト」 asp開発最新記事」「新規記事追加」
list2.php: 記事リストは2つあります「asp開発記事リスト」「asp開発人気記事リスト」
new.php: 記事追加用フォームページ
add.php: new.phpフォームを扱うページ
view.php: 記事閲覧用ページ
2. 分析機能
「php開発記事一覧」「asp開発記事一覧」-------の掲載順による記事を逆順に表示、各ページに5記事ずつ表示
「php開発注目記事リスト」「asp開発注目記事リスト」-----記事のクリック数と閲覧数順に記事を表示します。 3件の記事
「ASP開発に関する最新記事」を記事の公開順に逆順に表示し、3件の記事を表示
「新規記事を追加」-----記事タイトル/を含む記事の公開機能author/content
「記事ビュー」--------記事の内容を表示します
包括的に見て、以下の機能を分類します:
1. 記事リスト: 通常のページングリスト、クリック数によるリスト、公開順のリスト
2. 記事の公開: フォームの入力と処理
3. 記事の閲覧: 記事の内容の読み取りと表示
はは、確かに機能がシンプルすぎます。
3. 設計データベース:
データベース名: cmstest
データテーブル:
CREATE TABLE `article` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR( 100 ) NOT NULL 、
`content` TEXT NOT NULL 、
`datetime` DATETIME NOT NULL 、
`clicks` INT( 11 ) 、
`pid` TINYINT( 2 ) NOT NULL 、
PRIMARY KEY ( `id` )
);
CREATE TABLE `cat` (
`cid` TINYINT( 2 ) NOT NULL 、
`cname` VARCHAR( 20 ) NOT NULL 、
主キー ( `cid` )
); ------------ ----------
article テーブルは記事コンテンツ テーブルです。
------ ----------
`id `記事番号
`title` 記事タイトル
`content` 記事内容
`datetime` 公開時刻
`clicks` クリック数
`pid` 分類表番号
- ------------------------- ---------------
catテーブルは記事のカテゴリーテーブルです
------------------------ --
`cid` 分類表番号
`cname` 分類名
-------- --------------------
上記はテーブル構造のデータベースです。これだけでは不十分ですが、データも追加します
INSERT INTO `cat` VALUES(1, " php 開発"), (2, "asp 開発");
INSERT INTO `article` VALUES(1, "php 開発 1", "php 開発 1 コンテンツ", "2004-8-1 1:1:1", 0, 1);
INSERT INTO `article` VALUES(2, "php 開発 2", "php 開発 2 コンテンツ ", "2004-8-2 1:1:1", 0, 1); Article` VALUES(3, "php 開発 3", "php 開発 3 コンテンツ", "2004-8-3 1 :1:1", 4, 1);
INSERT INTO `article` VALUES(4, "php 開発4", "php 開発 4 コンテンツ", "2004-8-4 1:1:1", 3, 1 );
INSERT INTO `article` VALUES(5, "php 開発 5", "php 開発 5 コンテンツ" , "2004-8-5 1:1:1", 2, 1);
INSERT INTO `article` VALUES (6, "php 開発 6", "php 開発 6 コンテンツ", "2004-8-6 1: 1:1", 1, 1);
INSERT INTO `article` VALUES(7, "php 開発 7", "php 開発 7 コンテンツ", "2004-8-7 1:1:1", 0, 1) ;
INSERT INTO `article` VALUES(8, "jsp 開発 1", "jsp 開発 1 コンテンツ", "2004 -8-1 1:1:1", 0, 2); 9, "jsp 開発 2", "jsp 開発 2 コンテンツ", "2004-8-2 1:1:1 ", 0, 2);
INSERT INTO `article` VALUES(10, "jsp 開発 3", " jsp 開発 3 コンテンツ", "2004-8-3 1:1:1", 4, 2);
INSERT INTO `article` VALUES(11, "jsp 開発 4", "jsp 開発 4 コンテンツ", "2004- 8-4 1:1:1", 3, 2);
INSERT INTO `article` VALUES(12, " jsp 開発 5", "jsp 開発 5 コンテンツ", "2004-8-5 1:1:1" , 2, 2);
INSERT INTO `article` VALUES(13, "jsp 開発 6", "jsp 開発 6 コンテンツ", "2004-8-6 1:1:1", 1, 2); `article` VALUES(14, "jspdevelopment 7", "jspdevelopment 7 content", "2004-8-7 1:1:1", 0, 2);
これでデータベースの設計が完了しました。次に、具体的な実装について説明します。
4. config.inc.php ファイルを設計します
このファイルは、Web 上のいくつかの共通データ情報といくつかのパラメーターを設定するために使用されます。以下は、このページを通じて必要なデータを取得します。 ; ?php
//データベース設定
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost'); ' cmstest');
define('DB_PCONNECT', true);
// Web の基本パス設定
define('C:/Apache2/htdocs/cmstest/'); CMS_ROOT.'src/');
//smarttemplate テンプレート解析ツールの設定
define('SMART_REUSE_CODE', false);
define('SMART_TEMP_DIR' , CMS_ROOT.'smart/temp/');
define('SMART_CACHE_DIR', CMS_ROOT.'smart/cache/');
require_once(CMS_SRCPATH .'lib/smarttemplate/class.smarttemplate) .php');
//含まれる基本ファイルにはいくつかの基本的な関数が含まれます
require_once CMS_SRCPATH.'ArticleUtil.php';
require_once CMS_SRCPATH.'CoreUtil.php '; CMS_SRCPATH.'ParseTpl.php';
//session_cache_limiter('private_no_expire');
session_start();
どこで定義しますか? ; 独自の apach Web パスに応じてパスを変更します (冒頭で紹介したフォルダー構造を参照)。
5. 関数型インターフェースの作成 (1)
まず、データベース操作を簡素化するために mysql データベース関数をラップします。インターネット上には、このようなオープンソース クラスが多数あります。ただし、ここでは私自身のニーズと習慣に基づいて mysql 関数を個人的にパッケージ化しており、それが良いか悪いかは気にしません。ここをざっと見てみましょう。異なるパッケージのクラス操作は異なります。ここでの主な目的は、コードにあまり固執せずにこの「アーキテクチャ」を理解することです。
------MysqlUtil.php--------
function dbConnect(){
global $cnn;
$cnn = (DB_PCONNECT? mysql_pconnect(DB_HOST, DB_NAME, DB_PASSWORD):
mysql_connect(DB_HOST, DB_NAME, DB_PASSWORD)) または
die('データベース库连接错误');
mysql_select_db(DB_NAME, $cnn) or die('数据库选择错误');
mysql_query("SET AUTOCOMMIT=1");
}
関数 &dbQuery($sql){
グローバル $cnn;
$rs = &mysql_query($sql, $cnn);
while($item=mysql_fetch_assoc($rs)){
$data[] = $item;
}
$data を返します。
}
function &dbGetRow($sql){
global $cnn;
$rs = mysql_query($sql) or die('sql语句执行错误');
if(mysql_num_rows($rs)>0)
return mysql_fetch_assoc($rs);
else
null を返す。
}
function dbGetOne($sql, $fildName){
$rs = dbGetRow($sql);
return sizeof($rs)==null? null: (isset($rs[$fildName])? $rs[$fildName]: null);
}
function &dbPageQuery($sql, $page=1, $pageSize=20){
if($page===null) return dbQuery($sql);
$countSql = preg_replace('|SELECT.*FROM|i','SELECT COUNT(*) count FROM', $sql);
$n = (int)dbGetOne($countSql, 'count');
$data['pageSize'] = (int)$pageSize<1? 20: (int)$pageSize;
$data['recordCount'] = $n;
$data['pageCount'] = ceil($data['recordCount']/$data['pageSize']);
$data['page'] = $data['pageCount']==0? 0: ((int)$page<1?1: (int)$page);
$data['page'] = $data['page']>$data['pageCount']? $data['pageCount']:$data['page'];
$data['isFirst'] = $data['page']>1? 真偽;
$data['isLast'] = $data['page']<$data['pageCount']? 真偽;
$data['start'] = ($data['page']==0)? 0: ($data['page']-1)*$data['pageSize']+1;
$data['end'] = ($data['start']+$data['pageSize']-1);
$data['end'] = $data['end']>$data['recordCount']? $data['recordCount']: $data['end'];
$data['sql'] = $sql.' LIMIT '.($data['start']-1).','.$data['pageSize'];
$data['data'] = &dbQuery($data['sql']);
$data を返す;
}
関数 dbExecute($sql){
グローバル $cnn;
mysql_query($sql, $cnn) or die('sql语句执行错误');
return mysql_affected_rows($cnn);
}
関数 dbDisconnect(){
グローバル $cnn;
mysql_close($cnn);
}
function sqlGetOneById($table, $field, $id){
return "SELECT * FROM $table WHERE $field=$id";
}
function sqlMakeInsert($table, $data){
$t1 = $t2 = array();
foreach($data as $key=>$value){
$t1[] = $key;
$t2[] = "'".addslashes($value)."'";
}
return "INSERT INTO $table (".implode(",",$t1).") VALUES(".implode(",",$t2).")";
}
function sqlMakeUpdateById($table, $field, $id, $data){
$t1 = array();
foreach($data as $key=>$value){
$t1[] = "$key= '".addslashes($value)."'";
}
return "UPDATE $table SET ".implode(",", $t1)." WHERE $field=$id";
}
function sqlMakeDelById($ table, $field, $id){
return "DELETE FROM $table WHERE $field=$id";
?>
5. 関数型インターフェースの作成 (2)
内容を見てみましょう。合計で必要な実装関数のパッケージ化
----------------ArticleUtil.php----------------
//記事一覧を表示 Function
//getArticleList(記事カテゴリ、ソート方法、現在表示しているページ、各ページに表示される記事数)
function getArticleList($catId, $order, $page, $pageSize){
$sql = "SELECT * FROMarticle WHERE pid=$catId ORDER BY $order";
return dbPageQuery($sql, $page, $pageSize);
//記事のコンテンツをクエリする
//getArticle (記事番号)
function getArticle($id ; return dbGetRow($ sql);
}
//記事を追加
//addArticle (記事コンテンツ配列)
function addArticle($data){
$sql = sqlMakeInsert('article' , $data);
return dbExecute($sql);
?> このコードはもっと簡単ではないでしょうか?これが、mysql 関数を自分でラップする利点です。
関数がどのように実装されているかを調べてみましょう。
「php開発記事リスト」----------getArticleList(1, "id DESC", $page, 5)
「asp開発記事リスト」--------getArticleList(2, "id DESC", $page, 5)
"php 開発の注目記事リスト"----getArticleList(1, "クリック数 DESC, id DESC", 1, 3)
"ASP 開発の注目記事リスト"----getArticleList( 2, "クリック DESC, id DESC", 1, 3)
"ASP 開発の最新記事"--------getArticleList(2, "id DESC", 1, 3)
"新しい記事を追加"-- -----------addArticle($data)
「記事を表示」--------------getArticle($id)
6.smarttemplate クラスをパックします (革命はまだ成功していません、同志たちはまだ努力しなければなりません)
ここでは、smarttemplate の具体的な使用方法には触れません。そうしないと、言葉が足りなくなってしまい、終わらせることができません。以下は特定のラッパー関数です
---------------ParseTpl.php-----
function renderTpl( $ viewFile, $data){
$page = new SmartTemplate($viewFile); foreach($data as $key=>$value){
if(isset($value[data])){
$page- > assile($ key、$ value [data]);
現在のページ 1/5 12345次のページ
上記の「世界一簡単な PHP 開発モデルの作成」には、そばかすを消す最も簡単な方法の内容が記載されています。PHP チュートリアルに興味がある友人の参考になれば幸いです。