Laravel + mssql无法连接

时间:2018-10-06 20:42:38

标签: php laravel sql-server-2008

我试图使laravel与mssql一起工作,但我总是收到此错误:

“ SQLSTATE [HY000]无法连接:Adaptive Server不可用或不存在(192.168.1.1:1433)(严重性9)(SQL:SELECT GETDATE())(视图:/resources/views/teste.blade .php)”

但是如果我尝试一个简单的脚本:

<?php 
 try {
$hostname = "192.168.1.1";
$port = 1433;
$dbname = "some_db";
$username = "some_user";
$pw = "some_pass";

$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 getdate()");

  $stmt->execute();


  while ($row = $stmt->fetch()) {
    print_r($row);
  }
  unset($dbh); unset($stmt);
?>

它工作正常。...laravel是否需要任何特殊配置还是不使用pdo?

1 个答案:

答案 0 :(得分:0)

您可能想查看Laravel的SqlServerConnector类getDSN()方法返回的是哪种DSN类型。

它位于:/vendor/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php

就我而言,我使用的是ODBC,但默认情况下getDSN()方法返回了Dblib DSN。 (ODBC和Dblib都在getAvailableDrivers()数组中,但它首先检查Dblib。)

laravel v5.6中的SqlServerConnector类getDsn()方法:

protected function getDsn(array $config)
{

   // checks for dblib first, by default. =(

    if (in_array('dblib', $this->getAvailableDrivers())) {
        return $this->getDblibDsn($config);
    } elseif ($this->prefersOdbc($config)) {
        return $this->getOdbcDsn($config);
    }

    return $this->getSqlSrvDsn($config);
}

更新:我只是注意到他们在laravel v5.7中将其逆转:

protected function getDsn(array $config)
{

   // Checking for ODBC first, before DBlib!

    if ($this->prefersOdbc($config)) {
        return $this->getOdbcDsn($config);
    }

    if (in_array('sqlsrv', $this->getAvailableDrivers())) {
        return $this->getSqlSrvDsn($config);
    } else {
        return $this->getDblibDsn($config);
    }
}

Per this answer我最终创建了一个重写的SqlServerConnector类,并将其注册到AppServiceProvider中,该类首先检查ODBC。