[英]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注入攻击开放。
另外,您似乎并没有使用warnings
和strict
编译指示。 这两行应位于您编写的每个程序的顶部:
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.