PHP在循环中“一个接一个”地替换字符串中的字符

svmlkihl  于 2022-12-28  发布在  PHP
关注(0)|答案(3)|浏览(170)

存在具有未知数量参数(动态构建)的MySQL查询,其格式如下:

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中实现这一点。
另外,除了按顺序替换它们之外,我还需要向数组添加参数:

$parameters['user0'] = $user;
$parameters['user1'] = $user;
$parameters['user2'] = $user;
ctehm74n

ctehm74n1#

你在做一件非常奇怪的事。
首先,没有一个单一的理由来合并不同的占位符,只是使它

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));
4ktjp1zp

4ktjp1zp2#

<?php

函数字符串替换($st_r,$rep,$strg){

for ($i=0; $i < strlen($strg); $i++) { 

    if ($strg[$i]==$st_r) {
        $strg[$i] = $rep;
    }
}
return $strg;

}回声字符串替换(“m”,“0”,“malamm”);//0ala00

2hh7jdfx

2hh7jdfx3#

我一直在寻找:

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

它将准确地返回所需的内容。

相关问题