为什么Apache抱怨我的mod_perl程序"断开连接使1个活动语句句柄无效"?

Gen*_*neQ 8 mysql apache perl dbi

disconnect会使1个活动语句句柄无效(在断开连接之前,destroy语句处理或调用它们)

从MySQL获取数据的以下代码成功执行,但会导致Apache在其错误日志中生成以上消息:

my $driver   = "mysql";
my $server   = "localhost:3306";
my $database = "test";
my $url      = "DBI:$driver:$database:$server";
my $user     = "apache";
my $password = "";

#Connect to database
my $db_handle = DBI->connect( $url, $user, $password ) 
    or die $DBI::errstr;

#SQL query to execute
my $sql = "SELECT * FROM tests WHERE id=?";

#Prepare SQL query
my $statement = $db_handle->prepare($sql)
        or die "Couldn't prepare query '$sql': $DBI::errstr\n";

#Execute SQL Query
$statement->execute($idFromSomewhere)
    or die "Couldn't execute query '$sql': $DBI::errstr\n";

#Get query results as hash
my $results = $statement->fetchall_hashref('id');

$db_handle->disconnect();
Run Code Online (Sandbox Code Playgroud)
  • 忽略上述错误/警告会有任何可怕的后果吗?代码运行了一个星期没有任何不良影响.

  • 代码有什么问题或者这只是一个无害的警告吗?

编辑

代码通过mod_perl执行.

Pau*_*lin 12

你应该叫$statement->finish();之前$db_handle->disconnnect();.

通常你不需要打电话finish,除非你没有得到所有的行.如果使用循环获得所有结果,fetchrow_array除非中止循环,否则不要在结束时调用finish.

我不确定为什么MySQL驱动程序在完成后没有完成语句fetchall_hashref.手册建议您的查询可能因错误而中止:

如果发生错误,则fetchall_hashref返回到目前为止所获取的数据,该数据可能为无.您应该事后检查$ sth-> err(或使用RaiseError属性)来发现数据是否完整或是否由于错误而被截断.