ホームページ php教程 php手册 PHP フレームワークをステップバイステップで作成する (17)

PHP フレームワークをステップバイステップで作成する (17)

Jun 21, 2016 am 08:50 AM
function gt mysql nbsp

モデルの D 部分は比較的基本的なため、最初に D 部分を作成しました。

D で最も重要なことはドライバー クラスの作成です。ドライバー クラスでログを使用する必要があるため、最初に単純な Logger クラスを作成します。静的メソッドは 1 つだけです。デバッグがオンになっている場合、情報はブラウザーに直接出力され、それ以外の場合はログに記録されます。

01

01

02 class Logger extends Base {

03 public static function log($param) {

04 if(is_object($param)) {
<テーブル>

02

05 if(true === C('debug')) {

06 throw $param;
クラス Logger は Base {

を拡張します

07 } else {

<テーブル>

08 file_put_contents(APP_PATH . '/log',$param,FILE_APPEND);
03

09 }

パブリック静的関数ログ($param) {

10 } elseif(is_string($param)) {
<🎜> <🎜> <テーブル> <🎜><🎜>04<🎜><🎜> <🎜><🎜> if(is_object($param)) {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>05<🎜><🎜> <🎜><🎜> if(true === C('debug')) {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>06<🎜><🎜> <🎜><🎜> throw $param;<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>07<🎜><🎜> <🎜><🎜> else {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>08<🎜><🎜> <🎜><🎜> file_put_contents(APP_PATH . '/log',$param,FILE_APPEND);<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>09<🎜><🎜> <🎜><🎜> }<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>10<🎜><🎜> <🎜><🎜> } elseif(is_string($param)) {<🎜><🎜>

11 if(true === C('debug')) {

12 echo $param;

13 } else {

14 file_put_contents(APP_PATH . '/log',$param,FILE_APPEND);

15 }

16 } else {}

17 }

18 }

Logger::log を介して渡されたパラメーターがオブジェクトであると仮定すると、例外がスローされたことを意味します。それが文字列の場合は、プログラムが出力する必要がある警告メッセージまたはエラー メッセージである可能性があります。他の種類の場合は処理されません。

コードを簡素化するために、クラス コード全体は非常に小さくなっています。デバッグがオンになっているかどうかを判断するだけです。オンになっていない場合は、ログに記録されます。直接印刷されます。

これに興味がある場合は、強力なログ システムを自分で作成してみることができますが、ここでは詳しく説明しません。 。 。

ログ クラスを作成したら、すぐにドライバー クラスの作成を開始します。ドライバー クラスを作成する前に、前回述べたようにコントラクト コードは次のとおりです。 >

<テーブル>

01

01

02 interface IDbDriver { <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>インターフェース IDbDriver {<🎜><🎜>

03 function execute($sql);

04 function connect();

05 function close();

06 function getAllByObject();

07 function getAllByAssoArray();

08 function getAllByArray();

09 function beginTrans();

10 function commit();

11 function rollback();

12 }

すぐに PDO をドライバー クラスとして使用するため、誰もが PDO の前処理に慣れ、このインターフェイスを簡素化するために、これを書く時間が限られているため、この規約を次のように変更しました。次のようになります:

<テーブル>

01

01

02 interface IDbDriver {

03 function prepare($sql); <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>インターフェース IDbDriver {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜> function prepare($sql);<🎜><🎜>

04 function execute(Array $arr);

05 function connect();

06 function close();

07 function getAllByAssocArray();

08 function beginTrans();

09 function commit();

10 function rollback();

11 }

Java の JDBC を学習したことがあれば、PDO に非常に慣れているでしょう。もちろん、mysql_* インターフェースの使用に慣れている場合は、視点を変える必要があるかもしれません。 msyql_* をドライバー クラスとして使用する場合、mysql_* はこのメカニズムを提供していないため、申し訳ありませんが、自分で準備する必要があります。

次に、PDO ドライバー クラスを作成します。コードは次のとおりです。

<テーブル>

01

01

02 class PdoDriver extends Base implements IDbDriver {

03 private $_db = null; <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>クラス PdoDriver は Base 実装 IDbDriver を拡張します {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜> private $_db = null;<🎜><🎜>

04 private $_pstmt = null;

05 public function __construct() {

06 $this->connect();

07     }

08     public function connect() {

09         try {

10             $this->_db = newPDO(C('db=>dsn'),C('db=>user'),C('db=>pwd'),array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES "UTF8";'));

11             if(null !== $this->_db) {

12                 Logger::log('[Notice]connect success!');

13             } else {

14                 Logger::log('[Error]:connect failed');

15             }

16         } catch(PDOException $e) {

17             Logger::log( $e);

18         }

19     }

20     public function close() {

21         if(null !== $this->_db) {

22             unset($this->_db);

23         }

24     }

25     public function prepare($sql) {

26         if(null !== $this->_pstmt) {

27             $this->_pstmt = null;

28         }

29         $this->_pstmt = $this->_db->prepare($sql);

30     }

31     public function execute(Array $arr) {

32         if(null === $this->_pstmt) {

33             Logger::log('[Error]not prepared statement');

34         } else {

35             if(false === $this->_pstmt->execute($arr)) {

36                 Logger::log('[Error]sql error,error info is : ' . $this->_ptstmt->errorInfo());

37             } else {

38                 Logger::log('[Notice]:execute success');

39             }

40         }

41     }

42     public function getAllByAssocArray() {

43         return $this->_pstmt->fetchAll(PDO::FETCH_ASSOC);

44     }

45     public function beginTrans() {

46         $this->_db->beginTransaction();

47     }

48     public function commit() {

49         $this->_db->commit();

50     }

51     public function rollback() {

52         $this->_db->rollback();

53     }

54 }

まず、このクラスはインスタンス化されると自動的にDBに接続、つまりconnectメソッドを呼び出します。

PDO は DSN を使用して DB に接続します。もちろん、配列の使用に慣れている場合は、追加のコードを記述する必要があるかもしれません。ここでは説明しません。この方法で DSN を直接使用してください。

みんなが見ているもの

1 C('db=>dsn'),C('db=>user'),C('db=>pwd')
1

C('db=>dsn'),C('db=>user'),C('db=>pwd')

テーブル>

01
これについては以前にも説明しましたが、実際に読み込まれるのは設定ファイルの内容です。

02 return array(

03 'defaultController' => 'Index',

01

04     'defaultAction' => 'index',

05     'debug' => true,

テーブル> テーブル> テーブル> テーブル> テーブル> テーブル> テーブル>

06 'errorReporting' => -1,

07     'timeZone' => 'PRC',
02

08     'db' => array(
配列を返す(
03 'defaultController' => 'インデックス',
04 'defaultAction' => 'インデックス',
05 'デバッグ' => true、
06 'errorReporting' => -1,
07 'timeZone' => 'PRC',
08 'db' => 配列(
09         'dsn' => 'mysql:dbname=test;host=localhost',

10         'user' => 'test',

11         'pwd' => 'test',

12  

13     )

14 );

C 関数は、このファイルの設定項目を読み出す役割を果たします。これは、Thinkphp に慣れている子供たちにもよく知られているかもしれません。 !

PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES "UTF8";'この文は、mysql の中国語の文字化けの問題を解決します。PDO は実際に統一インターフェイスを提供しているため、元々はmysql の場合はデータベースの種類を指定し、この文を使用しますが、簡単にするために、これが不可能であることを知っていれば、これで問題ありません。 ! !

実は、今の文にはもう一つ問題があって、ここでエンコード方式を完全に書いてしまったのですが、本当は設定ファイルに書いた方が良いのです。 ! !

以下の関数はすべて PDO 独自のインターフェイスを呼び出すため、詳細は説明しません。具体的な内容については、PHP マニュアルの PDO の部分を参照してください。

現在の PDO ドライバー クラスは、mysql の操作のみを完了できます。他のデータベースに切り替えると、PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES "UTF8";' などの特定の問題が発生する可能性があります。実際、このコードを変更せずに他のデータベース用のアダプターを作成することもできます。詳細については、Baidu オンラインで検索してください。

ドライバー クラスを作成したら、コントローラーでテストする必要があります。

01

01

02 class TestController extends Controller {
<🎜><🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>クラス TestController はコントローラ {<🎜><🎜> を拡張します

03 public function test() {

04 $test = new PdoDriver();

05 $test->prepare('select * from test where id > :id');

06         $test->execute(array(

07             'id' => '2'

08         ));

09         var_dump($test->getAllByAssocArray());

10     }

11 }

注: モデルを作成した後は、このように直接呼び出すことはできません。外部コントローラーに直接アクセスできる部分は E であるためです。E は C と F の内容を呼び出し、C は D の内容を呼び出します。 。

先ほど、PDO を使用してドライバー クラスを実装する方法について説明しました。mysql をターゲットにしている場合は、mysql_* または mysqli を使用することもできます。 mysql_* では、上記のインターフェイスの実装がありません。何が難しいのでしょうか? mysql_* インターフェイスを呼び出すだけです。実際には、実行時に最も簡単な方法を使用する必要があります。実行:

str_replace(array_keys($arr),array_values($arr),$sql);

$sql は prepare の呼び出しによって渡される文字列、$arr は実行によって渡される配列ですが、準備中の SQL パラメータ プレースホルダは次のようなものであるため、ここでの配列のキーを処理する必要があることに注意してください。 : id 形式であり、execute によって渡される形式は直接 'id' => 2 の形式であるため、まず配列の各キーに文字を追加する必要があります。次に、各値に対して文字列エスケープを実行します。 str_replaceを実行します。

もちろん、私の方法は最も弱い方法です。他の方法を使用して自分で達成することもできます。

もう 1 つよく知らないことがあります。それは、mysql_* が MySQL トランザクションを処理する方法です。mysql ターミナルを使用したことがある場合は、次のコマンドに精通しているでしょう。 mysql: begin 、 commit 、 rollback なので、 mysql_query を使用して、トランザクションを開始する mysql_query('begin',$this->_db) などのコマンドを実行できます。実際、これらのインターフェイスは次の関数に基づいています。 mysql なので、mysql でサポートされているインターフェイスのみがサポートされ、mysql でサポートされていないインターフェイスは処理できません。



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:初心者向けのデータ管理の容易さ MySQL:初心者向けのデータ管理の容易さ Apr 09, 2025 am 12:07 AM

MySQLは、インストールが簡単で、強力で管理しやすいため、初心者に適しています。 1.さまざまなオペレーティングシステムに適した、単純なインストールと構成。 2。データベースとテーブルの作成、挿入、クエリ、更新、削除などの基本操作をサポートします。 3.参加オペレーションやサブクエリなどの高度な機能を提供します。 4.インデックス、クエリの最適化、テーブルパーティション化により、パフォーマンスを改善できます。 5。データのセキュリティと一貫性を確保するために、バックアップ、リカバリ、セキュリティ対策をサポートします。

NAVICATでデータベースパスワードを取得できますか? NAVICATでデータベースパスワードを取得できますか? Apr 08, 2025 pm 09:51 PM

NAVICAT自体はデータベースパスワードを保存せず、暗号化されたパスワードのみを取得できます。解決策:1。パスワードマネージャーを確認します。 2。NAVICATの「パスワードを記憶する」機能を確認します。 3.データベースパスワードをリセットします。 4.データベース管理者に連絡してください。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

MariadBのNAVICATでデータベースパスワードを表示する方法は? MariadBのNAVICATでデータベースパスワードを表示する方法は? Apr 08, 2025 pm 09:18 PM

Passwordが暗号化された形式で保存されているため、MariadbのNavicatはデータベースパスワードを直接表示できません。データベースのセキュリティを確保するには、パスワードをリセットするには3つの方法があります。NAVICATを介してパスワードをリセットし、複雑なパスワードを設定します。構成ファイルを表示します(推奨されていない、高リスク)。システムコマンドラインツールを使用します(推奨されません。コマンドラインツールに習熟する必要があります)。

MySQLおよびSQL:開発者にとって不可欠なスキル MySQLおよびSQL:開発者にとって不可欠なスキル Apr 10, 2025 am 09:30 AM

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

NAVICATでSQLを実行する方法 NAVICATでSQLを実行する方法 Apr 08, 2025 pm 11:42 PM

NAVICATでSQLを実行する手順:データベースに接続します。 SQLエディターウィンドウを作成します。 SQLクエリまたはスクリプトを書きます。 [実行]ボタンをクリックして、クエリまたはスクリプトを実行します。結果を表示します(クエリが実行された場合)。

See all articles