php - 如何在可能具有 % 的格式字符串的一部分中转义 sprintf 说明符
问题描述
编码:
<?php
$tableName = 'users';
$position = 1;
$paths = ['index'];
$sqlFormat = "SELECT * FROM %s WHERE (";
for ($i =0; $i < count($paths); $i++){
if ($i == (count($paths)-1)){
$sqlFormat .= "path LIKE '%%$paths[$i]%%') ";
}
else{
$sqlFormat .= "path LIKE '%%$paths[$i]%%' OR ";
}
}
$sqlFormat .= "AND (position = $position) AND published = 'Y' ";
$sqlFormat .= "ORDER BY weight ASC";
$sql = sprintf($sqlFormat, $tableName);
echo $sql;
症状:
当$paths
数组包含普通字符串时,它可以正常工作。但是,如果我们设置它的路径,$paths = ['index%'];
则会生成PHP Warning: sprintf(): Too few arguments...
. 换句话说,如果$paths
包含值有%
符号。在这种情况下我无法使用%%
转义,like 发生在上面 SQL 的 like 子句中,...LIKE '%%$paths[$i]%%...
因为$paths
可能包含%
可选的。
我无法找到一种方法来让可选转义(%
如果存在)。所有类似的问题都谈论转义固定值
解决方案
我找到了一个解决方案,方法是使用str_replace()
for 数组的元素逐个paths
替换来解决问题:%
%%
$sqlFormat .= "path LIKE '%%".str_replace('%','%%',$paths[$i])."%%') ";
因此,如果元素包含任何单个元素,则会通过将其加倍%
来进行转义。sprintf
推荐阅读
- julia - 我有一个 DataFrame,我需要它所需的格式。我在下面提供更多详细信息
- react-native - 我如何在本机反应中直接将 blob 写入文件
- flutter - 构建颤振应用程序时出错:此构造函数未初始化最终字段“licenseEntries”。在 about.dard Flutter SDK
- fonts - 如何使用 Alt+code 而不是默认 (ASCII) 字符输出我的字体字符?
- android - 无法启动 Android 12 AVD,但可以启动 Android 11 AVD
- windows - 如何在 git 的分支上列出删除或修改的特定扩展名的所有文件的日志?
- javascript - 根据 React 中的特定内容渲染 Modal Content
- vuejs3 - Vue 3 -> 自定义 v-title 指令(将组件包装在其他组件中)
- java - 使用我的 DicomViewer 在 java 中启动新 Activity 导致 Android Studio 崩溃
- java - 使用通过jtable从mysql获取多个数据