【问题标题】:Switch between multiple database in PDO在 PDO 中的多个数据库之间切换
【发布时间】:2012-03-24 05:32:40
【问题描述】:

我是 PDO 的新手。我想知道PDO中是否有类似mysql_select_db的东西,这样我就可以在运行时在不同的数据库之间切换而无需创建新对象。

【问题讨论】:

标签: php


【解决方案1】:

没有,如果您想在运行时同时使用这两个 PDO 对象,则需要为单独的连接创建两个 PDO 对象。

编辑:下面@laz 的有趣观点(我猜这是我的答案投反对票的原因)。我在假设数据库位于不同的服务器上的假设下思考,在这种情况下我的答案是正确的。

【讨论】:

    【解决方案2】:

    看起来 PDO 没有数据库切换,因为不是每个数据库引擎都支持它。

    AFAIK PostgreSQL 没有数据库切换,但提供模式,您可以在这些模式之间切换。

    但是,如果您使用的是 mysql,请检查这是否适合您:

    $pdo = new PDO('mysql:dbname=db1;host=127.0.0.1','user','pass');
    
    $sql = 'select count(*) from table_name';
    
    $res = $pdo->query($sql);
    print_r($res->fetchAll());
    
    $pdo->exec('USE db2');
    
    $res = $pdo->query($sql);
    print_r($res->fetchAll());
    

    【讨论】:

    • 我可以确认这将在 MySQL 中工作,前提是连接的用户对新数据库具有权限。
    【解决方案3】:

    我知道我迟到了几个月,但您应该能够在查询中在数据库之间切换。

    例子:

    $sql = "SELECT * FROM dbname.tablename";
    
    $sql = "SELECT * FROM anotherdbname.anothertablename"
    

    因此,即使您的原始 $pdo 对象使用 'blahblah' 作为 dbname,根据我提供的选择示例,您仍然应该没问题。

    【讨论】:

    • 当然,如果您的数据库帐户只有一个数据库的使用权限,这将不起作用。出于安全原因,许多帐户都有此功能。我做了一个简单的开关,在调用类时检查您要使用的数据库,当您调用例如 db1 时,它会从配置文件中获取帐户信息。
    • 另外,当您使用复制时,插入或更新不一定安全。
    • 是否在模式和数据库之间切换?
    • 抛出“未找到基表或视图”错误消息显示“connection_Initiated_DataBase.attempted_To_Switch_To_Database.table”...这意味着 PDO 连接始终希望您在初始化连接后使用同一个数据库.
    • @FrankConry "database" 是“schema”的另一个名称——这些术语通常是等价的和可以互换的,尽管“schema”在技术上可能更具体和正确。
    【解决方案4】:

    您实际上根本不需要在连接时指定数据库。只要您在每个查询中指定数据库,正如 Laz 所说,这将起作用:

    $dbh = new PDO('mysql:host=127.0.0.1','USER','PASS');
    
    $query = "SELECT * FROM database1.table1";
    $query = "SELECT * FROM database2.table1";
    

    【讨论】:

    • 这会抛出“未选择数据库”,查询为“SELECT * FROM database.table”
    • 在我的情况下发现这个答案不正确。 SELECT * FROM database1.table1,导致错误“未选择数据库”。
    【解决方案5】:

    你甚至不需要在每个查询中指定数据库,只需使用 msyql 语法

     USE db_name
    

    然后写下你的请求

    【讨论】:

    • 我在使用 PDO 的这种方法时也遇到了问题......会收到错误 #2014,“在其他无缓冲查询处于活动状态时无法执行查询。”即使我使用了 fetchAll() 和/或关闭了所有其他查询的光标。我最终不得不使用为每个数据库/模式设置单独的 PDO 实例的方法,然后它就完美地工作了。
    • 这适用于我的代码,当将dbname=xxx; 排除在 PDO 初始化程序之外时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多