Kohana 3 では、クエリで名前付きパラメータをバインドできるようになりましたが、バインドできないパラメータをエスケープするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

質問

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

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

これは便利ですが、テーブル名など、他の項目も構成可能にしたい場合があります。テーブル名に名前付きパラメータを使用すると、失敗します。このような状況で文字列を構築しているところです。

私の質問は、この種の文字列構築を行うときに、潜在的に不正な文字をエスケープするにはどうすればよいですか?Kohana 2.x では、次のことができます。 $this->db->escape() しかし、Kohana 3 は根本的に異なるため、新しい方法があるのではないかと思います。

役に立ちましたか?

解決

ただ、マークバイヤーズ氏の答えに追加する、テーブル名のパラメータ化が失敗している理由は、テーブル名はの見出しの値のようにエスケープされていることです>。何おそらく起こっているのは、それが代わりにバッククォートに包まれているべきである一方で、テーブル名は、引用符で囲まれていることである。

ただし、マークが言うように、テーブル名をエスケープする必要が悪いデザインを提案しています。彼らはどちらかのハードコーディングされたか、その内容は信頼することができとにかくエスケープ必要しないように、いくつかの設定ファイルに格納する必要があります。あなたがあなた自身の設定が最も可能性の高い時間の無駄である信用しない程度に自分の拠点のすべてをカバーしようとしてます。

他のヒント

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

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

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

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

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

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

これがあなたの質問の答えになるかどうかはわかりませんが、これらはあなたの質問を読んだ私の考えです。少しでも使っていただければ幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top