2016-11-15 15 views
0

私は以下のコードを持っており、データベースとして変数を渡す必要があります。データベースとして変数を渡すことは可能ですか?mysqlを使ってストアド変数をデータベースとして渡すには?

私の変数:

my $num_site = join('_', 'rate', $site, '1m'); 
my $num_site1=join('_','rate',$site,'current'); 

私のコード:ここで

は私の代わりに、データベース名の行う接続内部変数を渡す代わりに、私はこの方法に従ってくださいdirectly.Canデータベースを与える変数を渡そうとしました私の変数($ num_site)と($ num_site1)をデータベースに渡すのを助けてくれますか?

$DBH=DBI->connect($database) or die "cannot connect to the sql server\n"; 
$DBH->do("USE $num_site");(can i use the variable like this to fetch the database). 
#$DBH->do("use rate_bangalore_1m"); 
$stmt = "INSERT INTO $num_site.m_status(time,available,closed,used,busy,reserved,down) VALUES(\"$current_time\",\"$ma{'D'}\",\"$ma{'B'}\",\"$ma{'A'}\",\"$ma{'C'}\",\"$ma{'R'}\",\"$ma{'+'}\")";  
print "\n $stmt \n";  
my $sth = $DBH->prepare($stmt); 
$sth->execute() or print "Could not insert data"; 
$sth->finish; 
$DBH->disconnect(); 

答えて

0

質問に対する回答は「はい」です。文字列の中で変数を使うことができ、それらはうまく展開されます。しかし、私はあなたがそれを使用する前に$stmtの内容を印刷していることを知っていると思う。

doメソッドに渡す文字列と、$stmt変数に割り当てる文字列は、どちらも標準のPerl文字列です。 DBIは珍しいことは何もしません。それらは他のPerl文字列とまったく同じように動作します。

しかし、あなたが疑問を投げかけていることを考えれば、それはあなたが疑念を抱くように機能していないと思われ、あなたが見ている予期しない動作を教えてくれたことを忘れてしまいました。あなたの2つのデータベース名変数が、プログラムのこの部分に到達する前に期待する値に設定されていない可能性があるという可能性のある問題が1つあります。私はそれらも正しく印刷されていることを確認しています。

つの提案(つまり、必ずしもあなたの、指定されていない、問題は修正されませんが、あなたのコードの品質を向上させる):

  • 私はめったにDBIコードでUSEのステートメントを実行している人を見ません。 DBI接続文字列の一部としてデータベースを設定できるからです。ドキュメントのSYNOPSISを参照してください。
  • カラム値を直接SQLに入れないでください。代わりに、​​メソッドのバインドポイントと追加のパラメータを使用します。このように:

    $stmt = "INSERT INTO $num_site.m_status 
         (time, available, closed, used, busy, reserved, down) 
         VALUES 
         (?, ?, ?, ?, ?, ?, ?)"; 
    
    my $sth = $DBH->prepare($stmt); 
    $sth->execute($current_time, $ma{D}, $ma{B}, $ma{A}, 
           $ma{C}, $ma{R}, $ma{'+'}) 
        or die $sth->errstr; 
    

    これは安全です(SQLインジェクション攻撃からあなたを守ります)が、読みやすくなります。私もエラーメッセージを追加しました。

関連する問題