2011-06-11 62 views
0

的其餘部分分離我有一個PDO準備語句看起來像這樣:如何將PDO命名的佔位符從一個字符串

$STH = $DBH->("CREATE TABLE :prefixbase (table_structure)"); 

:前綴應userprefix_更換。生成的SQL應如下所示:CREATE TABLE userprefix_base(table structure)。我怎樣才能將佔位符與字符串的其餘部分分開?

+2

PDO不支持爲動態表和字段名稱準備的語句,所以你想要做的事情可能無法正確執行 – 2011-06-11 17:25:58

回答

3

我想你需要在你的字符串上使用正則表達式或簡單的查找替換,這種處理之後可以被PDO對象用作正確的SQL命令。

下面是一個例子:

$subject = "CREATE TABLE :prefixbase(table_structure)"; 

$sql = preg_replace('/(:prefix)/', 'userprefix_', $subject); 
// or 
$sql = str_replace(':prefix', 'userprefix_', $subject); 

P.S.我希望我能正確理解你的請求。

+0

你說得對。選擇這個答案是因爲我個人認爲它比DanMan發佈的解決方案更清潔。還有一個問題,如果我從客戶端輸入中得到''userprefix_'',我不得不對SQL注入進行清理,因爲它不再受到PDO語句的保護。或者我錯了?謝謝! – wowpatrick 2011-06-12 01:43:13

+0

@wowpatrick是的,你需要清理它,你需要在任何情況下這樣做,因爲它是一個用戶輸入。雖然在這個階段(項目設置)很不可能有人會搞砸它,但最好不要冒險(你永遠不知道誰可以訪問設置文件)。要清理表前綴,您需要刪除所有不是字母,數字或下劃線的字符。 – LazyOne 2011-06-12 08:57:09

+0

只要不使用正則表達式,如果你不是絕對需要它們的話。他們總是比簡單的替換慢。 – DanMan 2011-06-12 19:56:33

1

如何:

$placeholder="userprefix_"; 
$stmt = $pdo->prepare("CREATE TABLE ".$placeholder."base (table_structure)"); 

除非該前綴應該已經準備語句後更改。如果不準備另一份聲明,這將行不通。

+0

1+:也可以和LazyOne發佈的解決方案一樣好,但正如我所說的,我個人喜歡他的答案。 – wowpatrick 2011-06-12 01:45:00

+1

感謝您的支持。海事組織最好避免函數調用,但如果可能的話,但YMMV。 – DanMan 2011-06-12 20:00:54