Intereting Posts

Как выбрать базу данных MySQL для использования с PDO в PHP?

Я хочу выбрать базу данных MySQL для использования после того, как объект PHP PDO уже создан. Как мне это сделать?

// 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' ); 

Существует ли PDO, эквивалентный mysqli :: select_db?

Возможно, я пытаюсь неправильно использовать PDO? Пожалуйста, помогите или объясните.

РЕДАКТИРОВАТЬ

Должен ли я использовать PDO для создания новых баз данных? Я понимаю, что большинство преимуществ использования PDO теряются в редко используемой операции, которая не вставляет данные, такие как CREATE DATABASE , но, похоже, странно, что нужно использовать другое соединение для создания базы данных, а затем создавать PDO-соединение для создания другого звонки.

Solutions Collecting From Web of "Как выбрать базу данных MySQL для использования с PDO в PHP?"

Как правило, вы указываете базу данных в DSN при подключении. Но если вы создаете новую базу данных, очевидно, что вы не можете указать эту базу данных DSN перед ее созданием.

Вы можете изменить свою базу данных по умолчанию с помощью оператора USE :

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

Последующие инструкции CREATE TABLE будут созданы в вашей новой базе данных.


Re comment from @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 может использовать данный именованный параметр более одного раза, только если PDO :: ATTR_EMULATE_PREPARES истинно. Поэтому, если вы говорите, что этот атрибут установлен как истинный как побочный эффект изменения баз данных, тогда он должен работать.

Но это не сработает – появляется ошибка «Недопустимый номер параметра», который указывает, что неэмулированные подготовленные заявления остаются в силе.

Навязчиво вы можете выбрать базу данных MySQL для использования после того, как объект PHP PDO уже был создан, как ниже мой код

с USE STATEMENT. Но помните здесь USE STATEMENT – команда 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 //....... //application logic } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; 

Я надеюсь, что мой код будет полезен для запроса

Вы должны настраивать базу данных при создании объекта PDO. Пример ( отсюда )

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

Насколько мне известно, вам нужно создать новый объект для каждого соединения. Вы всегда можете расширить класс PDO с помощью метода, который соединяется с несколькими базами данных. И затем используйте его, как вам нравится:

 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 } 

и используйте его как $yourclass->pickDatabase('main')->fetchAll('your stuff');