pg_query_params不能替代查询中的参数

时间:2019-01-11 20:08:31

标签: php postgresql pg-query

我希望我的应用程序根据它运行在本地计算机,登台环境还是生产环境上,动态更改它使用的数据库和架构名称。我认为pg_query_params是一个不错的选择,因为您可以通过参数化将其动态替换为查询。这个想法是将架构名称动态插入查询中。但是,pg_query_params()似乎没有替代数组中的值,从而导致查询语法错误。

我已经通过使用pg_query验证了查询本身是有效的,并且对模式名称进行了硬编码而不是对其进行参数化。查看日志时,看到以下错误:

PHP警告:pg_query_params():查询失败:错误:语法错误在“ $ 1。第2行从$ 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将是占位符的值(由条件逻辑确定)。

0 个答案:

没有答案