0

我以前使用 PDO for MYSql,但现在我需要使用 Microsoft SQL Server Driver for PHP。

我找到了手册。 http://php.net/manual/en/book.sqlsrv.php

我使用示例 #2 连接到新的 SQL 数据库: http ://www.php.net/manual/en/function.sqlsrv-connect.php

如何“转换”以下(PDO mysql)以使用 sqlsrv:

$username = 'test';

try {
$conn = new PDO('mysql:host=$host;dbname=$database', $username, password);
$stmt = $conn->prepare('SELECT username users WHERE username = :username LIMIT 1');
$stmt->execute(array('username' => $username));

if ($stmt->rowCount() > 0) {
$result = $stmt->fetch();

    echo $result['username'];

} else {
    echo 'Nothing found.';
die();
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
4

2 回答 2

1

来自 php.net

PHP 数据对象 (PDO) 扩展定义了一个轻量级、一致的接口,用于在 PHP 中访问数据库。

由于您已经为 MySQL 使用 PDO,您可以考虑使用用于 MS SQL 的 PDO 驱动程序,如dev-null-dweller所说。SQLSRV 驱动程序是访问 MS SQL 的另一种选择。但这需要彻底检查您当前的 PHP 代码。

微软为 MS SQL 提供了两种 PHP 驱动:

php_sqlsrv.dll为 MS SQL 提供了一组独特的 SQLSRV API。

php_pdo_sqlsrv.dll为 MS SQL 提供了一组大部分与 PDO 兼容的 API。

下载驱动程序时请注意您的 PHP 版本:

Version 4.0 supports PHP 7.0+ on Windows and Linux
Version 3.2 supports PHP 5.6, 5.5, and 5.4 on Windows
Version 3.1 supports PHP 5.5 and 5.4 on Windows
Version 3.0 supports PHP 5.4 on Windows

而对于 PHP5.6,微软只提供 x86 版本的驱动程序。非官方 X64 驱动可以在 http://robsphp.blogspot.tw/2012/06/unofficial-microsoft-sql-server-driver.html找到

下载驱动程序后。将您需要的版本复制到您的 PHP ext文件夹。并将驱动程序名称添加到php.ini配置中,例如:

extension=php_pdo_sqlsrv_56_ts.dll

然后重新启动网络服务器。如果phpinfo()函数显示pdo_sqlsrv部分,则可以确认 PDO 驱动程序安装正确。

请注意,MS 在 PDO 构造函数中使用了不同的 DSN。线

$conn = new PDO('mysql:host=$host;dbname=$database', $username, password);

应改为

$conn = new PDO('sqlsrv:Server=$host;Database=$database', $username, password);

那么您应该不会再次遇到“错误:找不到驱动程序”。希望这有帮助。

于 2017-04-07T07:02:07.143 回答
0

解决连接问题后,您必须将使用 MySQL SQL 方言编写的 SQL 语句转换为 T-SQL 方言(由 SQL Server 使用)。

[1] SQL Server 没有该LIMIT子句。而且,SQL 标准中不包含该子句。相反,您可以使用ROW_NUMBER() 函数。但是,在这种情况下,您不必使用此功能,因为...

[2] ...表中的usernameusers应该只接受唯一值(当然,它应该是强制性的)。因此,您必须确保在username列上有唯一约束或唯一索引。此脚本将检查您是否在列上有唯一索引username

DECLARE @TableName SYSNAME=N'dbo.users';
DECLARE @ColumnName SYSNAME=N'username';
SELECT  *
FROM    sys.indexes i
WHERE   i.object_id=OBJECT_ID(@TableName)
AND     i.is_unique=1
AND     EXISTS (
    SELECT  *
    FROM    sys.index_columns ic 
    INNER JOIN sys.columns c ON c.object_id=ic.object_id
    AND     c.column_id=ic.column_id
    WHERE   i.object_id=ic.object_id
    AND     i.index_id=ic.index_id
    AND     ic.is_included_column=0
    AND     c.name=@ColumnName
)
AND (
    SELECT  COUNT(*)
    FROM    sys.index_columns ic 
    INNER JOIN sys.columns c ON c.object_id=ic.object_id
    AND     c.column_id=ic.column_id
    WHERE   i.object_id=ic.object_id
    AND     i.index_id=ic.index_id
    AND     ic.is_included_column=0
)=1;

[3]如果username列上有唯一索引,则不需要使用LIMIT 1子句(或ROW_NUMBER()函数),因为 SQL 语句将始终返回零(最小)或一(最大)记录。

[4] SQL 语句应为SELECT username FROM users WHERE username = :param.

于 2012-10-28T14:32:01.347 回答