PDO 通过 MSSQL_* 函数连接到 MSSQL
Posted
技术标签:
【中文标题】PDO 通过 MSSQL_* 函数连接到 MSSQL【英文标题】:PDO To Connect to MSSQL Over MSSQL_* Functions 【发布时间】:2012-12-27 07:30:54 【问题描述】:有一系列mssql_*
不在折旧过程中。
它们的工作方式与mysql_*
函数相同;他们需要我手动转义,请在下面找到手册的链接:
http://uk1.php.net/manual/en/book.mssql.php
MSSQL_* 函数是 php5-mssql
的一部分,但现在已移至 php5-sybase
此外,使用 PDO 构建数据库是可用的,但只是实验性 http://php.net/manual/en/ref.pdo-dblib.php
但我的总体问题是,从 PDO/MySQLI 被推为主要数据库通信解决方案这一事实,我是否应该停止使用函数 mssql_*
或者是否有可能:
PDO 连接:
$dsn = 'mssql:host=localhost;dbname=testdb';
$user = 'dbuser';
$password = 'dbpass';
try
$dbh = new PDO($dsn, $user, $password);
catch (PDOException $e)
echo 'Connection failed: ' . $e->getMessage();
但是如果这个过程仍然被列为实验性的,如果开发人员在他们的数据库中使用Microsoft SQL Server
,请等到这个扩展对 MSSQL 服务器稳定
所以说到底,PDO 扩展或 MSSQL_* 函数即使没有折旧。如果是这样,为什么?
【问题讨论】:
【参考方案1】:这可能会引发一场精彩的辩论。我想测试 PDO 函数对 Microsoft SQL Server 的稳定性的唯一方法是设置您自己的本地测试区域并将 PDO 类推向其能力。
如您所说,php5-sybase 包含 MSSQL 函数,并且不在弃用过程中。
我想这取决于开发人员的感受。
如果您对 MSSQL_* 函数感到满意,请继续使用它们,但它们可能会在不久的将来完全从 PHP 中被弃用 - MySQL 函数正在发生这种情况。
不过,如果您正在寻找变化和新挑战,并通过 SQL 注入增加安全性,那么请继续尝试 PDO 与 MSSQL 服务器的兼容性。
这完全取决于你。
根据我的偏好和猜测许多其他开发人员的偏好,我会说选择 PDO 功能。我认为它会正常工作。
<?php
$dsn = 'mssql:host=localhost;dbname=testdb';
$user = 'dbuser';
$password = 'dbpass';
try
$dbh = new PDO($dsn, $user, $password);
catch (PDOException $e)
echo 'Connection failed: ' . $e->getMessage();
$Query = $dbh->prepare("SELECT * FROM Tbl WHERE `ID` = :id");
$Query ->bindParam(':id', $ID, PDO::PARAM_INT);
$Query->execute();
// etc..
?>
【讨论】:
【参考方案2】:考虑到安全性,PDO 是显而易见的选择。 PDO 代码是可移植的 - 可以调整它以将信息发送到多个数据库,而无需更改函数调用并且只需更改几个参数。
MSSQL 类不像 PDO 那样可移植。
PDO 对准备好的语句有很好的支持,而 MSSQL 则没有。 PDO 充当抽象层,很像 Java 中的 JDBC,并且是可移植的。 PDO 支持事务,更适合处理错误
希望答案是显而易见的!
【讨论】:
【参考方案3】:我自己的意见
我已经使用PDO
连接到MSSQL
数据库一年多了,到目前为止我没有发现任何问题。
事实上,在迁移到 PDO
之前,我曾研究过使用 mssql_*
函数,并得出结论认为它们是一种不太可靠的方法,更不用说连接到 MSSQL
数据库的不安全方式了。
逻辑上
从逻辑的角度来看,PDO
也是更好的选择,因为它只需对代码进行一些调整即可从 MSSQL
更改为 MySQL
。
我为 PDO 类编写了一个包装类,使连接这些数据库变得非常容易。
以此为例:
<?php
// +------------------------------------------------------------------------+
// | class.mssql.php |
// +------------------------------------------------------------------------+
// | Copyright (c) Company Ltd 2013. All rights reserved. |
// | Version 1.0 |
// | Last modified 30/01/2013 |
// | Email email@company.co.uk |
// | Web http://www.company.co.uk |
// +------------------------------------------------------------------------+
// Make sure the SQL class is included
require_once("class.sql.php");
/*
* Class mssql
*
* @version 1.0
* @author Ben Carey <email@company.co.uk>
* @copyright Company Ltd
*
*/
class mssql extends sql
/**
* Initialize the object and set/reset all variables
*
* This function is called when the object is constructed
*
* @access private
*/
function __construct(&$memcache)
// Call the sql construct
parent::__construct($memcache);
// Global MsSQL defaults
$this->query_escaper_left = "[";
$this->query_escaper_right = "]";
$this->connection_engine = "sqlsrv";
$this->connection_parameter_host = "server";
$this->connection_parameter_database = "Database";
$this->select_db_function = "db_name()";
?>
MSSQL
独有的任何东西都在此扩展中定义,然后传递给父类class.sql.php
。 PDO 的美妙之处在于,文件class.sql.php
中的代码无需以任何方式更改即可与任何数据库(或迄今为止我尝试过的所有数据库)一起使用。
所以这里只需要为每个数据库类型做一个小的扩展,它就可以工作。
然而,使用本机 mssql_*
函数,如果您因任何特定原因决定更改数据库,则必须重写所有内容。更不用说,鉴于 mysql_*
函数现在已被弃用,您无论如何都必须为 MySQL 使用 PDO。
我的 PDO 测试
我一直在运行复杂的存储过程,包括INPUT PARAMETERS
、OUTPUT PARAMETERS
、INOUT PARAMETERS
,在其中包含 100,000,000 多条记录的数据库上。这些工作绝对完美无缺,并将继续这样做!
参考文献
不使用mssql_*
函数的另一个原因是PHP 5.3 或更高版本的Windows 不再支持它们:
See Here
SyBase 扩展与mssql_*
函数属于同一类别。它们是程序性的,不切实际的,根本不便携!
功能
乍一看,我注意到这些扩展中没有一个具有与mysql_real_escape_string()
函数等效的功能。而在 PDO 中,则不需要这样做
结论
不用说,我是一个道德的 PDO 支持者(这只是在使用它 1 年后才出现的!)。这并不是说我不会听别人对mssql_*
函数的意见,只是很难说服我,我想大多数人,这些函数甚至可以与PDO竞争。
因此,在我看来,PDO 是前进的方向,主要原因如下:
-
非常便携,用最少的代码轻松切换到不同的数据库
无需
mysql_real_escape_string()
等功能即可安全使用
这正迅速成为开发人员的常态
如果您没有面向对象编程的经验,那么这是一个很好的介绍
大多数 PHP 包都预装了它
它可以轻松执行复杂的查询,包括存储过程
在使用 MySQL 数据库对已弃用的旧 mysql_*
函数进行基准测试后,事实证明它在很多情况下(即使不是所有情况)都更快。 - See Here
不久前我问了一个类似的问题,得出了同样的结论:
See here
【讨论】:
我的赏金给你好心的先生。我喜欢你的回复。 @DarylGill 非常感谢 :-) 您能多解释一下您的课程吗?【参考方案4】:PDO 绝对是要走的路,对于 linux 用户,我强烈建议使用 sybase 连接器和 dblib DSN。
对于使用 PHP7 的 ubuntu 用户,它将是:
sudo apt-get install php-sybase freetds-common libsybdb5
对于连接:
$db = new PDO("dblib: host=$hostname:$port; dbname=$dbname", $dbuser, $dbpassword);
你应该很高兴。
【讨论】:
以上是关于PDO 通过 MSSQL_* 函数连接到 MSSQL的主要内容,如果未能解决你的问题,请参考以下文章
通过 SSL 上的 PHP PDO 连接到 MSSQL 服务器
通过 php 中的 PDO 将 xampp 连接到在线 MSSQL 数据库
使用 SQL Server Driver 通过 PDO 连接到 SQL Server