Php sqlsrv_query и sqlsrv_fetch_array, используемые для первичного ключа с Microsoft SQL Server

#php #sql-server #sqlsrv

#php #sql-сервер #sqlsrv

Вопрос:

У меня возникли проблемы с извлечением первичного ключа из таблицы.

Моя структура таблицы выглядит следующим образом.

введите описание изображения здесь

В таблице есть одна запись:

 id = 1 
PlaceName = 'in the matrix'
 

введите описание изображения здесь

Извлекается с помощью следующего оператора SQL напрямую:

 SELECT id 
FROM rde_613949.dbo.PlaceNames 
WHERE PlaceName = 'in the matrix';
 

Я пытаюсь получить id эту запись, используя следующий метод:

 function GetPlaceNameId($locationName)
{
    //returns the id of the location name, creating if required
    $resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
    $tsql = "SELECT id from rde_613949.dbo.PlaceNames where PlaceName = ?";
    $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
    $stmt = sqlsrv_query($resource, $tsql, array($locationName), $options);
    if ($stmt)
    {
        while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC));
        {
            $recordFound = true;
            $locationId = $row['id'];
            return $locationId;
        }
    }
    else
    {
        return $this -> AddPlaceToDatabase($locationName);
    }
}
 

Этот метод завершается ошибкой при

 while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
 

$row возвращает значение null, что означает $location , что также возвращает значение null.

У меня есть другая таблица с другим методом, в котором работает этот подход. Единственное реальное отличие заключается в том, что я не возвращаю первичный ключ в том, который работает.

 public function FindStudentRecord($studentId)
{
    require_once("./Student.php");
    $resource = sqlsrv_connect($this->Server,$this->ConnectionInfo);
    $tsql = "select FirstName, LastName from rde_613949.dbo.Students where StudentId = ?";
    $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET);
    $result = sqlsrv_query($resource, $tsql, array($studentId), $options);
    while($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
    {
        $student = new Student($studentId, $row['FirstName'], $row['LastName']);
        return $student;
    }
    return null; //no records found return null
}
 

введите описание изображения здесь

Пожалуйста, может кто-нибудь объяснить мне разницу в этой ситуации и посоветовать, как это сделать правильно, пожалуйста?

Комментарии:

1. Какова сортировка PlaceName столбца? И что GetPlaceNameId('in the matrix') возвращает вызов?

2. Я не знаю, как получить сопоставление для коллума. Но поскольку я никогда не устанавливал сопоставление, оно должно быть по умолчанию. Таблица и коллум были созданы с помощью следующего кода. function CreatePlacesTable() { $createQuery = 'create table Places ( id INT IDENTITY(1,1) PRIMARY KEY NOT NULL, PlaceName varchar (200) NOT NULL )'; $query = sqlsrv_prepare($this->Resource, $createQuery); return sqlsrv_execute($query); } В ответ на ваш второй вопрос он дает тот же результат

Ответ №1:

Хотя я не понимаю, почему я обошел это, выбрав * вместо выбора id. Если кто-нибудь понимает это, пожалуйста, напишите сообщение, чтобы посоветовать.

Комментарии:

1. Возможным объяснением является сопоставление базы данных. Вы можете проверить сопоставление с SELECT DATABASEPROPERTYEX('rde_613949', 'Collation') помощью . В случае сопоставления с учетом регистра Id и id разные имена столбцов.