2011-06-11 45 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