Хранимые процедуры прекрасно работают в MSQL Studio, но теперь в PHP - PullRequest
0 голосов
/ 10 ноября 2019

Хранимая процедура SQL возвращает NULL, когда я вызываю ее из моего мобильного приложения или веб-браузера, но эта же процедура возвращает то же, что и при вызове с использованием SQLPro для программного обеспечения MSSQL

    if( $conn == FALSE ) {
        echo "Connection failed.";
        die( print_r( sqlsrv_errors(), true));
    }


    $query = "EXEC dbo.sp_Pok_Details @oe=17,@code='5907769000409'";

    $getProducts = sqlsrv_query($conn, $query);  


    if ($getProducts == FALSE) 
    {
        die(FormatErrors(sqlsrv_errors()));  
    } 


    while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))  
    {  
        $returnArray[] = $row;
    }  

    echo json_encode($returnArray);

1 Ответ

0 голосов
/ 11 ноября 2019

Пояснения:

Вам необходимо поставить SET NOCOUNT ON в качестве первой строки в вашей хранимой процедуре, чтобы предотвратить возвращение количества строк, затронутых операторами T-SQL, как части результата. установлен. Это причина для ваших результатов NULL.

Если вы не можете изменить хранимую процедуру, используйте sqlsrv_next_result(), чтобы сделать следующий результат активным, а затем извлекайте данные.

Как примечаниеВсегда используйте подготовленные операторы и параметризованные запросы для предотвращения внедрения SQL. В PHP Driver для SQL Server функция sqlsrv_query() выполняет как подготовку операторов, так и их выполнение и может использоваться для выполнения параметризованных запросов.

Пример (на основе вашего кода) :

<?php

    if( $conn === false ) {
        echo "Connection failed.";
        die( print_r( sqlsrv_errors(), true));
    }

    $query = "EXEC dbo.sp_Pok_Details @oe = ?, @code = ?";
    $params = array(17, '5907769000409');
    $getProducts = sqlsrv_query($conn, $query, $params);  
    if ($getProducts === false) {
        die( print_r( sqlsrv_errors(), true));  
    } 

    // Just for test - make additional call(s) to get the count of the active result sets
    do {
       while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {  
          echo 'Current rowset'.'<br>';
       }  
    } while (sqlsrv_next_result($getProducts));

    while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {  
        $returnArray[] = $row;
    }

    echo json_encode($returnArray);
?>  
...