将PDO用于预处理语句(我从这里学到:http://www.kitebird.com/articles/php-pdo.html)我正在使用一个打开数据库连接的函数:
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 ;
或者我应该在循环内为每个插入语句打开和关闭它吗?每种方法的优缺点是什么?
for($i=0; $i<$number_of_values; $i++){
$dbh = testdb_connect();
//Insert rows
$dbh = NULL ;
}
答案 0 :(得分:7)
由于打开或关闭数据库或文件的任何调用都会产生很大的开销,为了提高效率,我会在循环之前打开数据库,并在循环完成时关闭。
答案 1 :(得分:6)
为整个脚本打开一次连接。打开连接有一定的开销,重新打开连接绝对没有优势。因此,要尽可能高效,请在脚本开头打开一次,最后关闭它。在循环中打开和关闭它是无稽之谈。
答案 2 :(得分:0)
作为一般规则,尽早开放,并尽可能晚地关闭。
在循环之外直接回答你的问题。
如果查看任何框架,您会注意到在引导过程的早期就打开了一个连接,并在一个退出的进程中关闭(如果有的话)。 Apache和PHP非常智能,可以在脚本完成时自动终止所有打开的连接。
答案 3 :(得分:0)
您应该在循环外打开和关闭数据库连接。每次在循环中打开和关闭数据库连接都会产生大量开销,并可能会降低您的网站速度。
理想情况下,您应该只在页面中打开一次数据库连接并关闭一次。因此,您可以在页面/脚本的最开头打开连接,并在最后关闭它。
答案 4 :(得分:0)
打开和关闭连接是耗费资源的,因此它不应该在循环中完成,除了你只需要一个连接来执行多个查询。
还有插入方法:不是每次迭代都运行一个查询,而是构建一个查询,然后在最后运行它,例如
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));
}