的其餘部分分離我有一個PDO準備語句看起來像這樣:如何將PDO命名的佔位符從一個字符串
$STH = $DBH->("CREATE TABLE :prefixbase (table_structure)");
:前綴應userprefix_
更換。生成的SQL應如下所示:CREATE TABLE userprefix_base(table structure)
。我怎樣才能將佔位符與字符串的其餘部分分開?
的其餘部分分離我有一個PDO準備語句看起來像這樣:如何將PDO命名的佔位符從一個字符串
$STH = $DBH->("CREATE TABLE :prefixbase (table_structure)");
:前綴應userprefix_
更換。生成的SQL應如下所示:CREATE TABLE userprefix_base(table structure)
。我怎樣才能將佔位符與字符串的其餘部分分開?
我想你需要在你的字符串上使用正則表達式或簡單的查找替換,這種處理之後可以被PDO對象用作正確的SQL命令。
下面是一個例子:
$subject = "CREATE TABLE :prefixbase(table_structure)";
$sql = preg_replace('/(:prefix)/', 'userprefix_', $subject);
// or
$sql = str_replace(':prefix', 'userprefix_', $subject);
P.S.我希望我能正確理解你的請求。
你說得對。選擇這個答案是因爲我個人認爲它比DanMan發佈的解決方案更清潔。還有一個問題,如果我從客戶端輸入中得到''userprefix_'',我不得不對SQL注入進行清理,因爲它不再受到PDO語句的保護。或者我錯了?謝謝! – wowpatrick 2011-06-12 01:43:13
@wowpatrick是的,你需要清理它,你需要在任何情況下這樣做,因爲它是一個用戶輸入。雖然在這個階段(項目設置)很不可能有人會搞砸它,但最好不要冒險(你永遠不知道誰可以訪問設置文件)。要清理表前綴,您需要刪除所有不是字母,數字或下劃線的字符。 – LazyOne 2011-06-12 08:57:09
只要不使用正則表達式,如果你不是絕對需要它們的話。他們總是比簡單的替換慢。 – DanMan 2011-06-12 19:56:33
如何:
$placeholder="userprefix_";
$stmt = $pdo->prepare("CREATE TABLE ".$placeholder."base (table_structure)");
除非該前綴應該已經準備語句後更改。如果不準備另一份聲明,這將行不通。
1+:也可以和LazyOne發佈的解決方案一樣好,但正如我所說的,我個人喜歡他的答案。 – wowpatrick 2011-06-12 01:45:00
感謝您的支持。海事組織最好避免函數調用,但如果可能的話,但YMMV。 – DanMan 2011-06-12 20:00:54
PDO不支持爲動態表和字段名稱準備的語句,所以你想要做的事情可能無法正確執行 – 2011-06-11 17:25:58