1

我创建了一个 Perl 脚本,该脚本旨在遍历一个数组(满足特定条件的客户的候选名单),使用 system() 执行一个外部命令,然后在操作完成后更新每行中的一个字段。

它适用于第一条记录(即执行外部命令,客户记录更新),但是当它到达第二条记录时,我收到此错误:

DBD::mysql::st fetchrow_array 失败:在 customer_update.pl 上 fetch() 没有 execute()

通过一些谷歌搜索,我添加了 $sth->finish(); 命令,但是无论我是否包含它(如图所示在循环内部或之后),我仍然会收到相同的错误。

任何人都可以为我阐明我在这里做错了什么吗?

这是一个摘录:

# PERL MYSQL CONNECT()
$dbh = DBI->connect('dbi:mysql:signups', $user, $pw) 
or die "Connection Error: $DBI::errstr\n";

# DEFINE A MySQL QUERY
$myquery = "SELECT * FROM accounts WHERE field3 = false";
$sth = $dbh->prepare($myquery);

# EXECUTE THE QUERY
$sth->execute
or die "SQL Error: $DBI::errstr\n";

@records = $sth->rows;
print "Amount of new customers: @records\n\n";

while ( my ($field1, $field2, $field3) = $sth->fetchrow_array() ) {
    #execute external command via system();
    $update_customer_status = "UPDATE accounts SET field3=true WHERE id=$id";
    $sth = $dbh->prepare($update_customer_status);
    $sth->execute
    or die "SQL Error: $DBI::errstr\n";
    print "Customer record modified & MySQL updated accordingly\n\n";   
    $sth->finish();
}
4

3 回答 3

4

在您的循环中,您覆盖了您从中获取的句柄。使用不同的变量。(更改$sth = ...;my $sth = ...;就可以了。)当我们这样做的时候,让我们移出prepare循环。

my $sth_get = $dbh->prepare("SELECT * FROM accounts WHERE field3 = false");
my $sth_upd = $dbh->prepare("UPDATE accounts SET field3=true WHERE id = ?");

$sth_get->execute();
while ( my ($field1, $field2, $field3) = $sth_get->fetchrow_array() ) {
    ...
    $sth_upd->execute($id);
}
于 2013-09-09T01:47:16.553 回答
4

使用变量构建 SQL 语句,然后对其进行 prepare() 操作,这违背了准备的目的。您应该使用占位符?而不是$id, prepare() 构建 SQL 语句,然后执行 ($id) 它。事实上,您让自己容易受到 SQL 注入攻击。

此外,您似乎没有使用warningsandstrict编译指示。这两行应该在您编写的每个程序的顶部:

use warnings;
use strict;

他们将在未来为您节省很多心痛和挫败感。

于 2013-09-09T02:36:15.070 回答
1

$sth执行此行时,您正在踩踏变量...

$sth = $dbh->prepare($update_customer_status);

为什么不将结果保存$sth->fetchrow_array()到数组变量中。就像是 ...

my @select_results_AoA = $sth->fetchrow_array();

...然后遍历数组...

for my @row ( @select_resilts_AoA ) {

... 代替 ...

while ( my ($field1, $field2, $field3) = $sth->fetchrow_array() ) {
于 2013-09-09T01:07:18.960 回答