繁体   English   中英

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

[英]How to connect to MS SQL 2000 from PHP 5.4?

我使用ZendFramework和PHP版本5.4.12,我的操作系统是Windows7。用于连接的参数是

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)?

我有少数几个数据库仍在运行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扩展。 UGG。 看到这篇文章如何做。
  • devnetwork.net上的这篇文章对于展示如何在PHP下使用ADO至关重要。
  • 使用ADO的技巧是将数据作为COM变量返回。 使用ADO的最快方法是调用GetRows()并将转换后的变量转换为变量的2D数组,然后从那里开始,但是我无法让PHP使用它。 (这是上述链接中的“ DrDev问题”。)
  • 为了避免出现问题,我遍历了每一行的每个字段,并将其显式转换为数据PHP类型。 (这可以做得更好,但是这些都是我关心的所有ADO类型。)

待办事项:参数化查询。 我希望如何将这些主机更新为SQL Server 2012 Express Edition ...

因为您使用的是SQL Server Native Client版本11(版本11),该版本不再支持SQL Server 2000版本。 是的,这是一种耻辱。

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

寻找部分

Microsoft®SQLServer®2008 R2本机客户端

它仍然无法正常工作,您需要先卸载2012版本。

如果仍然无法使用,请在这里查看: http : //www.sqlservercentral.com/Forums/Topic1317581-2799-1.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM