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属性)来发现数据是否完整或是否由于错误而被截断.