如何使用PHP7连接到SQL Server? (我是什么失踪?)

问题描述:

下面是输出的phpinfo:version.php如何使用PHP7连接到SQL Server? (我是什么失踪?)

下面的代码:

$serverName = "X.X.X.X"; 
$connection = array("UID"=>"UserID", "PWD"=>"Password123", "Database"=>"database_name"); 
$conn = sqlsrv_connect($serverName, $connection); 

if ($conn === false) { 
    $myfile3 = fopen("log.txt", "w"); 
    fwrite($myfile3, sqlsrv_errors()); 
    fclose($myfile3); 

}; 

$tsql = "SELECT top 10 pName from products"; 
$stmt = sqlsrv_query($conn, $tsql); 
$row = sqlsrv_fetch_array($stmt); 

$myfile4 = fopen("log.txt", "w"); 
fwrite($myfile4, $row[0]); 
fclose($myfile4); 
sqlsrv_free_stmt($stmt); 
sqlsrv_close($conn); 

没有被写入日志文件。即使我在fwrite中硬编码文本($ myfile3,“hard coded text”);地方,没有什么是写出来的。

这里的php.ini文件中

[ExtensionList] 
;extension=php_mysql.dll 
extension=php_mysqli.dll 
extension=php_mbstring.dll 
extension=php_gd2.dll 
extension=php_gettext.dll 
extension=php_curl.dll 
extension=php_exif.dll 
extension=php_xmlrpc.dll 
extension=php_openssl.dll 
extension=php_soap.dll 
extension=php_pdo_mysql.dll 
extension=php_pdo_sqlite.dll 
extension=php_imap.dll 
extension=php_tidy.dll 
extension=php_sqlsrv_7_nts_x64.dll 
;extension=php_sqlsrv_7_ts_x64.dll 

最后,我知道我并不需要所有的这些扩展部分,但这些都是4名的dll我在ext文件夹。

php_sqlsrv_7_nts_x64.dll 
php_sqlsrv_7_nts_x86.dll 
php_sqlsrv_7_ts_x64.dll 
php_sqlsrv_7_ts_x86.dll 
+0

您是否尝试过使用'$ serverName =“serverName \ sqlexpress”; // serverName \ instanceName'?没有文件写入,我的意思是把死像'die(print_r(sqlsrv_errors(),true));'? –

+0

还要确保SQL服务器在默认端口(1433)上运行,否则除了IP地址外还必须指定它。 –

+0

什么是错误/警告?如果没有,请确保在.ini文件中打开它们。尝试将所有内容全部封装在“try/catch”中以获取异常。当然,检查SQL语句是否返回任何内容。 – Parfait

使用PDO:

$serverName = "(local)\sqlexpress"; 

/* Connect using Windows Authentication. */ 
try 
{ 
    $conn = new PDO("sqlsrv:server=$serverName ; Database=AdventureWorks", "", ""); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(Exception $e) 
{ 
    die(print_r($e->getMessage())); 
} 

程序的方式:

$serverName = "(local)\sqlexpress"; 
$connectionOptions = array("Database"=>"AdventureWorks"); 

/* Connect using Windows Authentication. */ 
$conn = sqlsrv_connect($serverName, $connectionOptions); 
if($conn === false) 
die(sqlsrv_errors()); 

点击here获取更多信息

+0

OP不包含任何指示使用PDO的内容......此外'FormatErrors'似乎是一个自定义函数(从http://*.com/questions/28468160/connecting-to-an-sql-server -database-with-php),如果使用的话会导致一个未定义的函数错误。也没有解决与文件写入问题有关的任何事情。 – Leith

首先,你需要隔离您的问题 - 这是什么问题您的文件写入或一些错误连接到SQL Server,或者出错了PHP的设置?

故障排除的SQL Server

你可能想要尽可能详细地调用sqlsrv_errors()时使用的SQLSRV_ERR_ALL标志,并使用die()或者干脆print_r/echo结果到屏幕上(而不是写一个文件),以便您可以查看是否有问题 - 查看sqlsrv_connect文档页面上的示例。

接下来我会尽量确保你正确指定端口,如:

$serverName = 'X.X.X.X, 1433';

或指定SQL Server实例,例如:

$serverName = 'X.X.X.X\sqlexpress';

而且确保您的用户,密码和数据库名称都是正确的,并且您指定的用户在该数据库上具有正确的权限。当然,它在1433端口上运行(或者将上面的内容更改为您运行的任何端口)。

在那之后,我会考虑将这些特性之前sqlsrv_connect()通话尽可能提升到回来疑难解答连接错误:

sqlsrv_configure('WarningsReturnAsErrors', true); 
sqlsrv_configure('LogSubsystems', SQLSRV_LOG_SYSTEM_ALL); 
sqlsrv_configure('LogSeverity', SQLSRV_LOG_SEVERITY_ALL); 

看看是否能变成任何东西更实用从SQL服务器直接。

故障排除的文件写入

  • 你需要看看你的fopen - 你可以使用a模式而不是w,以确保该文件不被截断当你打开它
  • 如果文件打开失败,您还应该检查返回的$myfile3是否为false,根据the documentation
    • 如果是这样,那么您在尝试创建文件的目录中可能存在权限问题。如果文件已经提前为您创建(无需担心创建它),那么您也可能没有该文件的写入权限。如果打开失败,它应该生成一个E_WARNING(应显示在页面上,因为您的error_reporting配置设置为E_ALL,但您也可以检查PHP错误日志文件)。您还可以使用file_existsis_readable()来帮助检查权限。
    • 当你说写入值的硬编码没有写入时,这让我认为这是实际的问题。
  • 我也考虑使用不同的日志文件的各个部分(在这两种情况下不log.txt

排除你的PHP

看一看在Microsoft documentation,以确保您的DLL与您的Windows版本中使用的正确的PHP7 dll相匹配,尽管它没有指定驱动程序v4.0的操作系统要求:他们可能不支持Windows Server 2008,尽管我很害怕d很惊讶。他们也没有显示他们支持连接到哪个版本的SQL服务器,所以如果你使用的是老版本的SQL服务器,那也可能是一个问题。

作为替代方案,您可以尝试安装PDO_SQLSRV驱动程序。这是使用Windows身份验证连接到SQL-Server的示例。

$serverName = "(local)\sqlexpress";  

/* Connect using Windows Authentication. */ 
try 
{ 
$conn = new PDO("sqlsrv:server=$serverName ; Database=database_name", "", ""); 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(Exception $e) 
{ 
die(print_r($e->getMessage())); 
} 

欲了解更多信息,看看

从文档,这将给你更多的信息:http://php.net/manual/en/function.sqlsrv-connect.php

$connectionInfo = array("Database"=>"dbName"); 
$conn = sqlsrv_connect($serverName, $connectionInfo); 

if($conn) { 
    echo "Connection established.<br />"; 
}else{ 
    echo "Connection could not be established.<br />"; 
    die(print_r(sqlsrv_errors(), true)); 
} 

如果没有按给你一个错误你可能因为权限而无法写入文件?