9

DBIモジュールmysql_real_escape_string()の Perl 用の PHP と同じように機能する関数があるかどうか教えてもらえますか?

4

5 に答える 5

16

プレースホルダーとバインド値を使用する必要があります。

于 2010-02-05T14:52:28.813 に答える
9

しないでください。エスケープ。SQL。

しないでください。見積もり。SQL。

SQL プレースホルダー/パラメーターを使用します ( ?)。SQL ステートメントの構造とプレースホルダーによって表されるデータ値は完全に別々にデータベースに送信されるため、(データベース エンジンまたは DBD モジュールのバグを除けば) データ値が SQL として解釈される可能性はまったくありません。コマンド。

my $name = "Robert'); DROP TABLE Students; --";
my $sth = $dbh->prepare('SELECT id, age FROM Students WHERE name = ?');
$sth->execute($name);  # Finds Little Bobby Tables without harming the db

副次的な利点として、プレースホルダーを使用すると、SQL ステートメントを再利用する場合 (一度だけ準備する必要がある場合) も効率的であり、そうでない場合 (準備を明示的に呼び出さない場合でも、効率は低下しません) になります。クエリが実行される前に暗黙的に呼び出されます)。

于 2010-02-06T11:02:08.160 に答える
5

引用のように?

utf8 について心配な場合は、 DBD::MySQLのドキュメントを読むこともお勧めします。

于 2010-02-05T14:06:12.117 に答える
2

http://www.stonehenge.com/merlyn/UnixReview/col58.htmlから:

  SQL::Abstract を使用します。
  ...
  私の $sqa = SQL::Abstract->new;
  私 ($所有者、$account_type) = @_; # 入力から
  my ($sql, @bind) = $sqa->select('account_data', # テーブル
                                  [qw(account_id balance)], # フィールド
                                  {
                                    account_owner => $所有者、
                                    account_type => $account_type
                                  }、 # "どこ"
                                 );
  私の $sth = $dbh->prepare_cached($sql); # 可能であれば SQL を再利用する
  $sth->execute(@bind); # このクエリに対して実行する
于 2010-02-05T14:05:36.833 に答える
0

データベースハンドルメソッド "quote"

my $dbh = DBI->connect( ... );
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
          $dbh->quote("Don't");

http://metacpan.org/pod/DBI#quote

于 2015-11-05T14:25:18.637 に答える