我有一个数组:
$arr = [5, "David"];
我有一个查询:
$query = "SELECT * FROM users WHERE user_id = ? AND user_name = ?";
我想创建一个记录器查询,该查询使用这2个记录并手动返回查询。
logger($query, $arr); // returns : SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'
我正在使用雄辩的胶囊管理员。
我试图做这样的事情,但它并不能代替任何东西:
function logger($query, $arr) {
foreach($arr as $a) {
is_numeric($a) ? str_replace("?",$a,$query) : str_replace("?","'".$a."'",$query);
}
return $query;
}
为什么此代码不起作用?
答案 0 :(得分:2)
str_replace
不会修改其参数,而是返回修改后的值。因此,您需要将其输出分配给变量。但是,问题在于str_replace
将同时替换所有出现的模式。相反,您可以使用preg_replace
,它具有一个limit
参数,该参数可用来告诉它为每个调用仅替换一次出现的模式。我为preg_replace
使用了一种模式,该模式将确保在查询中仅替换?
本身,以防万一在其他地方有问号,例如在列别名中。将功能更改为此:
function logger($query, $arr) {
foreach($arr as $a) {
$query = is_numeric($a) ?
preg_replace("/(?<=\s)\?(?=\s|$)/", $a, $query, 1) :
preg_replace("/(?<=\s)\?(?=\s|$)/", "'$a'", $query, 1);
}
return $query;
}
输出:
SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'
答案 1 :(得分:1)
我通过使用System.Collections.Generic
并将值辅助为变量来了解如何做到这一点。
using System;
using System.Collections.Generic;
namespace TextProcessor
{
class App
{
static void Main(string[] args)
{
HashSet<string> set = new HashSet<string>();
SortedSet<string> sortedset = new SortedSet<string>();
Console.ReadKey();
}
}
}
str_replace_first
:
foreach($params as $a) {
$query = is_numeric($a) ? str_replace_first("?",$a,$query,1) : str_replace_first("?","'".$a."'",$query);
}
return $query;