gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:54:18 27 4
gpt4 key购买 nike

我创建了一个 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();
}

最佳答案

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

此外,您似乎没有使用 warningsstrict pragma。这两行应该位于您编写的每个程序的顶部:

use warnings;
use strict;

它们会在未来为您省去很多心痛和挫折。

关于mysql - 在失败的 Perl 循环中更新 MySQL (fetchrow_array),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com