Search code examples
phpsql-serverodbcfreetds

Connecting to sql server data with PHP on ubuntu


When trying to connect to my mssql database, I get the error "SQLSTATE[01002] Adaptive Server connection failed (severity 9)"

Below is the php code I'm running

<?php

  try {
    $hostname = "hostname.database.windows.net";
    $port = 1433;
    $dbname = "database-dev";
    $username = "dbuser";
    $pw = "dbpassword";   
    $dbh = new PDO     ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
  $stmt = $dbh->prepare("select name from master..sysdatabases where     name = db_name()");
  $stmt->execute();
  while ($row = $stmt->fetch()) {
    print_r($row);
  }  
  unset($dbh); unset($stmt);
?>

And below is my odbc.ini, odbcinst.ini and freetds.conf, you can see my phpinfo() here ("http://wingedw.com/matiks/connect.php") the driver is set to freetds and the pdo and pdo_dlib modules have been added to php 5, any clues as to why im getting error, im sure the credentials are right.

odbc.ini

[MSSQLServer]
Driver = FreeTDS
Description = Any description
Trace = No
Server = servername
Port = 1433
Database = dbname
wTDS_Verison = 7.1

odbcinst.ini

[FreeTDS]
Driver      = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount      = 1

freetds.conf

[global]
    # TDS protocol version
;       tds version = 7.1

    # Whether to write a TDSDUMP file for diagnostic purposes
    # (setting this to /tmp is insecure on a multi-user system)
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff

    # Command and connection timeouts
;       timeout = 100
;       connect timeout = 100

    # If you get out-of-memory errors, it may mean that your client
    # is trying to allocate a huge buffer for a TEXT field.  
    # Try setting 'text size' to a more reasonable limit 
    text size = 64512

# A typical Sybase server
[egServer50]
    host = symachine.domain.com
    port = 5000
    tds version = 7.1

# A typical Microsoft server
[MSSQLServer]
    host = servername
    port = 1433
    tds version = 7.1

Solution

  • Turns out everything was configured correctly, the issue was using dblib over odbc, see code below.

    try {
        $hostname = "hostname.database.windows.net";
        $port = 1433;
        $dbName = "databasename";
        $dbuser = "dbuser@hostname";
        $dbpass = "password";   
    $dbh = new PDO('odbc:DRIVER=FreeTDS;SERVERNAME=mssql;DATABASE=' . $dbName,
              $dbuser, $dbpass);
      //echo "COnnected";
    
      } catch (PDOException $e) {
        echo "Failed to get DB handle: " . $e->getMessage() . "\n";
        exit;
     }