0

コハナ3では、次のようなクエリでパラメータをバインドできます

$query = 'SELECT name FROM users WHERE id = :id';

これは適切ですが、テーブル名など、他のものを構成できるようにしたい場合があります。テーブル名に名前付きパラメーターを使用すると、失敗します。私はこのような状況で弦を作っているところです。

私の質問は、この種の文字列構築を行うときに、潜在的に悪い文字をどのように回避できるかということです。コハナ2.xではできます$this->db->escape()が、コハナ3は根本的に違うので、新しい方法があると思いますか?

4

2 に答える 2

5

Mark Byersの回答に追加するだけで、テーブル名のパラメータ化が失敗する理由は、テーブル名が識別子であるのに対し、パラメータがとしてエスケープされるためです。おそらく起こっているのは、テーブル名が引用符で囲まれているのに、代わりにバッククォートで囲まれているということです。

ただし、Mark が言うように、テーブル名をエスケープする必要があるということは、設計が悪いことを示唆しています。それらは、ハードコードするか、いずれにしてもエスケープする必要がないと信頼できる内容の構成ファイルに格納する必要があります。自分の構成を信頼できないほどにすべてのベースをカバーしようとするのは、おそらく時間の無駄です。

于 2010-02-05T00:22:56.360 に答える
4

私は kohana を使用したことがないので、このコメントがまったく関係ない場合は申し訳ありませんが、あなたがやろうとしていることについていくつかコメントがあります。

テーブル名に名前付きパラメータを使用すると失敗します。

これは、基盤となるデータベースのパラメーター メカニズムに依存しているためだと思いますが、クエリでパラメーターとしてテーブル名を指定できるデータベースを知りません。そうです、ほとんどの場合、文字列を自分で作成する必要があります。

この種の文字列構築を行うときに、潜在的に悪い文字をエスケープするにはどうすればよいですか?

この質問は奇妙に思えます...テーブル名の一部に不適切な文字が含まれている可能性があります...もしそうなら、なぜですか? または、信頼できないソース (ユーザー?) からテーブル名を受け取っています。これは私には悪い考えのように聞こえます。アクセスできるはずのないテーブルから読み取ろうとした場合はどうなるでしょうか。不適切な可能性のあるテーブル名をエスケープするのではなく、適切に定義された許容可能なテーブル名のリストを作成し、テーブルがそのリストに存在することを確認する方がよいのではないでしょうか?

最後に、クエリでテーブル名を変更でき、それが機能する場合は、データベースが正しく正規化されていない可能性があります。おそらく、テーブルを結合し、グループ化に関する情報を含む列を追加し、WHERE 句を使用して必要なデータを選択できますか? より具体的なものを提案するには、モデルについてもっと知る必要があります。

これがあなたの質問への回答にまったく役立つかどうかはわかりませんが、これらはあなたの質問を読んだ私の考えです。少しでもご利用いただければ幸いです。

于 2010-02-05T00:10:05.120 に答える