gpt4 book ai didi

mysql - while 循环只存储来自 @row=$sth->fetchrow_array() perl 的一个值

转载 作者:行者123 更新时间:2023-11-29 06:00:32 28 4
gpt4 key购买 nike

sub completecheckout {
$cryptedcard = md5_hex($cardnum . $salt);
$grabcart = qq~select pid from cart where uid='$cookievalue'~;
$dbh = DBI->connect($connectionInfo, $user, $passwd);
$sth = $dbh->prepare($grabcart);
$sth->execute();

while (@row = $sth->fetchrow_array()) {
$insert = qq~insert transaction (uid, pid, cctype, ccnum)
values ('$cookievalue', '$row[0]', '$cardtype',
'$cryptedcard')~;
$dbh = DBI->connect($connectionInfo, $user, $passwd);
$sth = $dbh->prepare($insert);
$sth->execute();
}
$select = qq~select * from registered where id in
(select uid from transaction
where uid='$cookievalue')~;
$dbh = DBI->connect($connectionInfo,$user,$passwd);
$sth = $dbh->prepare($select);
$sth->execute();
@userinfo = $sth->fetchrow_array();

print header;
print qq~<html><head><title>YAY</title></head><body><p>CHECK MYSQL<p><p>@row</p></body></html>~;

}

我正在尝试通过表格购物车进行解析,并在用户单击最终结帐按钮时将与用户关联的所有项目插入到交易表中。上面的代码只会将最后一行插入交易表。

这里是多次插入的代码,但不起作用,因为每隔一段时间 $product 都是空的。

sub completecheckout {
$cryptedcard = md5_hex($cardnum . $salt);
$grabcart = qq~select pid from cart where uid='$cookievalue'~;
$dbh = DBI->connect($connectionInfo,$user,$passwd);
$sth = $dbh->prepare($grabcart);
$sth->execute();
@cart = $sth->fetchrow_array();
foreach $product (@cart) {
$insert = qq~insert transaction (uid, pid, cctype, ccnum)
values ('$cookievalue', '$product', '$cardtype',
'$cryptedcard')~;
$dbh = DBI->connect($connectionInfo,$user,$passwd);
$sth = $dbh->prepare($insert);
$sth->execute();
}
$select = qq~select * from registered where id in
(select uid from transaction
where uid='$cookievalue')~;
$dbh = DBI->connect($connectionInfo,$user,$passwd);
$sth = $dbh->prepare($select);
$sth->execute();
@userinfo = $sth->fetchrow_array();
print header;
print qq~<html><head><title>YAY</title></head><body><p>CHECK MYSQL<p><p>@userinfo</p></body></html>~;

}

谁能解释为什么会这样?我一直在整个脚本中使用带有 fetchrow_array 的 while 循环来创建链接到数据库的表。

最佳答案

首先,您需要养成更好地格式化代码的习惯。如果格式模仿逻辑,它确实有助于遵循逻辑流。

其次,请打开use strict并习惯于在尽可能接近其使用点的地方声明变量。

第三,不要使用全局变量。您的子例程使用 $cardnum$salt$cookievalue 和(大概)在子例程之外定义的其他几个变量。它们都应该作为参数传递到子程序中。

我从之前的谈话中知道你对学习 Perl 没有兴趣,你只是想通过你的大学坚持的类(class)。所以我应该明确一点,上面的所有建议都与 Perl 无关。对于任何编程语言,这都是很好的一般性建议。

现在,具体问题。

每当您想运行数据库查询时,您都在创建一个新的 $dbh。为什么不只连接一次然后重用该变量。单个 $dbh 可以支持同时执行多个查询。

正如 Matt 在评论中指出的那样,您正在覆盖 $sth。正如我上面所说,$dbh 可以支持多个并发查询,但每个查询都需要自己的语句句柄。所以你可以这样做:

my $dbh = DBI->connect(...);

my $select_sth = $dbh->prepare($select_sql);
$select_sth->execute;

while (my @row = $select_sth->fetchrow_array) {
my $insert_sth = $dbh->prepare($insert_sql);
$insert_sth->execute;
}

请注意我是如何 a) 重用相同的 $dbh 和 b) 在循环中声明 $insert_sth 以便它仅在尽可能短的时间内可用.

如果您对 Perl 感兴趣,我还会向您展示如何通过在 SQL 中使用绑定(bind)点并将额外参数传递给 execute() 来提高代码效率。我还建议将原始 HTML 从您的程序中移出并使用模板引擎。但我强烈怀疑您不会感兴趣。

关于mysql - while 循环只存储来自 @row=$sth->fetchrow_array() perl 的一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335034/

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