PHP SQLSRV – La requête de text intégral ne fonctionne pas lorsque paramétrée

Lorsque je lance la requête suivante via le pilote PHP sqlsrv, aucune erreur ne se produit, mais aucune ligne n'est renvoyée non plus … Si je me débarrasse des points d'interrogation (supposés être des parameters) et insère des mots keys, .

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 

J'ai vérifié que mon tableau de parameters est correct … Voici mon script:

 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"; 

Le tableau de parameters ressemble à ceci pour le script ci-dessus:

 Array ( [0] => displayport [1] => hdmi [2] => displayport [3] => hdmi ) 

Veuillez noter que je crée dynamicment des strings qui peuplent le "?" AND "?" "?" AND "?" en fonction du nombre de mots-keys analysés. J'ai vérifié que les strings sont correctes, et ce qui précède reflète ce qu'elles produiraient.

SO, n'est-ce pas une requête sqlsrv paramétrée valide?

Le deuxième paramètre de la clause CONTAINS est ce que vous devez paramétrer.

Cette partie:

 WHERE CONTAINS( (i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription), '"?" AND "?"') OR CONTAINS( (n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords), '"?" AND "?"') 

devrait être écrit comme:

 WHERE CONTAINS( (i.ItemLookupCode, i.Notes, i.Description, i.ExtendedDescription), ?) OR CONTAINS( (n.PAM_Brand, n.ManufacturerPartNumber, n.PAM_Keywords), ?) 

et, en supposant que votre $params ressemblait à ceci:

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

il devrait ressembler à:

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