如何使用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
使用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获取更多信息
OP不包含任何指示使用PDO的内容......此外'FormatErrors'似乎是一个自定义函数(从http://stackoverflow.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_exists
和is_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));
}
如果没有按给你一个错误你可能因为权限而无法写入文件?
您是否尝试过使用'$ serverName =“serverName \ sqlexpress”; // serverName \ instanceName'?没有文件写入,我的意思是把死像'die(print_r(sqlsrv_errors(),true));'? –
还要确保SQL服务器在默认端口(1433)上运行,否则除了IP地址外还必须指定它。 –
什么是错误/警告?如果没有,请确保在.ini文件中打开它们。尝试将所有内容全部封装在“try/catch”中以获取异常。当然,检查SQL语句是否返回任何内容。 – Parfait