0

私は何年も PHP と MySQL を使用してきましたが、正式な環境では使用したことがありません。私は仕事で物事を合理化するためにそれを使用し、自分の商用 Web サイトをたくさんプログラムしましたが、プログラマーとして雇われたことはありません。私はフリーランスの仕事を始めようとしていますが、ベスト プラクティスにはどのようなものがあるのか​​疑問に思っています。

私は常に getter クラスを使用して mysql からデータを取得し、setter クラスを使用して mysql にデータを入力し、そこに接続クラスを渡します。すべての mySQL テーブルとフィールド名には、定数インクルード ファイルで定義された独自の定数があります。私が通常行うことは、定数を変数として渡すのではなく、setter クラスまたは getter クラスに直接入力することです。このようにすると、作業がより簡単かつ迅速になりますが、クラス内の関数が独立しているべきものであるという私の理解に反しています。

明確にするために、これは私が通常行うことの例です。

定数.inc.php

define('TABLE_NAME','table_name');

dbase_getters.class.php

public function get_data($connection){
    $query = "SELECT * FROM " . TABLE_NAME;
    $result = $connection etc...
}

それとも私はこのようにするべきですか?

dbase_getters.class.php

public function get_data($connection, $table_name){
    $query = "SELECT * FROM " . $table_name;
    result = $connection etc...
}

特に、検索する新しいフィールドを追加して関数のパラメーターを変更したい場合は、関数呼び出しのすべてのインスタンスを見つけて変更する必要があるため、変数を渡すことでそれを行うのははるかに面倒なようです。一方、定数を使用する場合は、それらを関数に追加するだけです。

また、定数の宣言などに関しては、私は常にシングルクォートを使用してきました。しかし、文字列を作成するときは、常に二重引用符を使用します。これは矛盾しているのでしょうか。常に 1 つのタイプの引用を使用する必要がありますか?

ありがとう!

4

5 に答える 5

2

もちろん、両方の方法で行うことができますが、どちらもほぼ同じように望ましくないと思います。SQL 文字列を動的に作成することは、保護が難しく、エラーが発生しやすくなります。

たとえば、次のように、すぐに利用できる多くのライブラリのいずれかを試すことをお勧めします。

http://www.doctrine-project.org/

http://propelorm.org/

それらは、いわゆる「ORM」と呼ばれるオブジェクト リレーショナル マッパーです。それらは、あなたがやろうとしていることを達成するのに役立ちます.

これには他のアプローチがあります.ORMほど高レベルではないPear DB(現在はMDB2、 http://pear.php.net/package/MDB2 )を使用したことがあります。これは、設計上の問題にも役立ちます。

データベースへのアクセスは解決すべき一般的な問題であり、多くの人が以前に解決したことがあります。ORM を使用してみてください。これは非常に満足のいくものであり、SQL、行、結果セット、および接続オブジェクトを処理するよりもはるかに自然です。

于 2013-04-18T06:08:43.943 に答える
1

MVC 用語を使用するには...すべてのビジネス ロジックを含むmodelには、データベースから特定の種類のデータを取得する明確に定義された関数が1 つ必要です。次のように言います。

function getUserByUsername($username) {
    $query = 'SELECT ... FROM users WHERE name = :username';
    ...
    return $user;
}

データベースからユーザー名でユーザーを取得することは、アプリで実行できる特定のユニークなアクションの 1 つです。そのための関数を作成します。これにより、アプリがより構造化されます。一般的な SQL ラッパーを作成して多数の異なる変数を渡さないでください。データベース ロジックがアプリ全体に不必要に拡散するだけです。

于 2013-04-18T06:09:08.470 に答える
1

定数の定義には、OP と同じ方法を使用します。

永続化レイヤーの次のパターンを調べることをお勧めします。

DAO (データ アクセス オブジェクト) パターン

工場パターン

これに加えて、ORM フレームワークを使用する可能性もあります。

私が見る限り、あなたは正しくやっています。(PHPクエリの準備済みステートメントのようなものがあることに注意してください)

于 2013-04-18T07:11:48.703 に答える
0

私が好むベスト プラクティスは、データベース クエリを実行するメソッドを備えたデータベース クラスを作成することです。これらは、基本的な挿入選択と更新を実装する簡単な方法である、私が使用する一連の関数です。これは PDO の例です。

    public function select($table, $fields, $where = ""){
    try{
        $fields = implode(",", $fields);
        $stmt = $this->connection->prepare("SELECT {$fields} from {$table} {$where}");
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }catch(PDOException $p){
        Error::PDOError($p->getCode(), $p->getMessage());
    }
}
public function insert($table, $data) {
    $fields = implode(",", array_keys($data));
    $values = implode(",", array_values($data));
    $stmt = $this->prepare("INSERT INTO " . $table . "({$fields}) VALUES ({$values})");
    return $stmt->execute();
}

public function update($table, $data, $where) {
    $fieldValues = NULL;
    foreach ($data as $key => $value) {
        $fieldValues .= "$key = :$key,";
    }
    $fieldValues = rtrim($fieldValues, ",");
    $stmt = $this->prepare("UPDATE {$table} SET {$fieldValues} WHERE {$where}");
    foreach ($data as $key => $value) {
        $stmt->bindValue(":$key", $value);
    }
    return $stmt->execute();
}

または、いつでもActive record libraryを使用できます

于 2013-04-18T06:23:35.987 に答える
0

独自のフレームワークを使用することは、独自の知識に限定されていますmvc frameworks 。ほとんどのホストと要求されるフレームワークを使用することをお勧めします。

  1. CAKEPHP
  2. コードイグナイター
  3. ゼンド

これがcakephpどのように機能するかです:

コア定義定数

グローバル関数

あなたが1つを使用することに慣れているmvcなら、他の人はあなたにとってバーではありません.

于 2013-04-18T06:10:08.027 に答える