14

phpについて何か新しいことを学ぶたびにコードを書き直さなければならないことにかなりうんざりしています(mysql接続をハンドルとしてセッションで渡すことができないという事実など)。

プロジェクトにmysql接続をどのように実装しますか?多くの人が「接続プール」を提案していますが、マニュアルを読んだ後も迷っています。これは、「接続プールはmysql_pconnectです!」のようなものです。-私:「そして...?それは実際にはどのように違うのですか?セッションでmysql_pconnectを渡すことができますか?なぜこれは一見不思議なオーラなのですか??」

私の状況を説明させてください。「query1」という関数があります。

function query1($query)
{
    $db = new mysql(HOST,USER,PASS,DBNAME);
    $result = $db->query($query);
    $db->close();
    return $result;
} 

これは、データベースをクエリするための無駄で非効率的な方法のようです(特に、mysql_real_escape_stringなどの関数にはmysqlハンドルが必要なため)。それを行うための正しい形式は何ですか?誰か助けてくれませんか?

正直に答えていただければ幸いです。

4

2 に答える 2

17

通常、接続はページが読み込まれると発生します。別名

class Database{
    public function connect()
    {
         $this->connection = mysql_connect();
    }

    // This will be called at the end of the script.
    public function __destruct()
    {
        mysql_close($this->connection);
    }

    public function function query($query)
    {
        return mysql_query($query, $this->connection);
    }
}
$database = new Database;
$database->connect();

$database->query("INSERT INTO TABLE (`Name`) VALUES('Chacha')");

基本的に、接続はページの最初で開き、最後のページで閉じます。そうすれば、ページ中にさまざまなクエリを実行でき、接続に対して何もする必要がありません。

Erikが提案するように、コンストラクターでmysql_connectを実行することもできます。


グローバル変数を使用して上記を使用するには(グローバル状態を作成するため推奨されません)、次のようにします。

Global $db;

$db = new Database;
// ... do startup stuff

function doSomething()
{
    Global $db;
    $db->query("Do Something");
}

ああ、そして誰もあなたがパラメータを渡す必要がないことを言及しませんでした。接続するだけ

mysql_connect();

次に、mysql_queryは、スコープが何であっても、最後の接続を使用します。

mysql_connect();

function doSomething()
{
    mysql_query("Do something");
}

コメントによると:

mysql_connect()は接続プールを使用しないため、mysql_connect()の代わりにmysql_pconnect()を使用する必要があると思います。–ナイトコーダー

mysql_connectを使用するか、を使用するかを検討することをお勧めしますmysql_pconnect。ただし、スクリプトごとに1回だけ接続する必要があります。

于 2010-01-24T22:31:43.043 に答える
0

すべての機能でデータベースに接続する必要はありません。スクリプトの実行開始時にデータベースに接続し、接続オブジェクトをグローバル状態で保存する必要があります。どの関数でも、その接続オブジェクトを使用してデータベースにクエリを実行できます。スクリプトが実行されるたびに接続オブジェクトが再作成されますが、特別な接続プールがバックグラウンドで使用されるため、非常に高速になり、接続がすぐに実行されます(マイクロ秒の問題、実際には接続が切断されていないため、接続プールに保存されます)。

これがあなたが求めた例です:

// this code should be executed on every page/script load:
$adoConn = ADONewConnection(...);
$adoConn->PConnect(...);

// ...

//And then in any place you can just write:
global $adoConn;
$adoConn->ExecuteNonQuery("INSERT INTO test SET Value = 'Hello, world!'");

あなたの質問については、「接続プールをどのように実装すればよいですか」。あなたはそうしない。これは、バックグラウンドでサーバーによって維持され、mysql_pconnect()関数を使用する場合(またはPHPを操作するためのPHPライブラリー)に使用されます。

PS。$ adoConnをグローバル変数として保持することを恐れている場合(私はそうではありません)、静的プロパティを持つクラスを作成できます。

class DB
{
  public static $adoConn;
}

// ...

DB::$adoConn->ExecuteNonQuery(...);
于 2010-01-24T22:33:40.620 に答える