2010-09-08 42 views
4

當我使用的是PDO準備好的語句,並用它在一個表名插上失敗的查詢,一個簡單的例子:PHP/PDO:準備好的語句在創建表時不起作用?

$stmt = $dbh->prepare("CREATE TABLE ? (id foo, int bar,...)"); 
$stmt->execute(Array('table_foobar')); 

它所做的就是替換?'table_foobar',單引號不要不允許爲我創作桌子!

我最終需要在準備語句的TOP上做一個sprintf以添加一個預定義的表名。

我到底在想什麼?

+1

我*認爲*表名不能被參數化。我會看看我是否可以得到任何硬文檔 – 2010-09-08 08:23:34

+0

我從來沒有見過參數類型轉換('id foo')。 – 2010-09-08 08:47:00

回答

9

我能找到什麼明確的手冊中,但看着用戶供稿注意,使用的參數是用於實際只,而不是表名,字段名等

普通字符串連接應(並且可以)被使用。

$tablename = "tablename"; 
$stmt = $dbh->prepare("CREATE TABLE `$tablename` (id foo, int bar,...)"); 
+1

這就是我一直在談論的東西(當然,無聊的人都會死,呵呵)當有人聲稱「準備好的語句是100%安全的」 – 2010-09-08 08:43:02

+0

@Col true - 如果你需要*使用動態表名,它應該被轉義不知何故 - 如果我正確地看到PDO,沒有明確的'escape'功能!因爲,你不再需要這個了。因爲,這就是你有參數化查詢。 – 2010-09-08 08:53:36

+0

我一直使用'sprintf',因爲我在'define'中定義了表名,所以我將它改成了一個可以完成的變量。 – John 2010-09-08 09:06:01

0

如果您要創建一個動態表,這很可能意味着你不明白的關係型數據庫的思想,結果做錯了什麼。
只需從應用程序設置中創建所有表,然後在運行時就不創建任何表。

根本不需要使用動態表名。

+2

好點,儘可能遵循,但我可以看到動態表名稱的一個用例:允許用戶指定的前綴「appname_tablename」將多個安裝/應用程序合併到一個數據庫中的可再分發應用程序 - 在託管環境中有時是必需的。 – 2010-09-08 08:50:12

+0

這是應用程序設置的一部分,我純粹是指由網站管理員設置的表名,不幸的是選擇了定義,但是需要sprintf。現在使用變量修復。 – John 2010-09-08 09:07:32

+1

正確的做法是,在開始時創建所有表,而不是動態創建。但這是更一般的情況。例如,對於select語句,你也會遇到這個問題。 'SELECT * FROM?'也不起作用,所以如果他不動態創建表格,問題甚至會持續存在:) – 2010-09-08 09:09:54