web-dev-qa-db-ja.com

PHPのPDOで使用するMySQLデータベースを選択するにはどうすればよいですか?

PHP PDOオブジェクトが既に作成された後に使用するMySQLデータベースを選択したいのですが、どうすればよいですか?

// create PDO object and connect to MySQL
$dbh = new PDO( 'mysql:Host=localhost;', 'name', 'pass' );

// create a database named 'database_name'

// select the database we just created ( this does not work )
$dbh->select_db( 'database_name' );

Mysqli :: select_dbと同等のPDOはありますか?

おそらく、PDOを不適切に使用しようとしていますか?ヘルプまたは説明してください。

[〜#〜] edit [〜#〜]

PDOを使用して新しいデータベースを作成するべきではありませんか? CREATE DATABASEのようなデータを挿入しないめったに使用されない操作では、PDOを使用する利点の大部分が失われることを理解していますが、別の接続を使用してデータベースを作成し、PDO接続を作成する必要があるのは奇妙に思えます他の電話をかける。

37
T. Brian Jones

通常、接続時にDSNでデータベースを指定します。ただし、新しいデータベースを作成する場合は、作成する前にそのデータベースをDSNに指定できないことは明らかです。

USEステートメントを使用して、デフォルトのデータベースを変更できます。

$dbh = new PDO("mysql:Host=...;dbname=mysql", ...);

$dbh->query("create database newdatabase");

$dbh->query("use newdatabase");

後続のCREATE TABLEステートメントが新しいデータベースに作成されます。


@Mikeからのコメント:

このようにデータベースを切り替えると、PDOが準備されたステートメントをエミュレートするように見えます。 PDO :: ATTR_EMULATE_PREPARESをfalseに設定してから、別のデータベースを使用しようとすると失敗します。

いくつかのテストを行っただけで、そのようなことは見当たりません。データベースの変更はサーバーでのみ行われ、クライアントでのPDOの構成に関する変更はありません。以下に例を示します。

<?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));

あなたが言っていることが本当なら、これはエラーなく動作するはずです。 PDO :: ATTR_EMULATE_PREPARESがtrueの場合にのみ、PDOは指定された名前付きパラメーターを複数回使用できます。したがって、データベースを変更する副作用としてこの属性がtrueに設定されていると言っている場合は、機能するはずです。

しかし、それは機能しません。エミュレートされていない準備されたステートメントが有効なままであることを示すエラー「無効なパラメーター番号」を受け取ります。

49
Bill Karwin

PDOオブジェクトを作成するときにデータベースを設定する必要があります。例(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();
    }
?>
1
MrGlass

または、以下のようにPHP PDOオブジェクトがすでに作成されている場合、使用するMySQLデータベースを選択できます。

使用説明書あり。ただし、ここで使用ステートメントはmysqlコマンドです。

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;

私のコードがリクエストに役立つことを願っています

0
Varma Amit