2017-11-17 4 views
0

ユーザーの入力を取得し、SQLのLikeステートメントに送信しようとしています。しかし、私はエラーを取得しています:定義されていないメソッド "bind_param"を呼び出すことはできません。 私のオリジナルコード:PerlユーザーのSQLへの入力Likeステートメント

#!/usr/bin/perl 
use DBI; 
#use DBD::Oracle; 
use strict; 
use warnings; 
use CGI; 


print "Enter INCD number : "; 

my $input = <>; 
chomp $input;  

my $DSN = 'driver={SQL Server};Server=ddsfs1; database=sdfds;TrustedConnection=Yes'; 
my $dbh = DBI->connect("dbi:ODBC:$DSN") 
    #print "connected.." 
    or die "$DBI::errstr\n"; 

my $query = $dbh->prepare("SELECT TOP 20 Id 
     ,Created 
     ,Updated 
     ,Message 
     FROM FrameworkDEV3.Log.Entry 
    where Message like ?        
    and Created >= DATEADD(day, -10, GETDATE()) 
     order by Created desc"); 
$sth->bind_param(1, '%$input%'); 

print $sth; 
$sth->execute; 
#DBI::dump_results($sth); 

while(my @data = $query->fetchrow_array()) 
{ 
    foreach(@data) { 
    print "[$_]"; 
    } 
    print "\n\n"; 
} 

$sth->finish; 
$dbh->disconnect; 
#print "Connected.."; 
print "\n"; 

次のコードは、デイブとジムからのコメントごとに固定されている:

my $sth = $dbh->prepare("SELECT TOP 20 Id 
     ,Created 
     ,Updated 
     ,Message 
     FROM FrDEVsd.Log.Entry 
    where Message like ?        
    and Created >= DATEADD(day, -10, GETDATE()) 
     order by Created desc"); 
    $sth->bind_param(1, "%$input%"); 
print $sth; 
$sth->execute; 
#DBI::dump_results($sth); 
while(my @data = $sth->fetchrow_array()) 
{ 
    foreach(@data) { 
    print "[$_]"; 
    } 
    print "\n\n"; 
} 

$sth->finish; 
$dbh->disconnect; 

印刷 "\ n" は、

今取得エラーイムは、あなたのコードで

DBI::st=HASH(0x2a9a480)

+0

準備された文は '$ query'に格納されます。 '$ sth'は決して定義されていないので、間違っていることをエラーメッセージが正確に伝えています。 –

+0

*現在のエラーは 'DBI :: st = HASH(0x2a9a480)' *です - これはエラーではありません。これはあなたの 'print $ sth'ステートメントからの出力です。 –

答えて

3

です:

my $query = $dbh->prepare("SELECT TOP 20 Id 
     ,Created 
     ,Updated 
     ,Message 
     FROM sdada.ada.asd 
     where Message like ?        
     and Created >= DATEADD(day, -10, GETDATE()) 
     order by Created desc"); 
my $sth->bind_param(1, "%$input%"); 

お知らせプリペアドステートメントを$queryという名前の変数に格納されていますが、決してなかった$sthを使用してバインドしようとしています設定され、未定義です。それはエラーメッセージがあなたに伝えていたものです。

問題を解決するために、両方の場所で同じ変数名を使用します(後でステートメントを実行するとき)。

2

あなたはすでに魚を与えられています。おそらく私たちはあなたの将来を捉える方法を示すことができます。

これはあなたのエラーです:

Can't call method "bind_param" on an undefined

あなたがこの行にbind_param()を呼び出す:

my $sth->bind_param(1, "%$input%"); 

ですから($sthと呼ばれる)の変数を定義していると、すぐにその変数がオブジェクトであることを期待してのメソッドを呼び出すことができます。

my $var = 'something'; 

あなたのコードは、こののと同等です:あなたはmyで変数を定義するとき、あなたはこのようにそれに何かを代入しない限り、変数はundefに初期化されます。

my $sth = undef; 
$sth->my $sth->bind_param(1, "%$input%"); 

今問題が表示されますか?

DBIコードでは、文を実行するために使用するステートメントハンドルを格納するために変数$sthが使用されることがよくあります。私はあなたがこれをいくつかのDBIコードの例からコピーし、そこから変数名を取得したと思う。 $sthがステートメントハンドルの場合は、確かにbind_param()メソッドを呼び出すことができます。

したがって、$sthはステートメントハンドルである必要があります。そして、データベースハンドル上でprepare()メソッドを呼び出すことでそれらのうちの1つを作成します。 $queryを使用して、独自のコードを書き始めたよう

my $query = $dbh->prepare("SELECT ..."); 

だから、それは私になります

my $sth = $dbh->prepare($some_sql); 

ああ、しかし、あなたはすでにそのようなたくさん見えるラインを持っている....待ちますステートメントハンドルを保持する変数次に、いくつかのサンプルコードからbind_param()行をコピーしました。それはあなたが宣言していなかった$sthを使用したので、コンパイルされなかったので、その問題を回避するためにその前にmyを貼り付けましたか?それはまったく正確に聞こえるでしょうか?

すでに作成したステートメントハンドルでbind_param()を呼び出すことが本当に必要でした。

$query->bind_param(1, "%$input%"); 

しかし、正直に言うと、私はそれがDBiに関連の変数のための「標準」の名前に固執するのは良いアイデアだと思います。それはあなたのメンテナンスプログラマー(6ヶ月であなたかもしれません!)が見たいものです。

だから私はにprepare()行を変更したい:

my $sth = $dbh->prepare("SELECT ..."); 

、そのままbind_param()コールを残します。 fetchrow_array()$sthで呼び出すように変更する必要があります。

+1

男にビールを与え、彼は飲むことを学び、醸造する方法を彼に教え、彼は決して再び働かないだろう。 –

+0

はジム、デイブは、おかげで非常にmuch.Myコードは次のようになります。 私の$ sthは= $ dbh->準備(「FrameworkDEV3.Log.Entry \tのトップ20同上、作成され、更新、メッセージを選択した場合、メッセージ のような? \tとCreated> = DATEADD(日、-10、GETDATE()) \t \tオーダー作成済み "); $ sth-> bind_param(1、 "%$ input%"); #または "文を準備できませんでした:" $ dbh-> errstr; print $ sth; $ sth-> execute; while(my @data = $ sth-> fetchrow_array()) { foreach(@data){ "[$ _]"を印刷します。 } 印刷 "\ n \ n"; } $ sth-> finish; そして。エラーIm取得: DBI :: st =ハッシュ(0x29da480) – dbanerje

+0

@ dbanerje:そのようなコメントにコードをダンプしないでください。誰もそれを読むつもりはない。新しい情報を追加する(または完全に新しい質問を追加する)ためにも、[自分の質問を編集する](https://stackoverflow.com/posts/47344022/edit)が良いでしょう。 –