Microsoft SQL Server 和 Sybase 函数 (PDO_DBLIB)

简介

PDO_DBLIB 是一个驱动程序,它实现了 PHP 数据对象 (PDO) 接口,以通过 FreeTDS 库从 PHP 访问 Microsoft SQL Server 和 Sybase 数据库。

此扩展不再在 Windows 上可用。

在 Windows 上,您应该使用 SqlSrv,这是微软提供的针对 MS SQL 的备用驱动程序:» http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx .

如果无法使用 SqlSrv,您可以使用 PDO_ODBC 驱动程序连接到 Microsoft SQL Server 和 Sybase 数据库,因为本机 Windows DB-LIB 已经过时,线程不安全,并且不再受微软支持。

目录

  • PDO_DBLIB DSN — 连接到 Microsoft SQL Server 和 Sybase 数据库
添加备注

用户贡献备注 7 备注

Johankasselman at live dot com
8 年前
大家好,我写了一个类来连接到 MSSQL/Azure 数据库,并支持事务。

希望这对大家有所帮助!

<?php
/**
* @author Johan Kasselman <[email protected]>
* @since 2015-09-28 V1
*
*/

class pdo_dblib_mssql{

private
$db;
private
$cTransID;
private
$childTrans = array();

public function
__construct($hostname, $port, $dbname, $username, $pwd){

$this->hostname = $hostname;
$this->port = $port;
$this->dbname = $dbname;
$this->username = $username;
$this->pwd = $pwd;

$this->connect();

}

public function
beginTransaction(){

$cAlphanum = "AaBbCc0Dd1EeF2fG3gH4hI5iJ6jK7kLlM8mN9nOoPpQqRrSsTtUuVvWwXxYyZz";
$this->cTransID = "T".substr(str_shuffle($cAlphanum), 0, 7);

array_unshift($this->childTrans, $this->cTransID);

$stmt = $this->db->prepare("BEGIN TRAN [$this->cTransID];");
return
$stmt->execute();

}

public function
rollBack(){

while(
count($this->childTrans) > 0){
$cTmp = array_shift($this->childTrans);
$stmt = $this->db->prepare("ROLLBACK TRAN [$cTmp];");
$stmt->execute();
}

return
$stmt;
}

public function
commit(){

while(
count($this->childTrans) > 0){
$cTmp = array_shift($this->childTrans);
$stmt = $this->db->prepare("COMMIT TRAN [$cTmp];");
$stmt->execute();
}

return
$stmt;
}

public function
close(){
$this->db = null;
}

public function
connect(){

try {
$this->db = new PDO ("dblib:host=$this->hostname:$this->port;dbname=$this->dbname", "$this->username", "$this->pwd");



} catch (
PDOException $e) {
$this->logsys .= "Failed to get DB handle: " . $e->getMessage() . "\n";
}

}

}

?>
Fabian G
5 年前
您应该使用微软官方的扩展,而不是使用 Mssql 或 DBLib 扩展,您可以从这里获取:https://github.com/Microsoft/msphpsql
graham1 dot simpson at hsbcib dot com
18 年前
目前关于 Sybase 相关的 PDO 文档很少。我找到的文档中,经常会提到一个无效的 DSN 规范。以下是我目前连接到 Sybase ASE 的方法

1. 在 open client 之上编译 FreeTDS http://www.freetds.org
2. 根据文档将 PDO 和 PD_DBLIB 模块添加到 php 5 中;注意:我目前使用的是 PDO-beta 和 PDO_DBLIB-beta;
3. 使用 "pear list" 和 "php -m" 检查模块是否已成功安装;

文档中经常提到使用 "sybase:" 作为您的 DSN,但这行不通。请改用 "dblib:"。以下是一个示例

<?php
try {
$hostname = "myhost";
$port = 10060;
$dbname = "tempdb";
$username = "dbuser";
$pw = "password";
$dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$pw");
} catch (
PDOException $e) {
echo
"获取数据库句柄失败: " . $e->getMessage() . "\n";
exit;
}
$stmt = $dbh->prepare("select name from master..sysdatabases where name = db_name()");
$stmt->execute();
while (
$row = $stmt->fetch()) {
print_r($row);
}
unset(
$dbh); unset($stmt);
?>

希望这有帮助。
support at converters dot ru
18 年前
如果您在 Windows 下使用 MSSQL Server 7.0/2000/... 并使用非拉丁编码,那么最好在 PDO_ODBC 错误修复之前使用 PDO_MSSQL(MSSQL 扩展对于 PHP 版本 <=5.1.2 更加稳定且可用)。
如果您的 MSSQL 连接使用 OEM 编码的字符串(例如俄语字符集的 cp866)

1. 在工作 PC 上运行 Microsoft Server/Client Network Utility 并取消选中“DBLibrary 选项”/“自动 ANSI 到 OEM 转换”。

2. 如果需要,重启 Web 服务器。
ian at helastel dot com
12 年前
对于使用 DBLIB 插入 UTF-8/Unicode 数据时遇到问题的人,您无法以原生方式执行此操作 - 但您可以通过首先转换数据来解决问题。

例如,将数据插入到排序规则为 Latin1_General_CI_AS 的 nvarchar 列中

...
$res = $db->prepare($sql);
$res->bindValue(':value', iconv('UTF-8', 'ISO8859-1', $value);
...
fleduc dot perso at gmail dot com
6 年前
注意!

如果您在 Windows 7 上使用 PDO SQLSRV,并且在 XAMMP 上使用 32 位 PHP,您可能会遇到驱动程序问题:“此扩展需要 Microsoft ODBC 驱动程序 11 for SQL Server 才能与 SQL Server 通信”。

原因是 Microsoft 32 位 ODBC 驱动程序无法在 64 位 Windows 7 上正确安装。

在 StackOverflow 中查看针对 PDO SQLSRV 驱动程序问题的解决方案

https://stackoverflow.com/a/46245990/1330248
Vic L
7 年前
FYI:当我在 CentOS 7 中安装 php-mssql 时,PDO dblib 模块 (pdo_dblib.so) 也被安装了。我以为 php-mssql 只是包含即将被弃用的 mssql PHP 函数,但它还包含 PDO 连接器。安装它之后,我能够通过 PDO 连接到我们的 MSSQL 2014 数据库!
To Top