ホームページ >バックエンド開発 >PHPチュートリアル >PHP模倣ブログパーク個人ブログデータベースとインターフェース設計_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, $encdata = false){
$strength = "08";
//暗号化されたデータが渡された場合は、入力 ($info) と照合してチェックします
if ($encdata) {
if (substr($encdata, 0, 60) == crypt($info, "$2a$".$strength."$".substr($encdata, 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'] と、私たちの後台博客型フレームワークがあります。
ユーザが入力に問題があった場合は、提案メッセージが表示されます。
これは、「行動」を与えてから「何かをする」ことです
私たちは次のコードで反撃する予定です。
これは、博客のコピーから得られた、博客のアフター ステーションのフレーム形式であり、テーブル レイアウトを採用しており、互換性があり、その他の形式を自由に設定でき、単一で、実用的で、拡張性があり、完璧なアフター ステーション フレームです。
この篇我就用代码来解释この概念は啥意思、先看我的 post.class.php です。 このファイルは私によるデータ層処理の種類です。
简单介绍一下这个モデル类,它继承了一データベース库来做crud等常用操作、每次初期化時就会初化一个データベース库对オブジェクト$db。 私はこのオブジェクトを使用して私のデータを操作します。
データ操作には、storePostFormValues() 、storeDiaryFormValues() という 2 つの重要なメソッドがあり、これら 2 つのメソッドがデータ ストリームの始まりとなります。
また、addChildNumber()、reduceChildNumber() という 2 つのメソッドがあり、それらはファイルの挿入または削除時に 1 つのダークボックス操作を実行します。問題は、カテゴリ テーブル内にそのカテゴリのテキスト数を示すフィールドがあるため、これらの数値の値を変更する必要があることです。
以下では、post.php コントローラーを使用して、データのフローを開始できます (コントローラーも別の種類であり、API 文を生成することはできません。これは真の MVC フレームワークではないためです。) MVC の前に、これも行います。 MVC の根幹は神聖なサービスであり、自分自身がどのように使用され、自分自身の MVC を書き込むかについても理解されています。
$action = "空からガールフレンドをください!"; このコントローラーを渡して、何が起こるか見てみましょう。
コードをコピー コードは次のとおりです。 if( !$ユーザー名 )
{
header("場所:index.php?action=login");
終了します;
}
ここには、スイッチを意味する重要なフロー制御ステートメントがあります。そのため、上記の $action = "Give me a girl from the sky!" が渡されるとき、可能性は 2 つだけです。 1 つがオフです。ここにはちょっとしたダジャレがあり、それを目にする学生もいるかもしれません。おいおい!
本題に戻ります。スイッチがこれらの $action をどのように切り替えるかを見てみましょう。コントローラーにはそのようなスイッチがないため、空からガールフレンドを得ることができないのは明らかです。そのため、コードについてしか話せません。 。
コードをコピー コードは次のとおりです。各スイッチはデフォルトのスイッチを定義する必要があります。これにより、ガールフレンドがいない場合でも、ゲイの友達がいることを確認できます。
行動に移すにはどうすればよいでしょうか?
バックグラウンド フレームワークのナビゲーションである URL を見てみましょう。これは、実際にはこれらのアクションで構成されています。これにより、コントローラーで定義されたメソッドで GET (これらの変数の値を取得) できるようになり、より詳細な制御が可能になります。
この URL がコントローラーに到達すると、isPost スイッチをオンにして、次のメソッドを呼び出すことができます。スイッチは私たちがよく行うことです。
ここで場所を変えただけです。
わかりました。 このスイッチの次のメソッドを見てみましょう。
配列 $results = array(); を定義しました。この配列の役割は明らかであり、モデルから取得したデータを保存し、URL からの GET の特別なパラメーターも保存できます。次に、以下の require_once(*****) に含まれるテンプレートに表示され、パスは path 変数で定義されます。
同時に、2つのプロンプトパラメータを受け取ります。
エラーとは、操作に間違いがあることを意味します。コンピューターを含め、誰でも間違いを犯すことは避けられません。重要なのは、コンピューターは良い仕事をするものであり、間違いを認める勇気を持っているということです。
status; 操作が成功したことを示すステータス。
$pagination = new Pagination; このクラスは合計数を渡すと、ページにジャンプするたびに合計ページ数を計算します。つまり、コンストラクターで URL 上のページの値を GET (取得) し、それがどのページであるかを知らせます。同時に、クエリ ステートメントを再生成し、その後に、limit $start (開始 ID)、$offset (長さ) と同様の制限ステートメントを追加しました。この設定は、次のとおりです。 10、より柔軟にすることもできます。
$cat = new category; このクラスについては後で詳しく説明しますが、非常に重要な分類モデルでもあります。ここでは、このタイプの下にあるすべてのカテゴリを取得し、サイドバーに表示するだけで完了です。写真と真実があります!
このようにして、$results 配列にはページに必要なすべてのデータが保存されます。 さて、テンプレートがどのように出力されるかを見てみましょう。
复制代码 代码如下: Arist's Blog Hinging there, everything will be fine. | |||||||||||||
分类
if( isset( $results['categories'] ) && ! empty( $results['categories'] ) ){ foreach( $results['categories'] as $category ){ echo << EOB; } } ?> | if( isset( $results['statusMessage'] )){echo $results['statusMessage'];} if( isset( $results['errorMessage'] )){echo $results['errorMessage'];} ?> 文章(主要用于转载,发布原创博文要通过“随笔”) if( isset( $results['posts'] )){ エコー <<
if( isset( $pagination) ){$pagination->createLinks( ) ;} } else { echo "当前无内容!"; } ?> |
© Arist 上記はデータを示すだけなので、誰でも実行できます。 このデータはどのように操作しますか? 操作はコントロール能力のようなものです。 学生時代にフットボールをしていたとき、私はコートをコントロールする能力が高く、大学のフットボールの試合で優勝1回、準優勝1回、3位1回を経験しました。中学時代に数々の栄誉を獲得。 私のポジションは、サッカー場でのセンターディフェンダーです。このポジションでは、全体の状況を把握する能力、強力な個人能力、そして指揮能力が必要です。今、あなたは毎日コンピューターの前に座っています。こんなものはとうの昔になくなってしまいました 体験談をいくつか残しました。しかし、味も体験する必要があります。 私のブログには欠点があります。データベースで読み取りまたは書き込み操作を実行するたびに、更新する必要があります。サーバーに大きな負荷がかかることは承知していますが、新しい技術をよく理解せずにやみくもに使っても逆効果になるだけだと感じています。 そのため、当面はサーバーの応答時間とメモリ消費を犠牲にして、相対的な安定性を実現します。 なので、全体の状況はよくわかっていませんし、ajaxの奥深くまで入ったり、phpやcの奥に入ったりなど、まだ関わっていない未知の領域がたくさんあります。 。 。 もう言うことはありません。 それでは、データを CRUD する方法を見てみましょう! 削除削除 まずはこのコマンド post.php?action=delete&postID=132 を見てください 削除することを確認するとき、最初にドキュメントが属するカテゴリの下の count_child_number フィールドで 1 の減算操作を実行できることに注意してください。 つまり、文法が正しい場合、論理が間違っている可能性があります。もしくはやり方が間違っている!それは私のメモです! ご覧ください:
コードをコピー コードは次のとおりです。 $post = 新しい投稿; $filter['post_id'] = isset( $_GET['postID'] ) ( int )$_GET['postID'] : "";// !重要 データを削除する前に、このカテゴリの記事数を 1 つ減らしてください // そうしないと、そのカテゴリで削除する記事の数がわかりません // 論理的な間違いを犯しました。最初にドキュメントを削除してから、ドキュメントのカテゴリ ID を確認しましたが、ドキュメントが存在しなかったため、見つかりませんでした。 $post->reduceChildNumber( "カテゴリ", ( int ) $_GET['postID'] ); $result = $post->delete("post", $filter ); ここでは、記事の先頭でモデルを初期化する限り、簡単に delete() メソッドを呼び出すことができます。 インサートを作成 まずはこのコマンド post.php?action=newPost を見てください。 正直に言うと、長い間挿入していませんでした。ふふ! 制御方法を参照してください:コードをコピー コードは次のとおりです。
ユーザーが文書を下書きボックスに入れることを選択した場合は、タイプ = PostDraft の文書レコードを挿入するだけです。
まずはこのコマンド post.php?action=updatePost&postID=132 を見てください ここまでに多くの違いはありますが、すべての基本的な操作を実行しました。 要点を説明すると、これらのアクションにはナビゲーションがあり、生成され、大部分が固定されています。もしソースコード学的な意見が必要な場合は、ダウンロードを提供します。 http://www.bkjia.com/PHPjc/372515.htmlwww.bkjia.com 声明: この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。 |