タグ付けされた質問 「prepared-statement」

プリペアドステートメント(またはパラメーター化されたステートメント)は、パフォーマンスを向上させ、SQLインジェクション攻撃を軽減するのに役立つプリコンパイル済みSQLステートメントです。プリペアドステートメントは、多くの一般的なリレーショナルデータベース管理システムで使用されています。

21
配列をIN()条件にバインドできますか?
PDOを使用して値の配列をプレースホルダーにバインドできるかどうか知りたいです。ここでの使用例は、IN()条件で使用する値の配列を渡そうとしています。 私はこのようなことができるようになりたいです: <?php $ids=array(1,2,3,7,8,9); $db = new PDO(...); $stmt = $db->prepare( 'SELECT * FROM table WHERE id IN(:an_array)' ); $stmt->bindParam('an_array',$ids); $stmt->execute(); ?> そして、PDOにバインドして、配列内のすべての値を引用します。 現在私はやっています: <?php $ids = array(1,2,3,7,8,9); $db = new PDO(...); foreach($ids as &$val) $val=$db->quote($val); //iterate through array and quote $in = implode(',',$ids); //create comma separated list $stmt = …

30
PreparedStatement IN句の代替?
のINインスタンスでSQL 句を使用するための最良の回避策は何ですか?これは、java.sql.PreparedStatementSQLインジェクション攻撃のセキュリティ問題のため、複数の値に対してサポートされていません。1つの?プレースホルダーは、値のリストではなく1つの値を表します。 次のSQLステートメントについて考えてみます。 SELECT my_column FROM my_table where search_column IN (?) 使用することpreparedStatement.setString( 1, "'A', 'B', 'C'" );は?、そもそも使用する理由の回避策での、実際には機能しない試みです。 どのような回避策がありますか?

6
準備済みステートメントでの「like」ワイルドカードの使用
mysqlデータベースクエリを実行する準備済みステートメントを使用しています。そして、一種のキーワードに基づく検索機能を実装したいと思います。 そのため、LIKEキーワードを使用する必要があります。また、前に準備済みステートメントも使用しましLIKEたが、次のコードからどこに'keyword%'? 私は直接にそれを使用することができますpstmt.setString(1, notes)ように(1, notes+"%")またはそのような何か。私はこれに関する多くの投稿をウェブ上で見ていますが、良い答えはどこにもありません。 PreparedStatement pstmt = con.prepareStatement( "SELECT * FROM analysis WHERE notes like ?"); pstmt.setString(1, notes); ResultSet rs = pstmt.executeQuery();

9
準備されたステートメントはSQLインジェクション攻撃からどのように保護できますか?
準備されたステートメントは、SQLインジェクション攻撃の防止にどのように役立ちますか? ウィキペディアは言う: 後で別のプロトコルを使用して送信されるパラメーター値を正しくエスケープする必要がないため、準備されたステートメントはSQLインジェクションに対して回復力があります。元のステートメントテンプレートが外部入力から派生していない場合、SQLインジェクションは発生しません。 その理由がよくわかりません。簡単な英語での簡単な説明といくつかの例は何でしょうか?

13
PreparedStatementのSQLを取得するにはどうすればよいですか?
次のメソッドシグネチャを持つ一般的なJavaメソッドがあります。 private static ResultSet runSQLResultSet(String sql, Object... queryParams) これは、接続を開き、PreparedStatementsqlステートメントとqueryParams可変長配列のパラメーターを使用してを構築し、それを実行し、ResultSet(にCachedRowSetImpl)をキャッシュし、接続を閉じ、キャッシュされた結果セットを返します。 エラーをログに記録するメソッドに例外処理があります。デバッグに非常に役立つので、SQLステートメントをログの一部として記録します。私の問題は、String変数をsqlログに記録すると、テンプレートステートメントが実際の値ではなく?でログに記録されることです。実行された(または実行しようとした)実際のステートメントをログに記録したい。 だから...によって実行される実際のSQLステートメントを取得する方法はありますPreparedStatementか?(なければ、それを自分自身を構築する。私はアクセスする方法を見つけることができない場合PreparedStatement's、私はおそらく私の中でそれを自分自身を構築終わるだろう、SQLをcatchES。)

22
PDO Preparedは単一のクエリに複数の行を挿入します
現在、MySQLでこのタイプのSQLを使用して、1つのクエリに複数行の値を挿入しています。 INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),... PDOの読み取り値では、準備済みステートメントを使用すると、静的クエリよりも優れたセキュリティが得られます。 したがって、準備されたステートメントを使用して「1つのクエリを使用して値の複数の行を挿入する」ことを生成できるかどうかを知りたいのです。 はいの場合、どのように実装できますか?


1
mysqli_fetch_assoc()はパラメーターを期待しています/メンバー関数の呼び出しbind_param()エラー。実際のmysqlエラーを取得して修正するにはどうすればよいですか?
私のローカル/開発環境では、MySQLiクエリは正常に実行されています。しかし、Webホスト環境にアップロードすると、次のエラーが発生します。 致命的なエラー:非オブジェクトのメンバー関数bind_param()の呼び出し... これがコードです: global $mysqli; $stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?"); $stmt->bind_param('i', $cur_id); $stmt->execute(); $stmt->bind_result($uid, $desc); クエリを確認するために、コントロールパネルのphpMyAdminからクエリを実行しようとしましたが、結果はOKです。


2
PreparedStatementを複数回再利用する
プールのない単一の共通接続でPreparedStatementを使用する場合、準備済みステートメントの能力を維持するすべてのdml / sql操作のインスタンスを再作成できますか? というのは: for (int i=0; i<1000; i++) { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); preparedStatement.close(); } の代わりに: PreparedStatement preparedStatement = connection.prepareStatement(sql); for (int i=0; i<1000; i++) { preparedStatement.clearParameters(); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); } preparedStatement.close(); 私の質問は、このコードをマルチスレッド環境に配置したいという事実から生じます。アドバイスをいただけますか?ありがとう

6
Java:PreparedStatementを使用してMySQLに複数の行を挿入する
Javaを使用して、MySQLテーブルに複数の行を一度に挿入したい。行数は動的です。昔は… for (String element : array) { myStatement.setString(1, element[0]); myStatement.setString(2, element[1]); myStatement.executeUpdate(); } MySQLがサポートする構文を使用するようにこれを最適化したいと思います。 INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...] しかし、PreparedStatement私はこれを行う方法を知らないので、要素arrayがいくつ含まれるかは事前にわかりません。でそれが不可能な場合PreparedStatement、他にどのようにしてそれを行うことができますか(そして配列の値をエスケープしますか)?

5
PreparedStatement setNull(..)
Java PreparedStatementは、Null値を明示的に設定する可能性を提供します。この可能性は次のとおりです。 prepStmt.setNull(parameterIndex, Types.VARCHAR); この呼び出しのセマンティクスは、nullパラメーターを指定して特定のsetTypeを使用する場合と同じですか? prepStmt.setString(null); ?

5
bind_resultとget_resultの使用方法の例
bind_resultvs.get_resultを使用して呼び出す方法の例と、一方を他方の上に使用する目的は何であるかを確認したいと思います。 また、それぞれを使用することの長所と短所。 どちらかを使用する場合の制限は何ですか?違いはありますか?

3
Oracle JDBC最適化:SpringブートアプリケーションでPreparedStatementキャッシングを有効にする
Oracleデータベースに接続されているSpring Boot RESTアプリケーションがあります。JdbcTemplateを使用してJDBCを使用しています。Oracleデータベースのプロパティは、次の3つのapplication.properties設定を通じて取得されます。 spring.datasource.url spring.datasource.username spring.datasource.password このアプリはHikariCPを使用しています。HikariCPのWebサイトから、JDBCドライバーがそれを実行するのに最適な設定であるため、このプールはPreparedStatementsをキャッシュしないことがわかりました。 ここで、これらを確実にするためにどこで何を指定しますか? Oracle JDBCドライバー(ojdbc7.jar)がPreparedStatementsをキャッシュすること。キャッシュできるPreparedStatementsの数をカスタマイズする方法はありますか? https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/から、 データベースが最大パケットサイズに設定されていること、およびドライバーがそのパケットサイズと一致していることを確認してください。より大きな結果セットをフェッチする場合、これにより、ドライバーとサーバー間で送受信される合計パケット数が減少します。 上記に準拠して、に必要な手順は何ですか Oracle DBサーバーのパケットサイズを確認する Oracle DBサーバーが最大パケットサイズに設定されているかどうかを確認する Oracle JDBCドライバーの(ojdbc8.jar)パケットサイズを設定します。 その他の(Oracle)JDBCパフォーマンス最適化のヒントをいただければ幸いです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.