0

我希望我的应用程序根据它是在本地机器、登台环境还是生产环境上运行来动态更改它使用的数据库和模式名称。我认为 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 将是占位符的值,由条件逻辑确定。

4

0 回答 0