私はいくつかのmysqlクエリをperlで持っていますが、where句の値の中には単語間のスペースが含まれています。ガンビア。スクリプトがスペースを含むwhere句引数で実行されると、2番目の単語は無視されます。私はmysqlクエリに一重引用符を自動的に追加したい
私はこの問題を解決する方法を知りたいと思います。つまり、ガンビアを入力すれば、ガンビアではなく、ガンビアで治療する必要があります。
私はいくつかのmysqlクエリをperlで持っていますが、where句の値の中には単語間のスペースが含まれています。ガンビア。スクリプトがスペースを含むwhere句引数で実行されると、2番目の単語は無視されます。私はmysqlクエリに一重引用符を自動的に追加したい
私はこの問題を解決する方法を知りたいと思います。つまり、ガンビアを入力すれば、ガンビアではなく、ガンビアで治療する必要があります。
まず、アプリケーションで未処理のSQLではなくDBIx::Classのようなものを使用してください。
しかし、未処理のSQLに悩まされている場合は、少なくともDBIを使用していると仮定して、SQL文でバインドポイントを使用する必要があります。これは、あなたのすべての引用問題を処理します。
$sth = $dbh->prepare('select something from somewhere where country = ?');
$sth->execute('The Gambia');
バインディングの詳細については、DBI docsを参照してください。
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});
@Sheriffo Ceesay - あなたのコメントごとに更新されました。 – bvr
これについて正確に言うと、プレースホルダ*はデータ値をエスケープしません。プリペアドステートメントを使用する場合、SQLコマンドの構造とそれらのコマンドで使用されるデータは完全に別々にデータベースに送られ、データを完全にエスケープする必要はありません。これは、プレースホルダ/プリペアドステートメントがエスケープするよりも優れている理由です。データがコマンドとは別に送信されるため、データをコマンドとして解釈するようにデータベースを欺く方法はありません。 –
@Dave Sherohman - あなたが正しいです、私はそれに応じて言葉を更新しました。 – bvr
@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(); –
@ Sheriffo Ceesay - あなたの質問にコードを追加してください。また '$ country'と' $ league'をビルドしているところでコードを提供してください。 – bvr
$ 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(); –