php与pdo,创建动态数据库连接

php与pdo,创建动态数据库连接,php,pdo,Php,Pdo,我创建与此语句的连接 dbh = new PDO('mysql:host=localhost;dbname=mydb;port=3306;connect_timeout=15', 'root', ''); 但在我的应用程序中,用户能够更改数据源,因此我需要使用用户发布的服务器信息创建当前数据库连接,我尝试以下方法: dbh = new PDO('sqlsrv:server=' + $result["servername"] + ';dbname=' + $result["dbname"] +

我创建与此语句的连接

dbh = new PDO('mysql:host=localhost;dbname=mydb;port=3306;connect_timeout=15', 'root', '');
但在我的应用程序中,用户能够更改数据源,因此我需要使用用户发布的服务器信息创建当前数据库连接,我尝试以下方法:

dbh = new PDO('sqlsrv:server=' + $result["servername"] + ';dbname=' + $result["dbname"] + ';port=3306;connect_timeout=15', '' + $result["user"] + '', '' + $result["password"] + '');`

但它失败了。即使我尝试了一些简单的代码示例,也没有得到文档。。这是怎么回事?我怎样才能做到

$dbh=newpdo'sqlsrv:server='$结果[servername];dbname='$结果[dbname];端口=3306;connect_timeout=15',$result[user],$result[password]

$dbh=newpdo'sqlsrv:server='$结果[servername];dbname='$结果[dbname];端口=3306;connect_timeout=15',$result[user],$result[password]

首先,不能将字符串与“+”合并。您必须使用“.”,并且您需要为每个数据库连接创建新的PDO连接对象或将其设置为现有。我在这里分享了部分代码,以执行以下操作:

private function __construct()
    {
        //default database connection
        $this->dbh = new PDO('mysql:host=localhost;dbname=webfilter;port=3306;connect_timeout=15', 'root', '');
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $this->directed = false;
        $this->resultBool = true;
    }

    public static function getConnection()
    {
        $sqlstring = "select * from datasources WHERE ACTIVE =1";
        if (!isset(self::$instance))
        {
            $object = __CLASS__;
            self::$instance = new $object;
        }
        if (true) {
            $request = self::$instance->dbh->prepare($sqlstring);
            if ($request->execute()) {
                if ($result = $request->fetch(PDO::FETCH_ASSOC)) {
                    if ($result["SOFTWARE"] == "mysql") {
                        self::$instance->dbh = null;
                        self::$instance->connectedDbName = "mysql(" . $result["DATABASENAME"] . ")";
                        self::$instance->dbh = new PDO('mysql:host=' . $result["SERVERADDRESS"] . ';dbname=' . $result["DATABASENAME"] . ';port=3306;connect_timeout=15', '' . $result["USERNAME"] . '', '' . $result["PASSWORD"] . '');
                        self::$instance->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        self::$instance->directed = true;
                        self::$instance->resultBool = true;
                    } else if ($result["SOFTWARE"] == "mssql") {
                        self::$instance->dbh = null;//close the existing connection
                        self::$instance->connectedDbName = "mssql(" . $result["DATABASENAME"] . ")";
                        self::$instance->dbh = new PDO('sqlsrv:server=' . $result["SERVERADDRESS"] . ';Database=' . $result["DATABASENAME"] . '', '' . $result["USERNAME"] . '', '' . $result["PASSWORD"] . '');
                        self::$instance->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        self::$instance->dbh->query("use " . $result["DATABASENAME"]);
                        self::$instance->directed = true;
                        self::$instance->resultBool = true;
                    } else if ($result["SOFTWARE"] == "oracle") {
                        self::$instance->connectedDbName = "oracle(" . $result["DATABASENAME"] . ")";
                        self::$instance->dbh = new PDO('odbc:DRIVER=FreeTDS;server=localhost;Database=Dbname', 'username', '!123qwe');
                    }
                    self::$instance->resultBool = true;
                    $temp = self::$instance->dbh->query("select DEVICEID from ethernet LIMIT 1");
                    self::$instance->setDeviceid($temp->fetchColumn());
                    return self::$instance;
                }
                self::$instance->connectedDbName = "default";
                $temp = self::$instance->dbh->query("select DEVICEID from ethernet LIMIT 1");
                self::$instance->setDeviceid($temp->fetchColumn());
                return self::$instance;
            }
        }
        self::$instance->connectedDbName = "default";
        return self::$instance;
    }

    public function getConnectionStatusMessage()
    {
        if ($this->resultBool) {
            return "Connection Successfull" . $this->connectedDbName;
        } else {
            return "Connection Failed:" . $this->resultString;
        }
    }

首先,不能将字符串与“+”合并。您必须使用“.”,并且您需要为每个数据库连接创建新的PDO连接对象或将其设置为现有。我在这里分享了部分代码,以执行以下操作:

private function __construct()
    {
        //default database connection
        $this->dbh = new PDO('mysql:host=localhost;dbname=webfilter;port=3306;connect_timeout=15', 'root', '');
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        $this->directed = false;
        $this->resultBool = true;
    }

    public static function getConnection()
    {
        $sqlstring = "select * from datasources WHERE ACTIVE =1";
        if (!isset(self::$instance))
        {
            $object = __CLASS__;
            self::$instance = new $object;
        }
        if (true) {
            $request = self::$instance->dbh->prepare($sqlstring);
            if ($request->execute()) {
                if ($result = $request->fetch(PDO::FETCH_ASSOC)) {
                    if ($result["SOFTWARE"] == "mysql") {
                        self::$instance->dbh = null;
                        self::$instance->connectedDbName = "mysql(" . $result["DATABASENAME"] . ")";
                        self::$instance->dbh = new PDO('mysql:host=' . $result["SERVERADDRESS"] . ';dbname=' . $result["DATABASENAME"] . ';port=3306;connect_timeout=15', '' . $result["USERNAME"] . '', '' . $result["PASSWORD"] . '');
                        self::$instance->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        self::$instance->directed = true;
                        self::$instance->resultBool = true;
                    } else if ($result["SOFTWARE"] == "mssql") {
                        self::$instance->dbh = null;//close the existing connection
                        self::$instance->connectedDbName = "mssql(" . $result["DATABASENAME"] . ")";
                        self::$instance->dbh = new PDO('sqlsrv:server=' . $result["SERVERADDRESS"] . ';Database=' . $result["DATABASENAME"] . '', '' . $result["USERNAME"] . '', '' . $result["PASSWORD"] . '');
                        self::$instance->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        self::$instance->dbh->query("use " . $result["DATABASENAME"]);
                        self::$instance->directed = true;
                        self::$instance->resultBool = true;
                    } else if ($result["SOFTWARE"] == "oracle") {
                        self::$instance->connectedDbName = "oracle(" . $result["DATABASENAME"] . ")";
                        self::$instance->dbh = new PDO('odbc:DRIVER=FreeTDS;server=localhost;Database=Dbname', 'username', '!123qwe');
                    }
                    self::$instance->resultBool = true;
                    $temp = self::$instance->dbh->query("select DEVICEID from ethernet LIMIT 1");
                    self::$instance->setDeviceid($temp->fetchColumn());
                    return self::$instance;
                }
                self::$instance->connectedDbName = "default";
                $temp = self::$instance->dbh->query("select DEVICEID from ethernet LIMIT 1");
                self::$instance->setDeviceid($temp->fetchColumn());
                return self::$instance;
            }
        }
        self::$instance->connectedDbName = "default";
        return self::$instance;
    }

    public function getConnectionStatusMessage()
    {
        if ($this->resultBool) {
            return "Connection Successfull" . $this->connectedDbName;
        } else {
            return "Connection Failed:" . $this->resultString;
        }
    }

检查$result[dbnamee],它是dbnamee还是dbname?它是如何失败的?例外?@ravenanigam我编辑过。但我的问题仍然存在。@Devon消息:“PDOException”,在C:\inetpub中显示消息“找不到驱动程序”。。即使我为next设置了连接,它是否能够使用动态创建的db传输数据?这是我的问题描述。谢谢检查$result[dbnamee],它是dbnamee还是dbname?它是如何失败的?例外?@ravenanigam我编辑过。但我的问题仍然存在。@Devon消息:“PDOException”,在C:\inetpub中显示消息“找不到驱动程序”。。即使我为next设置了连接,它是否能够使用动态创建的db传输数据?这是我的问题描述。谢谢。如果你解释一下这段代码解决问题的原因,这将是一个质量更好的答案。如果你解释一下这段代码解决问题的原因,这将是一个质量更好的答案。