为什么此带参数的sqlsrv查询不起作用?

时间:2019-01-09 16:19:09

标签: php sql sqlsrv

我的代码中具有以下功能。

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查询,它工作正常。主要区别在于参数在手动执行时需要带引号才能起作用。我假设sqlsrv_query的param参数以可以满足此要求的方式进行处理,但是我也尝试了以下具有相同空白结果的查询:

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

“ search.txt”错误日志未显示任何内容,其他任何Apache或php日志也未显示。

你知道是什么原因造成的吗?

编辑:

我也尝试了以下排列:

$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 :(得分:0)

在查询中带引号的字符串中不会替换参数。您需要使用串联构建字符串。

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

答案 1 :(得分:0)

此版本的查询有效:

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