【问题标题】:How to connect to MS SQL 2000 from PHP 5.4?如何从 PHP 5.4 连接到 MS SQL 2000?
【发布时间】: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 找到它

标签: php zend-framework sql-server-2000


【解决方案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 对象扩展参数化查询的方法:stackoverflow.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多