Внутреннее соединение ODBC, MSSQL, FreeTDS не возвращает данные из второй таблицы

У меня FreeTDS установлен на сервере Ubuntu 14.04. Я подключаюсь к базе данных MSSQL следующим образом:

$db = new PDO('odbc:Driver=FreeTDS; Server=<IP Address>; Port=1433; Database=db_name; UID=user; PWD=password;');

Я запускаю следующий запрос:

SELECT c.*, ct.*  
FROM Committee AS c
INNER JOIN CommitteeType as ct on c.CommitteeTypeID=ct.CommitteeTypeID
WHERE CommitteeID=$committee_id

Затем я бегу:

$statement = $db->prepare($query);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_NAMED);

Результирующий массив во многом соответствует ожидаемому, за исключением того, что все значения из таблицы CommitteeType пусты. Когда я запускаю точно такой же запрос в Navicat к базе данных, я получаю значения для всего из второй таблицы.

Что-то глючит в этом драйвере?

Я пробовал много вариантов синтаксиса запроса без какой-либо разницы в выводе. Похоже, я никогда не смогу получить значения из внутренней объединенной таблицы, независимо от того, какие таблицы я запрашиваю.

Кто-нибудь видит что-то, что мне не хватает, или сталкивался с чем-то подобным?


person AndrewVT    schedule 16.09.2014    source источник


Ответы (1)


Так что оказывается, есть проблемы с odbc. Вместо этого я успешно использую dblib.

Вот полный рецепт для тех, кто хочет запустить это:

Это были первоначальные направления, которым я следовал

  1. Установите пакеты freetds-bin, freetds-common, tdsodbc, odbcinst, php5-odbc и unixodbc. Это предоставляет библиотеки, которые вам нужны.
  2. Скопируйте содержимое /usr/share/doc/freetds-common/examples/odbcinst.ini в /etc/odbcinst.ini. Это регистрирует драйвер FreeTDS на уровне ODBC.
  3. Перезапустите веб-сервер, чтобы загрузить модуль ODBC в PHP.

Затем связано с:

<?php
try
{
  $db = new PDO('odbc:Driver=FreeTDS; Server=hostname_or_ip; Port=port; Database=database_name; UID=username; PWD=password;');
}
catch(PDOException $exception)
{
  die("Unable to open database.<br />Error message:<br /><br />$exception.");
}
echo '<h1>Successfully connected!</h1>';
$query = 'SELECT * FROM table_name';
$statement = $db->prepare($query);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
?>

Чтобы исправить проблему, с которой я столкнулся, я установил:

php5-sybase (например, sudo apt-get install php5-sybase)

Затем подключил так:

<?php
  try {
    $hostname = "myhost";
    $port = 10060;
    $dbname = "tempdb";
    $username = "dbuser";
    $pw = "password";
    $db = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
  }
catch(PDOException $exception)
{
  die("Unable to open database.<br />Error message:<br /><br />$exception.");
}
echo '<h1>Successfully connected!</h1>';
$query = 'SELECT * FROM table_name';
$statement = $db->prepare($query);
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
?>
person AndrewVT    schedule 17.09.2014