Php 如何使用数据库作为变量进行查询

Php 如何使用数据库作为变量进行查询,php,mysql,Php,Mysql,我有两个数据库-lorem和nts.lorem,需要使用这两个数据库进行操作 $user = 'root'; $pass = ''; $db1 = new PDO('mysql:host=localhost; dbname=nts.lorem', $user, $pass); $db2 = new PDO('mysql:host=localhost; dbname=lorem', $user, $pass); 在db成为ajax请求中的一个变量之前,一切都正常工作-例如: js var db;

我有两个数据库-
lorem
nts.lorem
,需要使用这两个数据库进行操作

$user = 'root';
$pass = '';
$db1 = new PDO('mysql:host=localhost; dbname=nts.lorem', $user, $pass);
$db2 = new PDO('mysql:host=localhost; dbname=lorem', $user, $pass);
db
成为ajax请求中的一个变量之前,一切都正常工作-例如:

js

var db;
if(something is true){db = 'db1';};
else{db = 'db2';}
//... ajax post code
php

function something($db){
    global $db1, $db2;
    // how to say the next line  
    $sq = "select id from " . $db . ".tableName order by title asc";
    // error - table db1.tableName doesn't exist  
}

有什么帮助吗?

根据
$db
值选择连接:

function something($db){
    global $db1, $db2;
    $sq = "select id from tableName order by title asc";
    if ($db === 'db1') {
        $db1->execute($sq);
    } else {
        $db2->execute($sq);
    }    
    // rest of the code  
}

将执行查询的行添加到代码示例中。如果没有它,就很难确定到底出了什么问题,但我可以猜测:您不需要查询文本中的数据库名称,您需要根据从客户端接收到的参数,使用正确的数据库连接执行查询

比如:

函数($db){
全局$db1,$db2;
$sq=“按标题asc从表名顺序中选择id”;
$stmt=$db=='db1'?$db1->query($sq):$db2->query($sq);
$result=$stmt->fetch();
}

注释:假设两个数据库中都有一个名为
tableName
的表。

我也不理解这个问题。Databasename.tablename语法在mysql中有效。可能您传递了一个错误的数据库名称。您甚至不需要两个数据库连接。在这种情况下,您只需要在数据库名称周围添加``当您有假连接时,它显然不符合顺序,我不知道你通过Ajax发送的是什么我们在谈论@qadenza你能解释一下为什么你需要建立2个连接而不是只建立一个连接并有条件地设置目标数据库吗?我的代码一直工作到它不=“需要调试详细信息”。Database.tablename语法在mysql中工作,并且不需要有两个数据库连接,除非您连接到不同的mysql实例或希望使用不同的mysql用户。这些条件在这里都不成立。如果数据库名是
lorem
和其他名称,那么OP绝对不应该在js中使用
db1/db2
值。@TravelingTechGuy是,我对两个答案都投了反对票,因为这两个答案都重复了同样的错误:使用两个数据库连接一个就足够了。@TravelingTechGuy解释了为什么可以使用两个连接。我还解释了为什么一个就够了。database.tablename语法在mysql中工作,不需要有两个数据库连接,除非您连接到不同的mysql实例或希望使用不同的mysql用户。这里没有一个条件是正确的。我不知道当您不使用准备好的语句时,我是否支持使用变量
$stmt
。这很可能会误导研究人员。@mickmackusa从PDO文档中摘取:这两个数据库位于同一个mysql实例上,并使用相同的mysql用户名和密码进行连接。使用两个数据库连接没有任何逻辑上的原因,这只是浪费资源。OP超出了定义2个DB连接的长度。它们当前可能位于同一台服务器上,但以后可能会以不同方式部署。不管怎样,他要求使用他定义的两个连接对象来解决问题。这些回答了他的问题。您可以明确地向他解释,他可以对安装在同一台服务器上的2个dbs使用相同的连接对象,但这不是重点。