2

PHP と PDO を使用して MySQL テーブルを作成したいと考えています。また、テーブル名をパラメータ化したいと考えています。私はすでにこれを実装しようとしましたが、エラーのあるコードを以下に示します。

class databaseaccess {

    public $hostname = 'localhost';
    public $username = 'root';
    public $password = 'root';
    private $db = null;
    public $rows;

    public function __construct() {
        try {
                $this->db = new PDO("mysql:host=$hostname;dbname=noteshareproject", $this->username, $this->password);
        }
        catch (PDOException $Exception) {
            throw new Exception("DB failed to connect ".$Exception->getMessage());
        }
    }

    public function writetable($title,$id){
        if ($this->db === null) throw new Exception("DB is not connected");
        //query works with `:title` however keeps the commas. Gotta find out what is wrong.
        $query = "CREATE TABLE noteshareproject.:title (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), username VARCHAR(20)) ENGINE=myISAM;";
        $statement = $this->db->prepare($query);
        $title = $title . $id;
        $title = (string) $title;
        $statement->bindValue(':title', $title, PDO::PARAM_STR);
        $statement->execute();
        print_r($statement->errorInfo());
        echo $title;

    }
}

上記のコードの出力は次のとおりです。

Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''exampletablename'(id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), username VARCHAR(20)) EN' at line >2
)
exampletablename

MySQL 構文または PDO 実装で何が間違っていましたか?

4

1 に答える 1

6

識別子 (列/テーブル/データベース/関数名など) の準備済みステートメントでプレースホルダーを使用することはできません。これらは値にのみ使用できます。

CREATE TABLE noteshareproject.:title
//                            ^^^^^^ this will not work

$titleこれを行う場合は、文字列で直接使用できるように、手動でサニタイズする必要があります。

などのDDLCREATE TABLEステートメントは準備できないため、 を使用しても意味がないことにも注意してくださいprepare()query()またはを使用することもできますexec()

また、あなたがこれをしたいという事実は、データベース設計が不十分であることを示しているのだろうかと思います.アプリケーションは確かに言うことは不可能です。

于 2012-10-16T08:57:22.000 に答える