4

我正在尝试设置 Windows 开发环境:Windows 8.1 with IIS 8.5 running SQL Server 2008RC2 and PHP 5.3.24

代码点火器 2.1.4

我可以在普通的 PHP 脚本中通过 PDO 很好地连接到数据库。但是当我尝试通过 CodeIgniter 连接时,我收到了这个错误:

"Unable to connect to your database server using the provided settings.
Filename: C\inetpub\wwwroot\ci\system\database\DB_Driver.php
Line number 124"

如果我在 IIS 界面中打开 PHP 管理器,我可以看到两个必需的驱动程序已启用:

php_sqlsrv_53_ts.dll
php_pdo_sqlsrv_53_ts.dll

这两个都出现在我的ini文件中。

在我的 CodeIgniter 数据库配置文件中,我将驱动程序设置为:sqlsrv(如果我使用 mssql,我会得到一个空白屏幕)。

/system/database/drivers/sqlsrv我的CI 安装中有驱动程序。

唯一奇怪的是在phpinfo()它显示的配置命令下--without-mssql--without-pdo-mssql但我知道它在 CI 之外工作。

phpinfo()还显示了 ini 文件路径,C:\WINDOWS但它也显示了加载的 ini 路径C:\Program Files (x86)\PHP\v5.3\php.ini

我试着移动它,但没有运气。

我的 /application/config/database 配置文件:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'localsql';
$db['default']['password'] = 'password';
$db['default']['database'] = 'elements';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

我错过了什么具体的东西吗?

4

3 回答 3

4

一、改变

$db['default']['database'] = ‘elements;
$db['default']['dbdriver'] = ‘sq’lsrv;

$db['default']['database'] = 'elements';
$db['default']['dbdriver'] = 'sqlsrv';

在你的配置文件中。

其次,驱动程序 sqlsrv 有问题。打开/system/database/drivers/sqlsrv/sqlsrv_driver.php

要允许pconnect您的配置,请89

$this->db_connect(TRUE);

return $this->db_connect(TRUE);

如果您想affected_rows正确使用,请274

return @sqlrv_rows_affected($this->conn_id);

return @sqlsrv_num_rows($this->result_id);

我在其他地方看到了多个关于如何修复的建议affected_rows,但是如果您还使用 sqlsrv 进行会话验证,则更_execute改为不使用会破坏存储的会话。Scrollable

于 2013-12-26T15:35:30.460 回答
3

如果有帮助,这里有 3 种使用 CodeIgnitor 2(我使用的是 2.2.1 版)连接到 SQL Server 的不同方式,它们适用于在 IIS 下运行的 Windows 8.1、SQL Server 2012 和 PHP 5.3:

在我的例子中,我有一个名为“MSSQLSERVER2012”的命名 SQL Server 实例。如果您不使用命名实例,则可以在下面的所有 3 个示例中将 (local)\MSSQLSERVER2012 更改为 (local)。

方法 #1:sqlsrv: 在 database.php 中使用这些设置:

$db['local_windows_sqlsrv']['username'] = 'username';
$db['local_windows_sqlsrv']['password'] = 'SQL_PASSWORD_HERE';
$db['local_windows_sqlsrv']['database'] = 'my_db_name';
$db['local_windows_sqlsrv']['hostname'] = '(local)\MSSQLSERVER2012';
$db['local_windows_sqlsrv']['dbdriver'] = 'sqlsrv';
$db['local_windows_sqlsrv']['dbprefix'] = '';
$db['local_windows_sqlsrv']['pconnect'] = FALSE;
$db['local_windows_sqlsrv']['db_debug'] = TRUE;
$db['local_windows_sqlsrv']['cache_on'] = FALSE;
$db['local_windows_sqlsrv']['cachedir'] = '';
$db['local_windows_sqlsrv']['char_set'] = 'utf8';
$db['local_windows_sqlsrv']['dbcollat'] = 'utf8_general_ci';
$db['local_windows_sqlsrv']['swap_pre'] = '';
$db['local_windows_sqlsrv']['autoinit'] = TRUE;
$db['local_windows_sqlsrv']['stricton'] = FALSE;

方法 #2:使用 SQL Server 的 odbc: 首先进行此处所示的更改:https ://stackoverflow.com/a/9617808/908677

然后在 database.php 中使用这些设置:

$db['local_windows_odbc']['database'] = 'my_db_name';
$db['local_windows_odbc']['hostname'] = 'Driver={SQL Server};Server=(local)\MSSQLSERVER2012;Database=' . $db['local_windows_odbc']['database'];
$db['local_windows_odbc']['username'] = 'username';
$db['local_windows_odbc']['password'] = 'SQL_PASSWORD_HERE';
$db['local_windows_odbc']['dbdriver'] = 'odbc';
$db['local_windows_odbc']['dbprefix'] = '';
$db['local_windows_odbc']['pconnect'] = FALSE;
$db['local_windows_odbc']['db_debug'] = TRUE;
$db['local_windows_odbc']['cache_on'] = FALSE;
$db['local_windows_odbc']['cachedir'] = '';
$db['local_windows_odbc']['char_set'] = 'utf8';
$db['local_windows_odbc']['dbcollat'] = 'utf8_general_ci';
$db['local_windows_odbc']['swap_pre'] = '';
$db['local_windows_odbc']['autoinit'] = TRUE;
$db['local_windows_odbc']['stricton'] = FALSE;

方法 #3:使用 SQL Server 的 PDO。

更新:此方法确实适用于建立连接和插入行,但要使查询正常工作,您需要升级到 CodeIgnitor 3.0,因为它为 PDO 添加了真正的 SQL Server 支持。

首先在system/database/drivers/pdo/pdo_driver.php中的__construct()做如下修改

代替:

empty($this->database) OR $this->hostname .= ';dbname='.$this->database;

和:

if (strpos($this->hostname, 'sqlsrv') === FALSE)
{
   empty($this->database) OR $this->hostname .= ';dbname='.$this->database;
}

然后在 database.php 中使用这些设置:

// PDO with SQL Server
// IMPORTANT NOTE: requires mod to __construct() in pdo_driver.php to prevent appending ';dbname='.$this->database to hostname
$db['local_windows_pdo']['username'] = 'username';
$db['local_windows_pdo']['password'] = 'SQL_PASSWORD_HERE';
$db['local_windows_pdo']['database'] = 'my_db_name';
$db['local_windows_pdo']['hostname'] = 'sqlsrv:server=(local)\MSSQLSERVER2012;Database=' . $db['local_windows_pdo']['database'];
$db['local_windows_pdo']['dbdriver'] = 'pdo';
$db['local_windows_pdo']['dbprefix'] = '';
$db['local_windows_pdo']['pconnect'] = FALSE;
$db['local_windows_pdo']['db_debug'] = TRUE;
$db['local_windows_pdo']['cache_on'] = FALSE;
$db['local_windows_pdo']['cachedir'] = '';
$db['local_windows_pdo']['char_set'] = 'utf8';
$db['local_windows_pdo']['dbcollat'] = 'utf8_general_ci';
$db['local_windows_pdo']['swap_pre'] = '';
$db['local_windows_pdo']['autoinit'] = TRUE;
$db['local_windows_pdo']['stricton'] = FALSE;
于 2015-04-27T17:57:50.447 回答
1

您的数据库配置中必须包含以下内容

$db['default']['driver']='sqlsrv'; //your mistake
$db['default']['database']='your_database'; // your mistake
$db['default']['pconnect']=false;
于 2013-11-28T13:58:52.987 回答