PHP DBlib PDO问题

4
我正在尝试通过php连接到MSSQL服务器,但我的pdo连接给了我很多麻烦和错误,我真的不太理解。我下面贴出的代码一周前还能正常工作,但突然之间就停止了,而且没有任何人更改过。我仍然可以连接到服务器并直接从命令行运行查询,但在php中却没有同样的好运气。 有人看到我漏掉的东西吗?我已经花了太多时间在这上面,感觉自己在打圈子。
首先,这是我从PDOException获得的错误。
SQLSTATE[] (null) (severity 0)

Part of my Mssql()

 private function __construct() {
        try{
           $this->_pdo = new PDO('dblib:host=' . Config::get('prod/host') . ':'. Config::get('prod/port') .';dbname=' . Config::get('prod/db'),Config::get('prod/username'), Config::get('prod/password'));
        }catch(PDOException $e){
            die($e->getMessage());
        }
    }

    public static function getInstance(){
        // Already an instance of this? Return, if not, create.
        if (!isset(self::$instance)) {
            self::$instance = new Mssql();
        }
        return self::$instance;
    } //...This function is working and directs to __construct()

我是如何调用它的

/*Some random php file*/
function getClients(){
    $conn = Mssql::getInstance();
//.....

我的init.php文件

//...
prod' => array(
        'host'      => 'xxxxxxx',
        'port'      => '1433',
        'username'  => 'xxxxxxx',
        'password'  => 'xxxxxx',
        'db'        => 'xxxxxxx'
    ),
//.....

@YourCommonSense 我已经使用那个人所接受的正确字符串,但仍然无法正常工作。 - Geo
3
调试:这是PDO的问题吗?我会设置一个使用硬编码DSN用户名和密码的PHP脚本。那么,您能否使用PDO连接到任何MSSQL数据库上的任何用户?如果不能,则PHP / PDO发生了某些更改。如果可以,请在涉及的数据库中设置一个新用户并使该连接正常工作。然后重新设置有问题的用户/密码,并使其正常工作。 - Ryan Vincent
1
"SQLSTATE[]"这部分来自服务器,这让我怀疑你的代码连接是正常的,但服务器端可能存在问题。我建议你更新帖子,包括更多(最好是全部)关于你的Mssql类的信息,以及你发送给服务器的SQL语句。 - Brian Showalter
@RyanVincent 如果我这样尝试 $connection_string = "DRIVER={ODBC Driver 11 for SQL Server};SERVER=$server;DATABASE=$database"; $conn = odbc_connect($connection_string,$user,$pass); 它可以工作... - Geo
@RyanVincent 我所知道的是没有任何变化。我们正在检查服务器配置,看看是否有更新弄坏了我们之前没有发现的东西。 - Geo
显示剩余2条评论
1个回答

1

我们从使用dblib转为使用odbc,我的类中的代码更改为:

 private function __construct() {
        putenv('ODBCSYSINI=/etc');
        putenv('ODBCINI=/etc/odbc.ini');
        $username = "xxxx";
        $password = "xxxx";
        try {
            $this->_pdo = new PDO("odbc:production","$username","$password");
        } catch (PDOException $exception) {                
            die($exception->getMessage());
        }

不错的发现。顺便提一下,你永远不应该捕获错误来报告它们。 - Your Common Sense
在我回答之后,我们删除了回显部分 :) - Geo
据我所记,用户名和密码也可以直接在odbc.ini中传输。 - Geo
但是使用 die() 函数实际上也在做相同的事情。应该真正被移除的是 trycatch - Your Common Sense
@RyanVincent 我会在允许的时候一天内完成 :) - Geo
@YourCommonSense 感谢这篇文章!!需要做一些更改 :) - Geo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接