繁体   English   中英

在Perl循环中更新MySQL失败(fetchrow_array)

[英]Update MySQL within Perl loop failing (fetchrow_array)

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

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

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

通过一些谷歌搜索,我添加了$ 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();
}

在循环中,您将覆盖从中获取的句柄。 使用其他变量。 (将$sth = ...;更改$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);
}

用变量构建SQL语句,然后对其进行prepare()破坏了prepare的目的。 您应该使用占位符构建SQL语句? 代替$id ,对其进行prepare(),然后执行($ id)。 实际上,您正对SQL注入攻击开放。

另外,您似乎并没有使用warningsstrict编译指示。 这两行应位于您编写的每个程序的顶部:

use warnings;
use strict;

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

您在执行此行时踩着$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() ) {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM