В моем коде есть следующая функция.
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.