ホームページ  >  記事  >  バックエンド開発  >  PHP模倣ブログパーク個人ブログデータベースとインターフェース設計_PHPチュートリアル

PHP模倣ブログパーク個人ブログデータベースとインターフェース設計_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:16:411113ブラウズ

半年以上、断続的にPHPを独学で勉強してきましたが、最終的には気持ちを引き締めてPHPを続けてきたので、頼まれてもいない安定したPHPの仕事を見つけるためにこのPHPブログを書きました。給料は高いけど、居場所。私は英語の文書のほとんどを理解できます。私は愚かではないので、興味があれば、私に連絡してください。誠実な方は来てください! qq:240382473
すべてのキー コードとドキュメントの手順を 3 ~ 5 回に分けてリリースし、ブログ バックエンドのすべてのスタイルがブログ パークに適用されます

説明:

1. MVCアーキテクチャを完全に採用しているわけではありませんが、コンセプトとしてはこんな感じです。非常に安定した MVC アーキテクチャを書くことは不可能だからです。
2. JQUERY AJAX はあまり使い慣れていないのでほとんど使っていませんが、ゲストブックには AJAX を使用しても問題ありません。
3. 公開クラスがいくつかあり、その他のコードはすべて手書きです。不足している点があればご指摘ください。
4. 批判や指導は歓迎しますが、その理由も教えてください。

もっと身近な話: まずデータベースのアーキテクチャを見てみましょう

これらのテーブルのエンジンはすべて MYISAM であり、アクセスに便利です。 (黄色のキーは主キーを表します。青いひし形は空ではないフィールドを表します。白いひし形は null フィールドを表します) 図内のリンクは、それらの間の潜在的な関係を表すだけであり、検索エンジンの操作中に関連付けることはできません。 MyISAM です。 したがって、結合クエリと複数テーブルの操作が必要です。

投稿テーブルとカテゴリ テーブルで最も重要な特殊フィールドを選択して詳細に説明し、その他のフィールドは重要なものとして説明します。
投稿:
投稿ID
category_id varchar(10) これはブログ投稿のインデックスに使用されるカテゴリです。ここでの category_id も文字列型なので、ブログ投稿ごとに複数のカテゴリを設定できます。

type varchar(20) このフィールドは、投稿、記事、日記を区別するために使用されます。postDraft、articleDraft に設定することもできます。
visiable ブログ投稿が表示されるかどうか

その他の一般的に使用されるフィールドには、タイトル、コンテンツ、作成時刻、最終変更時刻、ビュー数、コメント数、タグ、許可されたコメント、および一部の予約フィールドなどがあります。

カテゴリ:
将来の拡張のためのparent、count_child_number、count_parent_number
type ではフォトアルバム、ブログ投稿、日記のカテゴリーをそれぞれ設定できます
名前、説明、作成時間、可視性などのその他の一般的なフィールド
コメント:
ユーザーのIPアドレス
user_agent ユーザーのブラウザの種類

他のフィールドは省略されています...
サーバーアーキテクチャ
PHP5.4.2 + MYSQL 5.523 + APACHE 2.2.22 + Windows NT ARIST-PC 6.1 ビルド 7600 (Windows 7 Home Basic Edition) i586 (ローカル)
ブログのアーキテクチャ

バックエンドディレクトリ:

バックエンドディレクトリの説明:


Assert はさまざまなリソース js、css、画像を保存します
class には、クラス、データベース操作クラス、ページング クラスなどの一般的に使用されるクラス、およびほとんどのモデルが格納されます。 。 。
extension は mce のリッチエディターなどの拡張機能を保存します
config は設定情報を保存します
templates はすべてのテンプレートを保存します (smarty は使用されません)
ストアの写真やその他のファイルをアップロードします
管理ルート ディレクトリには、index.php、post.php、article.php、photo.php などの同様のコントローラーがいくつかあります

まずはadmin/config/config.phpを見てみましょう
复制代码代码如下:
ini_set( "表示エラー", true );
date_default_timezone_set( "アジア/上海" );
// ルートとディレクトリは別です
定義('DS', DIRECTORY_SEPARATOR);
定義('ROOT', dirname(dirname(__FILE__)));

// データベース情報
// ハッシュが必要です
定義( "DB_USERNAME", "****" );
定義( "DB_PASSWORD", '*****' );
定義( "DB_NAME", "ブログ" );

// 重要なディレクトリ
定義( "CLASS_PATH", "クラス" );
定義( "TEMPLATE_PATH", "テンプレート" );

// ユーザー情報
定義( "ADMIN_USERNAME", "管理者" );
define( "ADMIN_PASSWORD", '$2a$08$wim8kpwHhAKAa6MBSsGUMGOYfjkU1xvRKd4Fxwal.wj8dqFboCVSFawim8kpwHhAKAa6MBSsGUMGO');
// パスワードをハッシュして検証します
関数ハッシュ($info, $encda​​ta = false){
$strength = "08";
//暗号化されたデータが渡された場合は、入力 ($info) と照合してチェックします
if ($encda​​ta) {
if (substr($encda​​ta, 0, 60) == crypt($info, "$2a$".$strength."$".substr($encda​​ta, 60))) {
true を返します。
}その他{
false を返します。
}
} その他 {
// ソルトを作成して入力でハッシュし、最後にソルトを追加します
$salt = "";
for ($i = 0; $i <22; $i++) {
$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
}
// 82 文字の文字列 (60 文字のハッシュと 22 文字のソルト) を返します
return crypt($info, "$2a$".$strength."$".$salt).$salt;
}
}

関数 __autoload($className) {
if (file_exists(ROOT . DS . 'classes' . DS . strto lower($className) . '.class.php')) {
require_once(ROOT . DS . 'classes' . DS . strto lower($className) . '.class.php');
} その他 {
/* エラー生成コードはここにあります */
}
}



ここでは、いくつかの基本的な頻度と関数を定義します。
__autoload() 関数数追加 admin/class/ 中的すべてのクラス
hasher() 関数を使用して 88 ビットの不可逆暗号を暗号化し、登録手続きは config.php 内の常量関数と hasher() 関数を使用して実行されます。
来看我们的 admin/index.php 後台制御器 この制御器主页 いくつかの博客の関連データを表示します
复制代码代码如下:
require_once( "config/config.php" );
session_start( );
$action = isset( $_GET['action'] ) ? $_GET['アクション'] : "";
$username = isset( $_SESSION['username'] ) ? $_SESSION['ユーザー名'] : "";

if ( $action != "ログイン" && $action != "ログアウト" && !$username ) {
ログイン();
出口;
}

switch( $action ){
ケース「ログイン」:
ログイン( ) ;
壊す;

ケース「ログアウト」;
ログアウト( );
壊す;

デフォルト:
管理者();
壊す;
}

関数ログイン( ){
$results['pageTitle'] = "ログインフォーム";
// ログインを処理します
if( isset( $_POST['login'] ) ){
// 定数変数から簡単に検証します
// データベースからユーザーを検証する必要がある場合は、後で実行します
// $user = 新しいユーザー ;
// $user->isValidateUser( $name, $password );

if ( $_POST['ユーザー名'] == ADMIN_USERNAME && $_POST['パスワード'] == ハッシュ($_POST['パスワード'], ADMIN_PASSWORD ) ){
// セッションデータを登録します
$_SESSION['ユーザー名'] = ADMIN_USERNAME ;
// 管理ページへの場所
header( "場所:index.php");
} その他 {
// ログインに失敗しました: ユーザーにエラー メッセージを表示します
$results['errorMessage'] = "ユーザー名またはパスワードが間違っています。もう一度お試しください。";
require( TEMPLATE_PATH . "/loginForm.php" );
}
} その他 {
require( TEMPLATE_PATH . "/loginForm.php" );
}
}

関数管理者( ){
$results['pageTitle'] = "管理者ページ";
require( TEMPLATE_PATH . "/admin.php" );
}

関数 logout( ){
$results['pageTitle'] = "ログインページ";
unset( $_SESSION['ユーザー名'] );
header( "場所:index.php ");
}



これは从一老外那里学的です!

原則です:
最初我们追加我们的config.php、初開始化セッション变量、获得$actionこれ重要变量的值;
その後、 $action と $username の値を判断し、ユーザー名が空であり、ユーザー名が空である場合は、ログインページを返します。
例: 結果用户正确入了用户名と秘密コード、注册一セッション变量$username、その後主面index.phpにジャンプ、今回我们会调用默认的$action admin()、この関数数会加ダウンロード一模版admin.php ;ここには、いくつかの数の値 $results['pageTitle'] と、私たちの後台博客型フレームワークがあります。
ユーザが入力に問題があった場合は、提案メッセージが表示されます。
これは、「行動」を与えてから「何かをする」ことです
私たちは次のコードで反撃する予定です。
これは、博客のコピーから得られた、博客のアフター ステーションのフレーム形式であり、テーブル レイアウトを採用しており、互換性があり、その他の形式を自由に設定でき、単一で、実用的で、拡張性があり、完璧なアフター ステーション フレームです。

このような形式は、他のブラウザでも同様の互換性を示し、このセクションのブログを書き込むときに、一部の機能を達成しました。一篇有个核心概念就是 give action do something!

この篇我就用代码来解释この概念は啥意思、先看我的 post.class.php です。 このファイルは私によるデータ層処理の種類です。  




简单介绍一下这个モデル类,它继承了一データベース库来做crud等常用操作、每次初期化時就会初化一个データベース库对オブジェクト$db。 私はこのオブジェクトを使用して私のデータを操作します。 データ操作には、storePostFormValues() 、storeDiaryFormValues() という 2 つの重要なメソッドがあり、これら 2 つのメソッドがデータ ストリームの始まりとなります。 また、addChildNumber()、reduceChildNumber() という 2 つのメソッドがあり、それらはファイルの挿入または削除時に 1 つのダークボックス操作を実行します。問題は、カテゴリ テーブル内にそのカテゴリのテキスト数を示すフィールドがあるため、これらの数値の値を変更する必要があることです。 以下では、post.php コントローラーを使用して、データのフローを開始できます (コントローラーも別の種類であり、API 文を生成することはできません。これは真の MVC フレームワークではないためです。) MVC の前に、これも行います。 MVC の根幹は神聖なサービスであり、自分自身がどのように使用され、自分自身の MVC を書き込むかについても理解されています。

以下の状況都は假设:

$action = "空からガールフレンドをください!"; このコントローラーを渡して、何が起こるか見てみましょう。

コードをコピー コードは次のとおりです。
require_once( "config/config.php" );
session_start( );
$action = isset( $_GET['action'] ) $_GET['action'] : "";
$username = isset( $_SESSION['username'] ) $_SESSION['username'] : "";

if( !$ユーザー名 )
{
header("場所:index.php?action=login");
終了します;
}

ここには、スイッチを意味する重要なフロー制御ステートメントがあります。そのため、上記の $action = "Give me a girl from the sky!" が渡されるとき、可能性は 2 つだけです。 1 つがオフです。ここにはちょっとしたダジャレがあり、それを目にする学生もいるかもしれません。おいおい!

本題に戻ります。スイッチがこれらの $action をどのように切り替えるかを見てみましょう。コントローラーにはそのようなスイッチがないため、空からガールフレンドを得ることができないのは明らかです。そのため、コードについてしか話せません。 。

コードをコピー コードは次のとおりです。
スイッチ( $action )
{
ケース「新しい投稿」:
newPost( );
休憩

ケース「削除」:
削除( ) ;
休憩

ケース「updatePost」:
updatePost( );
休憩

ケース「ドラフト」:
listDraft( );
休憩

ケース「ログアウト」:
ログアウト( );
休憩

ケース「isPost」:
listPost( );
休憩

ケース「異なるカテゴリ投稿」:
diffentCategoryPost( );
休憩

ケース「カテゴリ外」:
unCategory( );
休憩

デフォルト:
listPost( );
休憩
}

各スイッチはデフォルトのスイッチを定義する必要があります。これにより、ガールフレンドがいない場合でも、ゲイの友達がいることを確認できます。
行動に移すにはどうすればよいでしょうか?
バックグラウンド フレームワークのナビゲーションである URL を見てみましょう。これは、実際にはこれらのアクションで構成されています。これにより、コントローラーで定義されたメソッドで GET (これらの変数の値を取得) できるようになり、より詳細な制御が可能になります。
この URL がコントローラーに到達すると、isPost スイッチをオンにして、次のメソッドを呼び出すことができます。スイッチは私たちがよく行うことです。
ここで場所を変えただけです。
わかりました。 このスイッチの次のメソッドを見てみましょう。

コードをコピー コードは次のとおりです。
関数 listPost( )
{
$results = array( );
$results['pageTitle'] = "投稿リスト" ;
$results['path'] = "エッセイ";
// メッセージを設定します
If ( isset( $_GET['error'] ) )
{
If ( $_GET['error'] == "InsertedFailed" ) $results['errorMessage'] = "ドキュメントの追加に失敗しました";
If ( $_GET['error'] == "postDeleteFailed" ) $results['errorMessage'] = "ドキュメントの削除に失敗しました";
}
If ( isset( $_GET['status'] ) )
{
If ( $_GET['status'] == "changesSaved" ) $results['statusMessage'] = "ドキュメントは保存されました!";
If ( $_GET['status'] == "削除されました" ) $results['statusMessage'] = "ドキュメントは削除されました!";
If ( $_GET['status'] == "挿入されました" ) $results['statusMessage'] = "新しいドキュメントが追加されました!";
If ( $_GET['status'] == "SaveToDraft" ) $results['statusMessage'] = "ドキュメントは下書きボックスに保存されました!";
}

// カテゴリ別にドキュメントを参照します
$db = MySQL::getInstance( );
$pagination = 新しいページネーション;
$cat = 新しいカテゴリ;
$results['categories'] = $cat->getCategoryList("post");

$pagination->countSQL = "select * from post where type = 'post' " ;
$db->Query( $pagination->countSQL );
$pagination->totalRecords = $db->RowCount( );
$records = $db->HasRecords( $pagination->rebuiltSQL( ) );
If( $records )
{
$results['posts'] = $db->QueryArray( $pagination->rebuiltSQL( ) );
require_once(TEMPLATE_PATH . "/post/post_list.php");
}
それ以外は
{
require_once(TEMPLATE_PATH . "/post/post_list.php");
}

}

配列 $results = array(); を定義しました。この配列の役割は明らかであり、モデルから取得したデータを保存し、URL からの GET の特別なパラメーターも保存できます。次に、以下の require_once(*****) に含まれるテンプレートに表示され、パスは path 変数で定義されます。

同時に、2つのプロンプトパラメータを受け取ります。

エラーとは、操作に間違いがあることを意味します。コンピューターを含め、誰でも間違いを犯すことは避けられません。重要なのは、コンピューターは良い仕事をするものであり、間違いを認める勇気を持っているということです。

status; 操作が成功したことを示すステータス。

$pagination = new Pagination; このクラスは合計数を渡すと、ページにジャンプするたびに合計ページ数を計算します。つまり、コンストラクターで URL 上のページの値を GET (取得) し、それがどのページであるかを知らせます。同時に、クエリ ステートメントを再生成し、その後に、limit $start (開始 ID)、$offset (長さ) と同様の制限ステートメントを追加しました。この設定は、次のとおりです。 10、より柔軟にすることもできます。
$cat = new category; このクラスについては後で詳しく説明しますが、非常に重要な分類モデルでもあります。ここでは、このタイプの下にあるすべてのカテゴリを取得し、サイドバーに表示するだけで完了です。写真と真実があります!

このようにして、$results 配列にはページに必要なすべてのデータが保存されます。 さて、テンプレートがどのように出力されるかを見てみましょう。

复制代码 代码如下:
 
 
    
         <br>              博客后台管理
            
                       
        
    
            
                
                    
                
                
                    
                    
                
                
                    
                    
                
            

                        
操作

                    

                        

                

                
                 if( isset( $results['statusMessage'] )){echo $results['statusMessage'];}
if( isset( $results['errorMessage'] )){echo $results['errorMessage'];}
?>
                

 

    

         文章(主要用于转载,发布原创博文要通过“随笔”)
    

    
    
       if( isset( $results['posts'] )){
     エコー <<             
                
                    
                    
                    
                                  
                    
                    
                

 EOB;
         foreach( $results['posts'] as $post ){
             $time = date("Y-m-d H:i:s", $post['create_time']);
             if( $post['ステータス'] == "1" ){
                 $post['status'] = "発信";
             } else {
                 $post['status']  = "未发布";
             }
             echo <<
                
                
                
                
                
                    
            
 EOB;
         }
             echo "

                         标题
                    

                         発信

                         状態
                    

                         评论
                    

                         页面

                         浏览
                    

                         操作
                    

                         操作
                    
{$post['title']} ({$time}){$post['status']}{$post['view_count']}{$post['comment_count']}编 辑删除
";               
             if( isset( $pagination) ){$pagination->createLinks( ) ;}
     } else {
         echo "当前无内容!";
     }

 ?>  

    

 


 

                        

                    

            

                
                
         
                    logout