有一系列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_ *功能,即使它们没有折旧。如果是这样,为什么?
我已经使用PDO
连接到MSSQL
数据库超过一年了,到目前为止,我发现绝对没有问题。
实际上,我在迁移到mssql_*
之前研究了使用PDO
函数,并且得出的结论是,它们不太可靠,更不用说连接到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 protected] |
// | 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 protected]>
* @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_*
函数现已弃用,您无论如何都必须使用PDO for MySQL。
我一直在使用INPUT PARAMETERS
,OUTPUT PARAMETERS
,INOUT PARAMETERS
在其中包含100,000,000条记录的数据库上运行复杂的存储过程。这些都完美无瑕地工作,并继续这样做!
不使用mssql_*
函数的另一个原因是在PHP版本5.3或更高版本的Windows上不再支持它们:
SyBase扩展与mssql_*
功能属于同一类别。它们是程序性的,不切实际的,根本不可移植!
乍看之下,我注意到这些扩展中没有一个具有与mysql_real_escape_string()
函数等效的函数。然而,在PDO中,没有必要这样做
不言而喻,我是道德PDO支持者(这只是在使用它1年后才出现的!)。这并不是说我不会听取其他人对mssql_*
功能的看法,只是很难说服我,我想大多数人,这些功能甚至可以与PDO竞争。
总而言之,在我看来,PDO是前进的方式,主要有以下几个方面:
mysql_real_escape_string()
这样的功能mysql_*
函数对MySQL数据库进行基准测试之后,事实证明,在很多情况下,如果不是所有情况都会更快。 - See Here我不久前问了一个类似的问题,得出了同样的结论:
这可能引发一场激烈的辩论。我想测试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..
?>
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是考虑安全性的明显选择。 PDO代码是可移植的 - 可以调整它以将信息发送到许多数据库,而无需更改函数调用并仅更改一些参数。
MSSQL类不像PDO可移植的那样可移植。
PDO对准备好的语句提供了很好的支持,而MSSQL却没有。 PDO充当抽象层,与Java中的JDBC非常相似,并且是可移植的。 PDO支持事务处理,更好地处理错误
希望答案是显而易见的!