ホームページ  >  記事  >  バックエンド開発  >  世界一簡単な PHP 開発モデルの作成 ページ 1/5_PHP チュートリアル

世界一簡単な PHP 開発モデルの作成 ページ 1/5_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:59:35932ブラウズ

/************************************/
/* 著者: 年長の若者
/* 電子メール:wenadmin@sina.com
/* 送信元: http://blog.csdn.net/hahawen
/************************************/

「最もシンプルな」Web スクリプト言語として、国内市場では php がどんどん大きくなり、phper も増えてきましたが、どのような設計モードが最適なのかというモードの問題についてはほとんどの人が考慮されていないように感じます。 ? は、現在の仕事に最適です。結局のところ、効率が最も重要です (節約された時間をゲームに費やすことがどれほど美しいか...)。 MVC が第一の選択肢です。www.sourceforge.net には、MVC に基づく優れたオープンソース プロジェクトが多数あります。

数日前、私は会社のウェブサイト、主に記事公開システムを刷新しました。私の上司は、バックエンドは好きなように設計できる、唯一の前提条件は高速であることだと言いました。そこで、シンプルな出版システムのフレームワークを構築しました。純粋に記事公開システムに注目すると、基本的に「中小規模」の企業 Web サイト向けの記事公開システムの要件を満たすことができ、バックグラウンドの PHP コードの合計は 800 行を超えず、任意の拡張をサポートします。そしてプラグイン機能。

これ以上はナンセンスです、以下に私の構造について話させてください、それがあなたの助けになれば幸いです。

注: 始める前に、テンプレート処理ツール クラス「smarttemplate」をダウンロードし、いくつかのテンプレートの簡単な使用法を理解する必要があります。

私のテスト環境: windows2k/apache2/php4.3.2/smarttemplate クラス ライブラリ

まず、Web サイト全体でのファイルの配布について説明します。次の章では、次のディレクトリとファイルが連続して作成され、埋められます。
私のサーバー Web のルート ディレクトリは「C:/Apache2/htdocs/」です
Web サイトのメイン フォルダーとして以下のフォルダー「cmstest」を作成しました
フォルダー「cmstest」の下のサブファイル構造は次のとおりです:

/config.inc.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開発の最新記事」を記事の公開順に逆順に表示します。
「新規記事を追加」----- 記事を公開しています。 /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` 分類名
-------------- --------------

上記はテーブルのデータベース構造です。これだけでは十分ではありませんが、data
INSERT INTO `cat` VALUES(1, "phpdevelopment"), (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);
INSERT INTO `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); category` VALUES(8, "jsp 開発 1", "jsp 開発 1 コンテンツ", "2004-8-1 1:1:1", 0, 2);
INSERT INTO `article` VALUES(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); 14, "jsp 開発 7", "jsp 開発 7 コンテンツ" , "2004-8-7 1:1:1", 0, 2); このようにして、データベースは設計されています。次に、具体的な実装について説明します。

4. config.inc.php ファイルを設計します

このファイルは、Web 上でいくつかの一般的なデータ情報といくつかのパラメーターを設定するために使用されます。以下は、このページを通じて必要なデータを取得するために使用されます。


//データベース設定
define('DB_USERNAME', 'root');
define('DB_HOST', 'localhost'); ' DB_NAME', 'cmstest');
define('DB_PCONNECT', true)

// Web の基本パス設定
define('C:/Apache2/htdocs/cmstest/'); define ('CMS_SRCPATH', CMS_ROOT.'src/');

//smarttemplate テンプレート解析ツールの設定
define('SMART_TEMPLATE_DIR', CMS_ROOT.'smart/template/'); Define ('Smart_temp_dir', CMS_Root.'smart/Temp/'); _Lifetime ', 100);
Require_once (cms_srcpath.' lib/smarttemplate/class.smarttemplate.php');いくつかの基本的な関数が含まれています
require_once CMS_SRCPATH.'ArticleUtil.php';
require_once CMS_SRCPATH.'ParseTpl.php';
//セッションcontrol
session_cache_limiter('private_no_expire');

?>


; where define( 'CMS_ROOT', 'C:/Apache2/htdocs/cmstest/'); 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"); 
}

function &dbQuery($sql){
global $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 を返す; 
}

function dbExecute($sql){
global $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-------------- --
//記事一覧を表示する関数
//getArticleList(記事カテゴリ、ソート方法、現在表示しているページ、各ページに表示される記事数)
function getArticleList($catId, $ order, $page, $pageSize){
$sql = "SELECT * FROM Article WHERE pid=$catId ORDER BY $order";
return dbPageQuery($sql, $page, $pageSize);
//記事の内容
//getArticle (記事番号)
function getArticle($id){
$sqlUpdate = "UPDATE 記事 SET clicks=clicks+1 WHERE id=$id";
dbExecute($sqlUpdate); = "SELECT * FROM 記事 WHERE art_id=$ 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- &gt; assion($ value [data]);

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/317380.html技術記事 /************************************/ /*著者:年配の若者/*電子メール:wenadmin@sina.com /*出典:http://blog.csdn.net/hahawen /************************************/ php として "最もシンプル...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。