Почему этот sqlsrv запрос с параметрами не работает? - PullRequest
0 голосов
/ 09 января 2019

В моем коде есть следующая функция.

private function getFormsOfWords($search){

    $query = "SELECT display_term, source_term, occurrence FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, ?)', 2057, 0, 0)";

    $stmt = sqlsrv_query($this->db, $query, array($search));

    if( $stmt === false ) {
        file_put_contents(LOG_DIR.'/search.txt', print_r(sqlsrv_errors(),true), FILE_APPEND);
        die();
    }
    $highlight_words = array();
    while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
        $highlight_words[] = $row['display_term'];
    }

    return $highlight_words;
}

Проблема в том, что когда я попадаю в часть sqlsrv_fetch_array, я не получаю никаких результатов.

Отладчик показывает, что переменная $ search заполнена и строка sqlsrv_fetch_array достигнута.

Все остальные запросы, которые я выполнял таким же образом, успешно дали результаты после выполнения sqlsrv_fetch_array.

Я протестировал запрос $ highlight_words_SQL в самой базе данных с подставленным вручную параметром, и он отлично работает. Основное различие заключается в том, что параметр должен заключаться в кавычки, чтобы работать при выполнении вручную. Я предполагаю, что аргумент param sqlsrv_query обрабатывается таким образом, чтобы справиться с этим требованием, но я также пробовал следующий запрос с тем же пустым результатом:

$query = "SELECT display_term, source_term, occurrence FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, \"?\")', 2057, 0, 0)";

В журнале ошибок «search.txt» ничего не отображается, равно как и в других журналах apache или php.

Есть идеи, что вызвало это?

EDIT:

Я пробовал также следующие перестановки:

$query = "SELECT display_term, source_term, occurrence 
            FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL,' + ? + ')', 2057, 0, 0)";
//Syntax error near 'initialized' in the full-text search condition 'FORMSOF(INFLECTIONAL,security initialized)'.

$query = "SELECT display_term, source_term, occurrence 
            FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL,' + \"?\" + ')', 2057, 0, 0)";
//Invalid column name '?'

$query = "SELECT display_term, source_term, occurrence 
            FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL,\'' + \"?\" + '\')', 2057, 0, 0)";
//Incorrect syntax near '\'.

Это:

SELECT display_term, source_term, occurrence 
  FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, '+'"security initialized"'+')', 2057, 0, 0)

или это:

SELECT display_term, source_term, occurrence 
  FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL, "security initialized")', 2057, 0, 0)

являются целями, поскольку они являются запросами, которые работают в SSMS.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Эта версия запроса работала:

$query = "SELECT display_term, source_term, occurrence 
            FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL,\"' + ? + '\")', 2057, 0, 0)";
0 голосов
/ 09 января 2019

Параметры не заменяются внутри строк в кавычках в запросе. Вам нужно построить строку, используя конкатенацию.

$query = "SELECT display_term, source_term, occurrence 
            FROM sys.dm_fts_parser('FORMSOF(INFLECTIONAL,' + ? + ')', 2057, 0, 0)";
...