Допустимый MSSQL-запрос, не возвращающий строк - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь выучить PHP в свободное время и использую интерфейс для внутренней базы данных MS SQL, которую мы получили в качестве проекта быстрого обучения. Я подготовил запрос, но он никогда не возвращает никаких строк. Я подтвердил, что при выполнении запроса, когда пользователь подключения возвращает ожидаемые 26 результатов (через Powershell и SSMS), и может извлекать и отображать последние задания резервного копирования для каждой БД в сценарии php, поэтому права, драйвер и запрос - все исключено. Попытки sqlsrv_fetch($stmt) или sqlsrv_fetch_array($stmt) оба возвращают как ложные (как и ожидалось, когда строк нет). Может быть, я пропускаю что-то чрезвычайно простое?

код

$ConnectionInfo = array( "Database"=>"NetworkInfo", "UID"=>$UID, "PWD"=>$PWD);

$conn = sqlsrv_connect( $Instance, $ConnectionInfo);
if( $conn ) {
    echo "Connection established to $Instance. <br />";
}
else{
    echo "Connection could not be established. <br />";
    print_r($ConnectionInfo);
     die( print_r( sqlsrv_errors(), true));
}
echo '<br />';

$SQL_String= "USE NetworkInfo
SELECT DISTINCT dbo.site.name AS Site,
                dbo.site.colloquial_name AS 'Colloquial Name',
                dbo.site.former_name AS 'Former Name',
                dbo.hrlocation.location_datis AS 'HR Site',
                dbo.site.address AS Address,
                dbo.site.city AS City,
                dbo.site.state AS State,
                dbo.site.zip AS ZIP,
                dbo.site.main_line AS 'Main Line',
                dbo.site.main_ext AS 'Main Ext'
FROM dbo.site
JOIN dbo.hrlocation ON dbo.site.id = dbo.hrlocation.site_id";
$stmt = sqlsrv_query( $conn, $SQL_String);  
echo '<h3>$stmt</h3>';
echo 'Var_dump:';
$dump = var_dump($stmt);
echo '<br />';
if( $stmt === false ) {  
    echo "Error in statement preparation/execution.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
else {
    echo 'Returned type: ' . gettype($stmt) . '<br />';
    echo 'Returned rows: True' . sqlsrv_has_rows($stmt) . '<br />';
    echo 'Number of rows: ' . sqlsrv_num_rows($stmt) . '<br />'; 
}

выход

Connection established to server. 

$stmt
Var_dump:resource(3) of type (SQL Server Statement) 
Returned type: resource
Returned # rows: 

1 Ответ

0 голосов
/ 18 мая 2018

Проблема с этим на самом деле двоякая.

Во-первых, использование SQL USE вызывало проблему, однако я до сих пор не знаю, почему. Удаление USE NetworkInfo из запроса возвращает ожидаемые результаты.

Во-вторых, в документах для sqlsrv_num_rows () четко указано, что ресурс оператора должен быть создан с помощью статического или клавишного курсора. Настройка создания ресурса на $stmt = sqlsrv_query( $conn, $SQL_String, array(), array("Scrollable"=>'keyset')); решает проблему.

...