PHP 大会日本 2024

Microsoft SQL Server 和 Sybase 函数 (PDO_DBLIB)

简介

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

此扩展在 Windows 上不再可用。

在 Windows 上,您应该使用 SqlSrv,Microsoft 提供了 MS SQL 的替代驱动程序: » http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx

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

目录

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

用户贡献注释 7 条注释

Johankasselman at live dot com
9 年前
大家好,我编写了一个类来连接 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
6 年前
您应该使用 Microsoft 的官方扩展,而不是使用 Mssql 或 DBLib 扩展,可以从这里获取: https://github.com/Microsoft/msphpsql
graham1 dot simpson at hsbcib dot com
19 年前
目前关于 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(对于 PHP 版本 <=5.1.2,MSSQL 扩展更稳定且更易用)。
如果您的 MSSQL 连接使用 OEM 编码的字符串(俄语字符集为 cp866)

1. 在工作电脑上运行 Microsoft Server/Client 网络实用程序,然后取消选中“DBLibrary 选项”/“自动 ANSI 到 OEM 转换”

2. 如果需要,重启 Web 服务器。
Vic L
7 年前
仅供参考:当我安装 CentOS 7 中的 php-mssql 时,PDO dblib 模块 (pdo_dblib.so) 也被安装了。我以为 php-mssql 只会包含即将弃用的 mssql PHP 函数,但它也包含了 PDO 连接器。安装完成后,我能够通过 PDO 连接到我们的 MSSQL 2014 数据库!
fleduc dot perso at gmail dot com
7 年前
注意!

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

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

请查看 StackOverflow 中有关 PDO SQLSRV 驱动程序问题的解决方案

https://stackoverflow.com/a/46245990/1330248
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);
...
To Top