3

次のようなperlスクリプトがあります

my $tb = 'rajeev';
$query = 'select * from table where name = ?'
$sth = $dbh->prepare($query);
$sth->execute($tb);

クエリの実行時に $tb は rajeev または 'rajeev' に置き換えられますか? クエリが or として実行されることを意味し
select * from table where name = rajeev
ます
select * from table where name = 'rajeev'

4

1 に答える 1

5

DBI はすべてのエスケープを処理します。文字列の場合は になります'rajeev'。呼び出すselect * from table where name = rajeevとエラーになります。

数値を指定すると、引用符は必要ないため追加されません。

DBI Docを参照してください。また、次のようにも述べています。

quote() メソッドは、「プレースホルダーとバインド値」では使用しないでください。

使用している DBD によっては、プレースホルダーを使用すると、引用が処理されることがあります。あなたの場合、ドキュメントに記載されているようにDBD::mysqlが呼び出されます。$dbh->quote()

別のアプローチは、

$dbh->do("INSERT INTO foo VALUES (?, ?)", undef, $number, $name);

その場合、quote メソッドは自動的に実行されます。

クエリ ログにアクセスできる場合は、クエリがどのように表示されるかを確認できます。時間がかかるクエリがある場合は、mysql コンソールを開いてSHOW FULL PROCESSLIST;、実行中のクエリのリストを表示することもできます。これには、参照する完全な SQL ステートメントも保持されます。Windows では、HeidiSQLを使用して実行できます。

于 2012-06-28T14:33:16.257 に答える