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

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

Jul 20, 2016 am 11:16 AM
phpそして個人的しかしブログブログガーデン土地半年以上データベースオフとオンインターフェースデザイン独学まだ

半年以上、断続的に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 $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
                

                

            

            
                
                    
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境