簡體   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