2012-01-17 11 views
1

は(私はここから学んだ:http://www.kitebird.com/articles/php-pdo.html)私は、データベース接続を開く機能使用しています:ループ内またはループ外でデータベース接続を開いたり閉じたりする必要がありますか?プリペアドステートメントでPDOを使用して

function testdb_connect() 
{ 
    $dbh = new PDO("mysql:host=localhost;dbname=test", "testuser", "testpass"); 
    return ($dbh); 
} 

を私はforループの繰り返し処理を行い、テーブルに行を挿入することを持っています。私は、ループの前に接続を開き、ループが

$dbh = testdb_connect(); 
for($i=0; $i<$number_of_values; $i++){ 
    //Insert rows 
} 
$dbh = NULL ; 

それとも私が開いて、各INSERTステートメントのループ内にそれを閉じる必要がありますを構築した後、それを閉じる必要がありますか?各方法の賛否両論は何ですか?

for($i=0; $i<$number_of_values; $i++){ 
    $dbh = testdb_connect(); 
    //Insert rows 
    $dbh = NULL ; 
} 
+1

のために最後にそれを実行するために理にかなってあなたは物事を再設計したいかもしれません。例えば、ループの中で 'WHERE x = ...'クエリを実行するのではなく、一つの 'WHERE x IN(...)'クエリですべての必要なデータを取り出してください。 – ThiefMaster

答えて

7

データベースまたはファイルを開閉する任意の呼び出しで大きなオーバーヘッドがあるので、効率のために、私はループの前に、データベースを開くなり、ループが完了したときに閉じます。

5

は、スクリプト全体のために一度接続を開きます。接続を開く際にある程度のオーバーヘッドがあり、再開には全く利点はありません。できるだけ効率的になるためには、スクリプトの最初に一度開いて最後に閉じてください。ループ内での開閉はナンセンスです。一般的なルールとして

0

、可能な限り早期に開いて、できるだけ遅く閉じます。直接ループの外で、あなたの質問に答えるために

フレームワークを見ると、接続がブートストラッププロセスの早い段階で開かれ、存在するプロセスで閉じられていることがわかります。 ApacheとPHPは、スクリプトが終了したときに開いているすべての接続を自動的に終了するほどスマートです。

0

あなたはループの外のデータベース接続を開閉する必要があります。ループで毎回データベース接続を開いたり閉じたりするとオーバーヘッドが大きくなり、サイトの速度が低下する可能性があります。

あなたは、理想的には一度だけあなたのページでデータベース接続をオープンし、一度それを閉じる必要があります。したがって、ページ/スクリプトの最初のところで接続を開き、最後に接続を閉じることができます。

0

接続のオープンとクローズはリソースを消費するため、複数のクエリを実行するために1つの接続だけでなく、ループで実行しないでください。

挿入方法もあります。むしろ、反復ごとにクエリを実行しているよりも、あなたがループ内でデータベースにアクセスする場合は、単一のクエリを構築し、例

create table test(
    testField VARCHAR(12) 
) 

function rowsToDb($rows) 
{ 
    /*Define base of query*/ 
    $query = "INSERT INTO test (testField) VALUES "; 
    /*Iterate through rows concatenating new insert values*/ 
    foreach($rows as $row){ 
     $query .= "('". $row['testField']. "'),"; 
    } 
    testdb_connect(); 
    /*Remove rogue "," and execute query*/ 
    mysql_query(substr($query, 0, strlen($query) - 1)); 
} 
関連する問題