2011-02-24 11 views
0

私はいくつかのmysqlクエリをperlで持っていますが、where句の値の中には単語間のスペースが含まれています。ガンビア。スクリプトがスペースを含むwhere句引数で実行されると、2番目の単語は無視されます。私はmysqlクエリに一重引用符を自動的に追加したい

私はこの問題を解決する方法を知りたいと思います。つまり、ガンビアを入力すれば、ガンビアではなく、ガンビアで治療する必要があります。

答えて

2

まず、アプリケーションで未処理のSQLではなくDBIx::Classのようなものを使用してください。

しかし、未処理のSQLに悩まされている場合は、少なくともDBIを使用していると仮定して、SQL文でバインドポイントを使用する必要があります。これは、あなたのすべての引用問題を処理します。

$sth = $dbh->prepare('select something from somewhere where country = ?'); 

$sth->execute('The Gambia'); 

バインディングの詳細については、DBI docsを参照してください。

+0

@bvr @davorgご返信いただきありがとうございますが、ご理解いただけるように、コードスニペットを添付してください。私はこのようなことをしていますが、それを変数に代入すると、クエリにも同様の節が含まれます。以下のコードは$ sel = $ dbh-> prepare( "SELECT' id'、 'date'を曜日、' time'、 'one'、' one_r'、 'two''、' two_r'、リーグ、国名、詳細フットボールWHERE(1つのTRIM(?)または2つのLIKE TRIM(?))$ country $ league $ date $ limit "); \t \t \t $ sel-> execute( "%$ command%"、 "%$ command%"); $ row = $ sel-> fetchrow_hashref(); $ sel-> finish(); –

+1

@ Sheriffo Ceesay - あなたの質問にコードを追加してください。また '$ country'と' $ league'をビルドしているところでコードを提供してください。 – bvr

+0

$ sel = $ dbh-> prepare( "SELECT id、日付は日、時刻、one、one_r、two、two_r、リーグ、国、詳細フットボールWHERE(LIKE TRIM(?)またはLIKE TRIM(?) )$ country $ league $ date $ limit "); $ sel-> execute( "%$ command%"、 "%$ command%"); $ row = $ sel-> fetchrow_hashref(); $ sel-> finish(); –

6

DBIを使用している場合、エスケープ処理を気にする必要はなく、プレースホルダを使用して任意のデータをデータベースに送信できます。プレースホルダは、実際の値がexecuteに与えられ、prepare文で疑問符です:

use DBI; 

$dbh = DBI->connect("DBI:mysql:....",$user,$pass) 
    or die("Connect error: $DBI::errstr"); 

my $sth = $dbh->prepare(qq{ SELECT something FROM table WHERE name = ? }); 
$sth->execute('the gambia'); 

# fetch data from $sth 

$dbh->disconnect(); 

編集:

(あなたがコメントで示唆したように)クエリを構成している場合、あなたは quoteメソッドを利用することができます
my $country = "AND country = " . $dbh->quote('the gambia'); 
my $sth = $dbh->prepare(qq{ SELECT something FROM table WHERE name = ? $country}); 
+0

@Sheriffo Ceesay - あなたのコメントごとに更新されました。 – bvr

+0

これについて正確に言うと、プレースホルダ*はデータ値をエスケープしません。プリペアドステートメントを使用する場合、SQLコマンドの構造とそれらのコマンドで使用されるデータは完全に別々にデータベースに送られ、データを完全にエスケープする必要はありません。これは、プレースホルダ/プリペアドステートメントがエスケープするよりも優れている理由です。データがコマンドとは別に送信されるため、データをコマンドとして解釈するようにデータベースを欺く方法はありません。 –

+0

@Dave Sherohman - あなたが正しいです、私はそれに応じて言葉を更新しました。 – bvr

関連する問題