php - 从数组值替换字符串中的某些字符
问题描述
我有一个数组:
$arr = [5, "David"];
我有一个查询:
$query = "SELECT * FROM users WHERE user_id = ? AND user_name = ?";
我想创建一个记录器查询,它采用这两个并手动返回查询。
logger($query, $arr); // returns : SELECT * FROM users WHERE user_id = 5 AND user_name = 'David'
我正在使用 eloquent 的胶囊管理器。
我尝试做这样的事情,但它不能代替任何东西:
function logger($query, $arr) {
foreach($arr as $a) {
is_numeric($a) ? str_replace("?",$a,$query) : str_replace("?","'".$a."'",$query);
}
return $query;
}
为什么这段代码不起作用?
解决方案
str_replace
不修改其参数,而是返回修改后的值。所以你需要将它的输出分配给一个变量。然而问题是它str_replace
会同时替换所有出现的模式。相反,您可以使用preg_replace
,它有一个limit
参数,可以用来告诉它每次调用只替换一次出现的模式。我使用了一种模式preg_replace
,以确保仅?
替换查询中的 a ,以防其他地方(例如列别名)中存在问号。将您的功能更改为:
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'
推荐阅读
- python - 从一列创建多列(具有相同的数据)
- c# - 未完全收集 RTF 电子邮件的 Exchange EWS API 嵌入式附件
- next.js - 如何将我的 Ghost 博客的 AMP 版本获取到我的 Next.js 项目中
- amazon-web-services - 当工作节点完成时,Spring 云任务是否处理 Kubernetes pod 的自动关闭
- reactjs - 如何在 reactjs 中创建嵌套手风琴
- angular - 如何在chart.js画布Angular 12中垂直旋转圆环图切片中的标签文本?
- python - 用户输入停止 while 循环
- html - 如何使复选框可从其标签中单击
- perl - 使用 Perl 查找字符串中字母的所有组合/排列
- microsoft-graph-api - 当用户与团队消息中的自适应卡交互时如何发送用户标识