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 = "空からガールフレンドをください!"; このコントローラーを渡して、何が起こるか見てみましょう。
コードをコピー コードは次のとおりです。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 配列にはページに必要なすべてのデータが保存されます。 さて、テンプレートがどのように出力されるかを見てみましょう。
复制代码 代码如下:博客后台管理
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 までご連絡ください。
![]() ホットAIツール![]() Undresser.AI Undressリアルなヌード写真を作成する AI 搭載アプリ ![]() AI Clothes Remover写真から衣服を削除するオンライン AI ツール。 ![]() Undress AI Tool脱衣画像を無料で ![]() Clothoff.ioAI衣類リムーバー ![]() Video Face Swap完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。 ![]() 人気の記事
アサシンのクリードシャドウズ:シーシェルリドルソリューション
4週間前
By DDD
Windows11 KB5054979の新しいものと更新の問題を修正する方法
3週間前
By DDD
Atomfallのクレーンコントロールキーカードを見つける場所
4週間前
By DDD
<🎜>:Dead Rails-すべての課題を完了する方法
1 か月前
By DDD
KB5055523を修正する方法Windows 11にインストールできませんか?
2週間前
By DDD
![]() ホットツール![]() メモ帳++7.3.1使いやすく無料のコードエディター ![]() SublimeText3 中国語版中国語版、とても使いやすい ![]() ゼンドスタジオ 13.0.1強力な PHP 統合開発環境 ![]() ドリームウィーバー CS6ビジュアル Web 開発ツール ![]() SublimeText3 Mac版神レベルのコード編集ソフト(SublimeText3) ![]() ホットトピック
Gmailメールのログイン入り口はどこですか?
![]() ![]()
Java チュートリアル
![]() ![]()
CakePHP チュートリアル
![]() ![]()
Laravel チュートリアル
![]() ![]()
PHP チュートリアル
![]() ![]() ![]() JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。 ![]() 文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります ![]() このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます ![]() 静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。 ![]() PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。 ![]() MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。 ![]() PHPでは、予測不可能なトークンを使用して、CSRF攻撃を効果的に防ぐことができます。特定の方法には次のものが含まれます。1。フォームのCSRFトークンを生成および埋め込みます。 2.リクエストを処理するときにトークンの有効性を確認します。 ![]() PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。 ![]() |