独自のデータベース パッケージを作成する方法 (1)

PHPz
リリース: 2018-05-17 15:12:51
オリジナル
1561 人が閲覧しました


前に書いてあります

  1. まだ進行中です、間違いがあればご指摘ください

  2. 私の仕事の経験が浅いため、データベース接続を完全にカバーすることはできません 予期しないバグがある可能性があります。

  3. したがって、このシリーズはアイデアを提供するだけです。成熟した安定したデータベースパッケージを自分で検索してください

  4. このシリーズを書く本来の目的は、各セクションの最後に次のことを記載します。個人的な質問があります (またはそうでない)。専門家が私の質問に答えるのを手伝ってくれることを願っています

  5. 使用している PHP のバージョンは 7.0 以降で、このシリーズには下位互換性がありません。まだバージョン 5.6 を使用している子供たちが来て、 play

  6. データベースのカプセル化はlaravelのソースコードを参照しています

最終的な効果

簡単な設定の後、それができるようになったとします。次のように直接呼び出すことができます

$a = Actor::select('first_name', 'last_name')
        ->where('first_name', 'NICK')
        ->where('last_name', 'WAHLBERG')
        ->first()
var_dump($a);
ログイン後にコピー

戻り形式

object(Actor)[11]
  public 'first_name' => string 'NICK' (length=4)
  public 'last_name' => string 'WAHLBERG' (length=8)
ログイン後にコピー

返されたデータはまだ操作可能です(update/delete)

$a->update(...);
$a->delete();
ログイン後にコピー

一般的なデータベース接続の記述方法

PHPをある程度理解している人はそれを知っています削除された mysql や置き換えられた mysqli と比較して、pdo は SQL インジェクション攻撃を回避でき、より安全で、オブジェクト指向であるため、以下では例として pdo を使用します

<?php
$driver=&#39;mysql&#39;; //数据库类型

$host=&#39;localhost&#39;; //数据库主机名

$db = &#39;sakila&#39;; //数据库名称

$username=&#39;root&#39;; //数据库连接用户名

$password=&#39;&#39;; //数据库密码

$dsn="$driver:host=$host;dbname=$db";

try {    
    $pdo= new PDO($dsn, $username, $password); //初始化一个PDO对象   

    $sql = "select * from actor";

    $res = $pdo->query($sql); // 从actor中获取所有数据

    foreach($res as $row) echo $row['first_name']."<br>";

} catch (PDOException $e) {    
    die($e->getMessage());
}
ログイン後にコピー

上記の例は非常に簡潔ですプロジェクトが成長し、ますます複雑になると、通常自分で作成するいくつかの補助関数 と同じように、コードの重複を減らすために Encapsulate クラスが必要になりますが、カプセル化されたクラスはもう少し高度です。

基本的な考え方

では、どのように書けばいいのでしょうか?

まず、コードを簡略化する必要がある場合、通常、いくつかの補助関数を自分で作成します。たとえば、私は個人的に悪い癖があり、
エディタデバッグ機能を使用するのが好きではありません。 : sublime text 3)を使用しているのですが、デバッグ時に最初にこう書いてあった

$a = "is bug";
die(var_dump($a)); // 输出变量并且停止运行之后的代码
/***从xdebug得知bug出现在这一行,所以查看上一行的逻辑与数据 ***/
ログイン後にコピー
die(var_dump())の出現率が少し高いので、補助関数として書きました

function dd($var) {
    die(var_dump($var));
}
ログイン後にコピー
同様の理由で, データベースから読み取る場合は、選択します 使用率が非常に高いので、単純にラップします

function select($pdo, $table, $require, $where = []) {
    $w = [];

    // 将搜索条件转化为数据库命令能接受的格式
    foreach ($where as $key => &$val) 
        $w[] = "$key = '$val'";

    // 有时候并不需要条件,仅仅将所有数据取出,因此$where默认为空
    if(!empty($w)) $w = "where ".implode(', ', $w);
    else $w = "";

    // 生成sql query
    $sql = "select $require from $table $w";

    // 将已生成的query带入pdo实例
    $res = $pdo->query($sql);

    // 返回结果
    return $res->fetchAll();
}
ログイン後にコピー
example

select($pdo, 'actor', '*', ['first_name'=>'PENELOPE'])
/** 
  * 生成sql query => select * from actor where first_name = 'PENELOPE'
**/
ログイン後にコピー
まとめると、データベースのカプセル化を簡単に説明すると、補助関数にパラメータを取り込み、SQL を自動的に生成させることです。コマンド。

データベースのカプセル化

アーキテクチャ

は主に4つのファイルに分かれています

  • Connector.php - データベースとの通信、データベースデータのリクエストと返却を担当します

  • Model.php - エントリファイルテーブルの設定、リクエストの受け入れ、レスポンスの返しを担当します

  • Grammar.php - ビルダーによって保存されたリクエストを SQL ステートメントに変換します

  • Builder.php - コア ファイル、ストアModelのリクエストをGrammarを呼び出してSQL文を返し、データベースのデータを取得するためにパラメータ変数とともにConnectorに送信され、その後Modelに返されます

アーキテクチャはよく説明できないかもしれませんが、でも大丈夫、一つ一つゆっくり詳しく説明します

可能であれば大まかに いいね!をするか、下のコメント欄で議論してください フィードバックだけが、怠惰な末期がん患者を追い込むことができます。前に進みます。

以上が独自のデータベース パッケージを作成する方法 (1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!