2012-10-16 103 views
2

我想用PHP和PDO創建一個MySQL表。我也希望參數化表名。我已經試圖實現這個,錯誤代碼如下所示。我可以使用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實現?

+0

您是否嘗試過手動查詢? –

回答

5

您不能在準備好的語句中使用佔位符作爲標識符(列/表/數據庫/函數名稱等)。您只能將它們用於值。

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

您必須手動消毒$title所以可以直接在字符串中使用,如果你想這樣做。

還請注意,DDL聲明,如CREATE TABLE不能準備,所以使用prepare()沒有意義。您可能只需使用query()exec()

我也懷疑你是否想要這樣做的事實是一個糟糕的數據庫設計的指標 - 對於多個相同結構的表的要求不太可能是存儲您的信息的正確方法,儘管沒有知道更多關於你的應用程序,這是不可能肯定的說。

+0

謝謝你。我將考慮您的數據庫設計技巧。 –

相關問題