[英]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.