pg_query_params не подставляет параметры в запрос - PullRequest
0 голосов
/ 11 января 2019

Я хочу, чтобы мое приложение динамически изменяло, какую базу данных и имя схемы оно использует, в зависимости от того, работает ли оно на локальном компьютере, в промежуточной среде или на производстве. Я подумал, что 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 будет значением заполнителя, как определено условной логикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...