2014-02-23 69 views
0

有MySQL查询未知号码的格式如下参数(动态生成):PHP替换字符在循环中的字符串“一个接一个”

SELECT * FROM actions WHERE user1 = ? AND user10 = ? AND user11 = ? AND time = :time 

由于我使用的PDO准备声明,我不能在一个查询中混合使用名称和位置参数。所以我需要用命名参数连续地重新显示所有问号。我有一个Array()保存这些参数:

$parameters = Array(); 
$parameters['time'] = 1234567; 

现在我需要更换每一个问号顺序命名的参数,所以查询将如下所示:

SELECT * FROM actions WHERE user1 = :user0 AND user10 = :user1 AND user11 = :user2 AND time = :time 

而且$parameters将包含每命名参数在它。我需要在查询字符串中找到每个“?”,并循环出现,并用递增字符串替换它们。在JavaScript中,我将使用正则表达式来查找?并将它们传递给一个函数,该函数将有一个全局增量变量来跟踪当前命名参数号,但我不知道如何在PHP中执行此操作。

P.S.除了顺序替换他们,我还需要参数添加到数组:

$parameters['user0'] = $user; 
$parameters['user1'] = $user; 
$parameters['user2'] = $user; 
+0

有没有用户确实一样?为什么那一切都是那样的?只需要一个占位符。 –

+0

@YourCommonSense SQLSTATE [HY093]:无效的参数编号:绑定变量的数量与令牌数量不匹配# – Xeos

+0

[使用for循环构建数据库查询]的可能重复(http://stackoverflow.com/questions/21368594/ building-db-query-with-a-for-loop) –

回答

-1

所有我一直在寻找:

$count = 0; 
preg_replace_callback(
    "/\\?/", 
    function ($matches) { 
     global $count; 
     return ':user' . (++$count); 
    }, 
    $query_string 
); 

这将返回需要的到底是什么。

1

你正在做的事情非常奇怪

首先,组合不同占位符的原因并不多。只要做到这一点

AND time = ? 

然后只是执行。

然而,如果您想要命名参数 - 在您构建查询的同时添加它们。 显然,user1 = ? AND user10 = ? AND user11 = ?正在动态构建。为什么不只是同时添加指定的占位符?

顺便说一句,如果你有相同的变量绑定到所有的标记,然后只需使用单一命名占位所有

WHERE user1 = :user AND user10 = :user AND user11 = :user AND time = :time 

然后打开仿真模式关闭,然后用

$stmt->execute(array('user'=>$user,'time'=>123)); 
执行
+0

我试过'array('user'=> $ user,'time'=> 123)',但它没有奏效。仿真模式是什么意思? – Xeos

+0

该查询是从数组和if()语句构建的,因此很难知道将出现多少个问号以及它们将以何种顺序出现。 – Xeos

相关问题