Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP SQLSRV-参数化时全文查询不工作_Php_Sql Server_Sqlsrv - Fatal编程技术网

PHP SQLSRV-参数化时全文查询不工作

PHP SQLSRV-参数化时全文查询不工作,php,sql-server,sqlsrv,Php,Sql Server,Sqlsrv,当我通过PHP sqlsrv驱动程序运行以下查询时,不会出现错误,但也不会返回任何行。。。若我去掉问号(应该是参数)并插入关键字,那个么它会返回很好的行 SELECT DISTINCT MAX(i.ID) AS ID, i.ItemLookupCode, MAX(i.DepartmentID) AS DepartmentID, MAX(i.CategoryID) AS CategoryID, MAX(i.Quantity) AS Quantity, MAX(CAST(i.

当我通过PHP sqlsrv驱动程序运行以下查询时,不会出现错误,但也不会返回任何行。。。若我去掉问号(应该是参数)并插入关键字,那个么它会返回很好的行

SELECT DISTINCT
  MAX(i.ID) AS ID,
  i.ItemLookupCode,
  MAX(i.DepartmentID) AS DepartmentID,
  MAX(i.CategoryID) AS CategoryID,
  MAX(i.Quantity) AS Quantity,
  MAX(CAST(i.Notes AS varchar(max))) AS Notes,
  MAX(CONVERT(varchar(30), i.Price, 1)) AS Price,
  MAX(i.SaleType) AS SaleType,
  MAX(i.SaleStartDate) AS SaleStartDate,
  MAX(i.SaleEndDate) AS SaleEndDate,
  MAX(CONVERT(varchar(30), i.SalePrice, 1)) AS SalePrice,
  MAX(i.PictureName) AS PictureName,
  MAX(n.SpoofStock) AS SpoofStock,
  MAX(n.PAM_Brand) AS Brand

FROM Item AS i

LEFT JOIN nitroasl_pamtable AS n
  ON i.ID = n.ItemID

WHERE CONTAINS(
  (i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription),
  '? AND ?')

OR CONTAINS(
  (n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords),
  '? AND ?')

AND ( i.WebItem = 1 AND i.Price > 0 )

GROUP BY i.ItemLookupCode

ORDER BY i.ItemLookupCode ASC
我已经验证了我的参数数组是正确的。。。以下是我的脚本:

require LIBRARY_PATH . "/connect-db.php";

$tsql = "SELECT DISTINCT
          MAX(i.ID) AS ID,
          i.ItemLookupCode,
          MAX(i.DepartmentID) AS DepartmentID,
          MAX(i.CategoryID) AS CategoryID,
          MAX(i.Quantity) AS Quantity,
          MAX(CAST(i.Notes AS varchar(max))) AS Notes,
          MAX(CONVERT(varchar(30), i.Price, 1)) AS Price,
          MAX(i.SaleType) AS SaleType,
          MAX(i.SaleStartDate) AS SaleStartDate,
          MAX(i.SaleEndDate) AS SaleEndDate,
          MAX(CONVERT(varchar(30), i.SalePrice, 1)) AS SalePrice,
          MAX(i.PictureName) AS PictureName,
          MAX(n.SpoofStock) AS SpoofStock,
          MAX(n.PAM_Brand) AS Brand

        FROM Item AS i

        LEFT JOIN nitroasl_pamtable AS n
          ON i.ID = n.ItemID

        WHERE CONTAINS(
          (i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription),
          '? AND ?')

        OR CONTAINS(
          (n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords),
          '? AND ?')

        AND ( i.WebItem = 1 AND i.Price > 0 )

        GROUP BY i.ItemLookupCode

        ORDER BY i.ItemLookupCode ASC";

// Allows us to determine the number of rows returned
$cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);

$stmt = sqlsrv_query( $conn, $tsql, $params, $cursorType );

if ( !$stmt )
{
  die( FormatErrors( sqlsrv_errors() ) );
}

if( sqlsrv_has_rows( $stmt ) )
{
  while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
  {
    $results[] = $row;
  }
}

sqlsrv_free_stmt( $stmt );

require LIBRARY_PATH . "/disconnect-db.php";
对于上述脚本,参数数组如下所示:

Array
(
  [0] => displayport
  [1] => hdmi
  [2] => displayport
  [3] => hdmi
)
请注意,我会根据解析的关键字数量动态创建填充
“?”和“?”
的字符串。我验证了字符串是正确的,上面反映了它们将产生什么


那么,这不是一个有效的参数化sqlsrv查询吗?

CONTAINS子句的第二个参数是您应该参数化的参数

本部分:

WHERE CONTAINS(
  (i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription),
  '"?" AND "?"')

OR CONTAINS(
  (n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords),
  '"?" AND "?"')
应该这样写:

WHERE CONTAINS(
  (i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription),
  ?)

OR CONTAINS(
  (n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords),
  ?)
假设您的
$params
如下所示:

 $params = ['a', 'b', 'c', 'd']
然后它应该看起来像:

 $params = [
   '"a" AND "b"', 
   '"c" AND "d"'
 ]

你不应该在查询中的
周围加引号。@Kenney-我没有加引号,没有骰子。仍然返回0行…就在buddy上!谢谢你的帮助。将我的参数转换为此格式修复了我的问题!