2013-06-26 6 views
5

SQL queryをデータベーステーブルに保存しているので、より多くのレコードがdbに入力されても、使用される基準を保存します。SQLクエリをテーブルに保存する方法は?

Queryステートメントの格納に使用する正しいデータ型と構文がありますか。 データ型をVARCHAR(1055)と設定しましたが、これで十分です。 を引用符で囲み、1つの文字列にしておくと、テキストが正しく保存されることを確認するMySQL functionがありますか?

アップデート:私たちは、システムのユーザーがシステムの他のユーザーに基づいて連絡先のリストを作成することができますので、彼らが選択するために、フォームを使用してクエリを作成するクエリ

を保存するための理由は、すべてのユーザーと言いますエグゼクティブの仕事の種類。

上記のクエリはデータベースに保存されるため、新しいユーザーがエグゼクティブジョブの種類に追加されても、連絡先の詳細が通信の送信時に含まれます。

私はこれを行う最善の方法だと思います...アイデアはありますか?

+0

どこから保存していますか?コンソールから直接? PHPから? PhpMyAdminから? –

+0

SQLクエリ自体は単なる文字列なので、 'varchar'は正しいデータ型のようです。しかし、クエリを保存することは非常に珍しいことです。私はあなたが達成しようとしていることを達成するためのより良い方法があると思います。また、アプリケーション内に追加の潜在的なSQLインジェクションポイントを作成しているように見えるので、ステートメントが適切に消されていることを確認する必要があります。 – David

+0

PHPから、クエリの更新理由を確認してください – surfer190

答えて

3

VARCHAR(1055)を変換するPHP htmlentities()を使用することができます。 TEXT、任意の長さのテキスト用のMySQLのデータ型(他のデータベースではCLOBとも呼ばれます)を使用してください。

詳しい背景情報:それでも

、私はあなたがおそらく代わりに、データベース内のプレーンテキストSQLを格納する、アプリケーションレイヤ上の一つの方法または別のクエリをモデル化すべきだと思います。スキーマを変更すると、それらのSQLステートメントはすべて間違っている可能性があります。幸いなことにマイグレーション!

ユーザーが任意のSQLを入力できる場合、大きなセキュリティ上の問題が生じるというアプローチのもう一つの欠点もあります。あなたはCREATE VIEWを実行することができるパラメータに渡す必要がない場合は、その契約延長していなかった気の利いたインターンは

DROP DATABASE my_database. 
+0

私はそれを直接SQlエントリを許可しないことで保護していると思います。私は決してクエリを投稿しません。セッション変数に格納され、システムによって生成されます。 – surfer190

+0

@StephenH:ちょうど確信したかった。 –

1

クエリを格納する正しいデータ型がありません。

ただし、HTMLencode文字を使用してHTML文字を削除することはできます。

それとも、十分ではありません文字

0

私は、これは正しいアプローチではないと信じています。結果のクエリをデータベースに保存するのではなく、作成したSQLを生成したパラメータを保存する必要があります。あなたの実装では、そのクエリを変更するときに、フィルタフォームをユーザに表示するために、格納されたSQLを解析してパラメータを取得する必要があります。ただし、代わりにパラメータを保持すると、必要に応じてクエリを再生成でき、現在のフィルタフォームを簡単に表示できます。

私の前に述べたように、SQLを格納することを主張すれば、TEXTは正しいフィールド型です。フィールドサイズの制限でSQL文字列を切り捨てる可能性は非常に低くなります。

関連する問題