ちょっとした問題に直面しています。私は現在、MySQLで動的テーブル名を使用する必要があるアプリケーションに取り組んでいます。
基本的に、私はいくつかの要因(ジャンル、再生時間、リリース日など)に基づいてデータベースからアルバムを選択するプロセスを持っています-このプロセスのセクションには、ユーザーが一連のカスタムフィルターを作成できるようにするセクションがあります。
カスタムフィルターは、その選択基準内のすべてのアルバムのユーザーにカウントを返します。これらのアルバムのIDは、ランダムに生成されたハッシュ/シリアル番号とともにテーブルに保存されます(例:albumSelect_20880f9c05d68a)
巨大なコンマ区切りのリストをフィールドに格納したくなかったので、このようにしました(本当にばかげています)-そして、HTMLの非表示フィールドに値の配列を送信するのは好きではありませんでした。データスループット(一度に数千行になる可能性があります)
CodeIgniterでは、次のようにクエリバインディングを使用してSQLクエリを生成しています。
select * from artists where artistName = ? AND albumTitle = ?
クエリをパラメータ化すると、クエリは自動的にエスケープされます
$query = $this->db->query($sql,array("Singer","Album"));
ここで注意が必要な部分があります
次のようなクエリを作成すると、次のようになります。
$sql = "select albumid from albums where albumid in (select albumid from albumSelect_?)";
$this->db->query($sql,array('20880f9c05d68a'));
結果のクエリは次のようになります。
select `albumid` from `albums` where `albumid` in (select `albumid` from `albumSelect_'20880f9c05d68a'`)
そして、まったく当然のことですが、明らかにクエリは無効です。
編集:詳細
ユーザーが選択する基準によっては、クエリがより大きなクエリの一部になる場合があります。例えば
$sql = "select albumid from albums where albumid in(select albumid from tags where tag = ?) AND albumid in(select albumid from albumSelect_?)";
これを機能させる方法があるのか、それとも誰かがより良い代替案を提案できるのか、私はただ疑問に思っていました。テーブル名の連結は明らかにオプションではありません。
前もって感謝します!
デイブ