如何从 PHP 5.4 连接到 MS SQL 2000?

Posted

技术标签:

【中文标题】如何从 PHP 5.4 连接到 MS SQL 2000?【英文标题】:How to connect to MS SQL 2000 from PHP 5.4? 【发布时间】:2013-03-03 12:25:33 【问题描述】:

我使用 ZendFramework 和 php 版本 5.4.12,我的操作系统是 Windows 7。 我的连接参数是

resources.db.adapter = "sqlsrv"
resources.db.params.pdoType = "mssql"

但我有这个例外

Fatal error: Uncaught exception 'Exception' with message '[Microsoft][SQL Server Native Client 11.0]SQL Server Native Client 11.0 does not support connections to SQL Server 2000 or earlier versions.'

因为我用的是最新的php驱动。

如何连接到 MS SQL Server 2000(版本 8.00.760)?

【问题讨论】:

如错误消息所述,该版本的驱动程序不支持旧数据库。降级您的驱动程序版本。 我只看到Microsoft Drivers 3.0 for PHP for SQL Server 我在哪里可以获得早期版本? 我使用 Zend,它没有支持 PDO_ODBC 的适配器 我尝试使用此参数resources.db.adapter = "pdo_mssql" resources.db.params.pdoType = "mssql",但出现新错误The mssql driver is not currently installed。如何在 php 5.4 上安装 pdo_mssql 扩展? 通常你只需在你的 php.ini 中取消注释该行。 mssql 驱动程序随大多数 php 安装一起提供,但可能未激活。您也可以尝试在pecl.php.net 找到它 【参考方案1】:

我有一些仍在运行 SQL Server 2000 的数据库,我不想为其他人恢复到旧驱动程序。经过一番探索,这是我能想到的最佳解决方法:通过 ADO 使用 OLEDB 连接到 SQL Server 2000 数据库。 ADO 是一个 COM 组件,因此您需要启用 COM_DOT_NET 扩展。

我已经验证这仍然适用于安装了 Native Client 11 的 Windows Server 2008 R2 下的 PHP 5.4。

<?php
$conn =  new COM("ADODB.Connection") or die("Cannot create ADO COM object");
$conn->Open("Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=True;Data Source=LOCALHOST;Initial Catalog=master");
//$conn->Open("Provider=SQLOLEDB;User ID=username;Password=password;Persist Security Info=True;Data Source=host.example.com;Initial Catalog=databasename"); 
$rs = $conn->Execute("SELECT 1 as Number,GetDate() as Date, CAST(0 as bit) as Boolean, 'hello world' as String");
$fieldnames = []; 
$rows = [];
while (!$rs->EOF)
  $fieldnames = []; // wasteful, redoing this each time
  $thisrow = [];
  for ($i=0;$i<($rs->Fields->Count);$i++)  
    $field = $rs->Fields[$i];
    $fieldname = (string) $field->Name;
    $type = $field->Type;
    // field->Type is the ADO type; due personal weakness I am only handling types I actually need 
    if ($type == 3 || $type == 20) 
      $value = (integer) $field->Value;
     elseif ($type == 4 || $type==5) 
      $value = (float) $field->Value;
     elseif ($type == 11) 
      $value = (boolean) $field->Value;
     else 
    $value = (string) $field->Value;
    
    $thisrow[] = $value; //array by index
    $thisrow[$fieldname] = $value; // array by name
    $fieldnames[]=$fieldname;
  
  $rows[] = $thisrow;
  $rs->MoveNext();

$rs->Close(); 
$conn->Close();
echo "your fieldnames are, in column order:\n";
var_dump($fieldnames);
echo "your data is, in record order:\n";
var_dump($rows);
?>

注意事项:

这仅适用于 Windows 下的 PHP。 您需要启用 PHP COM_DOT_NET 扩展。乌格。请参阅 this post 了解如何操作。 This post at devnetwork.net 是展示如何在 PHP 下使用 ADO 的关键。 使用 ADO 的技巧是数据作为 COM 变体返回。使用 ADO 的最快方法是调用 GetRows() 并将返回的变体转换为变体的二维数组并从那里开始,但我无法让 PHP 使用它。 (这是上述链接中的“DrDev”问题。) 为避免出现问题,我遍历每一行的每个字段并显式转换为数据 PHP 类型。 (这可以做得更好,但这些都是我关心的 ADO 类型。)

待办事项:参数化查询。我多么希望我可以将这些主机更新到 SQL Server 2012 Express Edition...

【讨论】:

这个答案对于使用 ADO 连接数据库非常有用,不仅适用于 Server SQL 2000。谢谢! 谢谢。以下是使用 cmd 对象扩展参数化查询的方法:***.com/questions/2557606/…【参考方案2】:

因为您使用的是 2012 版 SQL Server Native Client(版本 11),它不再支持您的 SQL Server 2000 版。是的,很遗憾。

要解决这个问题,您应该下载可以在此处找到的早期版本:http://www.microsoft.com/en-us/download/details.aspx?id=16978

查找该部分

Microsoft® SQL Server® 2008 R2 Native Client

还是不行,需要先卸载2012版本。

如果还是不行,请看这里:http://www.sqlservercentral.com/Forums/Topic1317581-2799-1.aspx

【讨论】:

以上是关于如何从 PHP 5.4 连接到 MS SQL 2000?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 php 连接到 mssql?

使用 Java 从 Oracle 服务器连接到 MS SQL Server

将 php 连接到 MS SQL Server 2008

如何将 QNAP Web 服务器连接到 Microsoft MS SQL

从 mac osx 10.11 连接到带有 RODBC 的 MS SQL 服务器

使用 PDO_DBLIB 连接到 MS SQL 数据库的 PHP 错误