How do I select a MySQL database to use with PDO in PHP?

前端 未结 4 1519
独厮守ぢ
独厮守ぢ 2020-12-05 04:18

I want to select a MySQL database to use after a PHP PDO object has already been created. How do I do this?

// create PDO object and connect to MySQL
$dbh =         


        
相关标签:
4条回答
  • 2020-12-05 04:45

    You should be setting the database when you create the PDO object. An example (from here)

    <?php
    $hostname = "localhost";
    $username = "your_username";
    $password = "your_password";
    
    try {
        $dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);
        echo "Connected to database"; // check for connection
        }
    catch(PDOException $e)
        {
        echo $e->getMessage();
        }
    ?>
    
    0 讨论(0)
  • 2020-12-05 04:46

    As far as I know, you have to create a new object for each connection. You can always extend the PDO class with a method which connects to multiple databases. And then use it as you like:

    public function pickDatabase($db) {
      if($db == 'main') {
        return $this->db['main']; //instance of PDO object
      else
        return $this->db['secondary']; //another instance of PDO object
    }
    

    and use it like $yourclass->pickDatabase('main')->fetchAll('your stuff');

    0 讨论(0)
  • 2020-12-05 04:58

    Alternatively, you can select a MySQL database to use after a PHP PDO object has already been created as below:

    With USE STATEMENT. But remember here USE STATEMENT is mysql command

    try
    {
        $conn = new PDO("mysql:host=$servername;", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        $conn->exec("use databasename");
        //application logic
    }
    catch(PDOException $e)
    {
        echo $sql . "<br>" . $e->getMessage();
    }
    
    $conn = null;
    

    I hope my code is helpful for requested

    0 讨论(0)
  • 2020-12-05 05:09

    Typically you would specify the database in the DSN when you connect. But if you're creating a new database, obviously you can't specify that database the DSN before you create it.

    You can change your default database with the USE statement:

    $dbh = new PDO("mysql:host=...;dbname=mysql", ...);
    
    $dbh->query("create database newdatabase");
    
    $dbh->query("use newdatabase");
    

    Subsequent CREATE TABLE statements will be created in your newdatabase.


    Re comment from @Mike:

    When you switch databases like that it appears to force PDO to emulate prepared statements. Setting PDO::ATTR_EMULATE_PREPARES to false and then trying to use another database will fail.

    I just did some tests and I don't see that happening. Changing the database only happens on the server, and it does not change anything about PDO's configuration in the client. Here's an example:

    <?php
    
    // connect to database
    try {
        $pdo = new PDO('mysql:host=huey;dbname=test', 'root', 'root');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    } catch(PDOException $err) {
        die($err->getMessage());
    }
    
    $stmt = $pdo->prepare("select * from foo WHERE i = :i");
    $result = $stmt->execute(array("i"=>123));
    print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    
    $pdo->exec("use test2");
    
    $stmt = $pdo->prepare("select * from foo2 WHERE i = :i AND i = :i");
    $result = $stmt->execute(array("i"=>456));
    print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    

    If what you're saying is true, then this should work without error. PDO can use a given named parameter more than once only if PDO::ATTR_EMULATE_PREPARES is true. So if you're saying that this attribute is set to true as a side effect of changing databases, then it should work.

    But it doesn't work -- it gets an error "Invalid parameter number" which indicates that non-emulated prepared statements remains in effect.

    0 讨论(0)
提交回复
热议问题