2017-07-26 1 views
1
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は別の時間に空であるため動作しません。

これはどうして起こるか説明できますか?私はデータベースにリンクされたテーブルを作成するためにスクリプトを通してfetchrow_arrayを使ってwhileループを使用してきました。

+2

ここから始めます。あなたはループの本体でステートメントハンドル( '$ sth')を壊しています。 –

+0

あなたは精緻化できますか?どのように私はループ内のsthを持っていないクエリを実行することができますかわからない。 –

+1

精巧...確かに。あなたは 'while(@row = $ sth-> fetchrow_array()){...}'を持っています。ループの中で '$ sth'を修正してループ条件を変更するとどうなると思いますか? –

答えて

2

まず、コードを整形する習慣を身に付ける必要があります。これは、書式設定がロジックを模倣する場合、論理フローを追跡するのに役立ちます。

第2に、use strictを有効にして、可能な限りその使用箇所に近い変数を宣言するようにしてください。

第3に、グローバル変数を使用しないでください。あなたのサブルーチンは、$cardnum$salt$cookievalue、(おそらく)サブルーチン外で定義されているいくつかの他の変数を使用します。それらはすべてパラメータとしてサブルーチンに渡されます。

私は以前の会話から、あなたがPerlを学ぶことに興味がないことを知っています。あなたは、あなたの大学が主張するコースを通過しようとしています。だから私は、上記のアドバイスのすべてがPerlとは関係がないことを明確にすべきです。これはプログラミング言語の一般的なアドバイスです。

今、特定の問題。

データベースクエリを実行する場合はいつでも、新しい$dbhを作成しています。一度接続してからその変数を再利用するだけではどうでしょうか。単一の$dbhは、同時に実行される複数のクエリをサポートできます。

Mattがコメントに指摘したように、あなたは$sthを上書きしています。上で述べたように、$dbhは複数の同時クエリをサポートできますが、各クエリには独自の文ハンドルが必要です。 I a)は同じ$dbhを再利用してきたし、それは時間の短絡の可能な量のためにのみ利用可能ですので、b)はループ内$insert_sthを宣言した方法

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; 
} 

お知らせ:だからあなたのような何かをするかもしれません。

Perlに興味があれば、SQLでバインドポイントを使用し、余分なパラメータを​​に渡すことでコードをより効率的にする方法も示します。また、生のHTMLをあなたのプログラムから移動し、テンプレートエンジンを使用することをお勧めします。しかし、私はあなたが興味がないと強く疑う。

+0

Davidさん、ありがとうございます。私はPerlに興味があり、今私はそれを遊ぶ時間があります。私はより多くの質問が来るかもしれませんし、あなたのアドバイスを心に留めておきます。私はそれを一人でやっているので、このプロジェクトを終えるのに少ししか時間がなかったし、それは4人で済むはずですが、私は今完成しました。彼らが私たちに教えるPerlの形式はCGIを使用していないので、スクリプトには生のHTMLが必要ですが、私はCGIでPerlを学ぶことに興味があります。 ご協力いただきありがとうございます。 –

+0

*彼らが私たちに教えるPerlの形式はCGIを使わないので、スクリプトには生のHTMLが必要です。*あなたはCGIを使っています。あなたはCGIプログラムを書いています。あなたが使っていないものは、CGI.pm Perl CGIライブラリです。 CGI.pmは便利ですが、それに含まれるHTML生成関数を決して使用しないでください。 PerlのCGIプログラムでHTMLを生成するには、Template Toolkitのようなテンプレートエンジンを使うだけです。 –

+0

また、前にも言及したように、2017年にCGIを使ってPerl Webアプリケーションを書くのは狂気です。あなたがこれに興味を持ち続けたい場合は、PSGIとその上に構築されたWebフレームワークを見てください。 –

関連する問題