#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
разные имена столбцов.