11

テーブル名をバインドすることは可能ですか?

テーブルから列を読み取るクラスを作成し、フィールドタイプに応じて、フォーム入力を生成したいと思います。私がそうするとき$form = new form("users");、コンストラクターは次のコードでテーブルからフィールド名を取得することから始めることになっています:

class form{

    public function __construct($table, $skip = array("id")){
        $pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS);

        $query = $pdo->prepare("DESCRIBE :table");

        $query->bindValue(':table', $table, PDO::PARAM_STR, strlen($table));

        $query->execute();

        while($field = $query->fetch(PDO::FETCH_NUM)){
            var_dump($field);
            echo "<br /><br />";
        }

        unset($pdo);
    }
}

これは、prepareステートメントで「:table」の代わりに「users」を指定すると問題なく機能しますが、バインドは機能しており、テーブル名をバインドしようとしているためだと確信しています。また、テーブル名などを渡すことができるようにしたいので、これをバインドする必要があります$_GET

4

2 に答える 2

9

テーブル名をバインドすることは可能ですか?

いいえ。

テーブル名をホワイトリストに登録する必要があります。ユーザーがデータベースから任意のテーブルを参照できるようにしたいとは思いません。

また、識別子も手動でフォーマットする必要があります。例のタグwikiがあります。最初に読んでみませんか?

更新: ご覧のとおり、PDO は実際のタスクには不便であることが判明しました。そのため、MySQL クエリを処理するには、よりインテリジェントな抽象化ライブラリが必要です。コードを劇的に短くするsafeMysqlクラスを使用した例を次に示します。

class form{
    public function __construct($table){
        global $db;
        return $db->getAll("DESCRIBE ?n", $table);
    }
}

2 メモ:

  • 関数にそれを使用するコードがないため、2 番目のパラメーターを削除しました。
  • クラスでは絶対に接続しないでください。代わりに、すでに開いている接続を使用してください。または、非常に多くの接続で MySQL サーバーを停止します。

実装されたバージョンを除外

class form {
    public function __construct($table,$skip = array("id")){
        global $db;
        $data = array();
        $res = $db->query("DESCRIBE ?n", $table);
        while($row = $db->fetch($res)) {
            if (!in_array($row['Field'],$skip)) {
                $data[] = $row;
            }
        }
        return $data;
    }
}

ただし、そのようなクラスが意図したとおりに使用されることはめったにありません。使用できるようにするために、多くの例外と手動の書式設定が常にあります。

于 2013-03-03T05:57:52.620 に答える
2

これを行うことができるhttp://www.phpclasses.org/package/5997-PHP-Database-access-abstraction-layer.htmlに PDO ラッパー クラスがあります (ただし、私は PDO を初めて使用するので、使用していない可能性があります作成済みステートメント)

彼の提案する使用法は次のとおりです。

 $db = new DatabaseConnection('someMysqlServer', 'user', 'pass', 'database');

 $result = $db->exec($db->filterForSql('SELECT * FROM '.$tableName.';'));

これが PDO を使用する「安全な」方法であると他の人が考えるかどうかに興味があります。

于 2013-03-03T06:42:30.357 に答える