我试图使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?
答案 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。