ODBC,MSSQL,FreeTDS内连接不从第二个表返回数据

时间:2014-09-16 17:36:33

标签: php sql-server inner-join freetds unixodbc

我在Ubuntu 14.04服务器上安装了FreeTDS。我按如下方式连接到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);

除了委员会类型表中的值全为空之外,生成的数组非常符合预期。当我在数据库中的Navicat中运行完全相同的查询时,我从第二个表中获取所有值的值。

这个驱动程序有什么问题吗?

我在查询语法上尝试了很多变体,但输出没有任何差异。看来我无法从内部连接表中获取值,无论我查询哪些表。

任何人都会看到我遗失或经历过类似事情的任何事情?

1 个答案:

答案 0 :(得分:0)

事实证明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中。
  4. 然后连接:

    <?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);
    ?>