php - pg_query_params 不替换查询中的参数
问题描述
我希望我的应用程序根据它是在本地机器、登台环境还是生产环境上运行来动态更改它使用的数据库和模式名称。我认为 pg_query_params 将是一个不错的选择,因为您可以通过参数化它们来动态地将事物替换到您的查询中。这个想法是将模式名称动态插入到查询中。但是, pg_query_params() 似乎没有替换数组中的值,从而导致查询语法错误。
我已经通过使用 pg_query 和硬编码模式名称而不是参数化它来验证查询本身是有效的。当我查看日志时,我看到以下错误:
PHP 警告:pg_query_params():查询失败:错误:“$1.Line 2 FROM $1.module__c 处或附近的语法错误”
因此,显然, pg_query_params 实际上并没有替换参数(至少从我所见)
结果,pg_query_params() 返回 false,并破坏了整个页面。
代码首先从我的 databaseInfo() 函数中获取一个数组(它为模式名称和连接资源返回一个数组。我已经验证我的这部分代码正在工作并返回预期的信息。
$database = databaseInfo();
if (isset($projSFID)) {
$placeholder = $projSFID;
$query = "SELECT $1.module__c.name, $1.module__c.module_title__c, $1.module__c.number_of_units__c, $1.module__c.duration_minutes__c, $1.module__c.module_bg_hex__c, $1.module__c.module_description__c, $1.lms_asset__c.lms_asset_url__c
FROM $1.module__c
INNER JOIN $1.teproject__c ON $1.module__c.associated_project__c = $1.teproject__c.sfid
INNER JOIN $1.lms_asset__c ON $1.module__c.module_image_url__c = $1.lms_asset__c.sfid
WHERE $1.teproject__c.sfid = $2 AND $1.module__c.published__c=TRUE";
} elseif (isset($trackSFID)) {
$placeholder = $trackSFID;
$query = "SELECT $1.module__c.name, $1.module__c.module_title__c, $1.module__c.number_of_units__c, $1.module__c.duration_minutes__c, $1.module__c.module_bg_hex__c, $1.module__c.module_description__c, $1.lms_asset__c.lms_asset_url__c
FROM $1.module_track_association__c
INNER JOIN $1.module__c ON $1.module_track_association__c.module__c = $1.module__c.sfid
INNER JOIN $1.track__c ON $1.module_track_association__c.track__c = $1.track__c.sfid
INNER JOIN $1.lms_asset__c ON $1.module__c.module_image_url__c = $1.lms_asset__c.sfid
WHERE $1.track__c.sfid = $2
ORDER BY $1.module_track_association__c.navigation_sequence__c";
} else {
$placeholder = '';
$query = "SELECT $1.module__c.name, $1.module__c.module_title__c, $1.module__c.number_of_units__c, $1.module__c.duration_minutes__c, $1.module__c.module_bg_hex__c, $1.module__c.module_description__c, $1.lms_asset__c.lms_asset_url__c
FROM $1.module__c
INNER JOIN $1.lms_asset__c ON $1.module__c.module_image_url__c = $1.lms_asset__c.sfid
WHERE $1.module__c.published__c=TRUE AND $1.module__c.display_on_frontend_filtered_only__c=FALSE $2";
echo $query;
}
$result = pg_query_params($database['connection'], $query, array($database['schema'],$placeholder));
预期结果是 $1 将是模式的名称,$2 将是占位符的值,由条件逻辑确定。
解决方案
推荐阅读
- c# - 如何使用c#从sql中的整数类型列中获取Null值
- r - 将已发布系统发育的图像转换为 R 中的 newick 格式
- java - 如果一个代理关闭,流应用程序中的 KafkaStream EXACTLY_ONCE 会导致无法重新平衡
- typescript - 打字稿在内置对象和其他对象之间导出相同的接口名称
- javascript - 与返回语句混淆
- django - Django ManytoManyField 显示用户配置文件
- angular - 如何获取嵌套表单组控件
- asciidoc - 如何将 umlet 与 asciidoctor-diagram 一起使用?
- sql - 在查询中并排组合访问 sql 表
- javascript - React:axios.interceptors 不能在 hoc 中工作