2011-11-02 33 views
0

我不知道这是否可能。这里是我有来自请求键的mysqli对象变量

if ($_REQUEST[db]=="abcd"){ 
    $result =$abcdsqli->query("SELECT * FROM ..."); 
}elseif ($_REQUEST[db]=="efgh"){ 
    $result =$efghsqli-> ... 
} 

这里就是我想要

$result =$.$_REQUEST[db].sqli->query("SELECT * FROM ..."); 
+0

几乎在任何时候你需要在你的代码中使用变量变量,你可能会犯一个错误。尝试重新思考你在使用数组做什么。 – Mike

+0

它其实不是一个变量变量,即时试图从一个变量建立一个对象的名字,所以我可以使用该对象。 –

回答

1

你为什么需要这么多mysqli对象?

并在您的代码中使用$_RESQUEST,因此公开这样会导致您网站上的许多黑客入侵。

只用一个(一个 [1])mysqli对象。


我奉劝不要使用本但是这是你想要的东西:

$sql = "{$_REQUEST['db']}sqli"; 
$$sql->query("SELECT * FROM ..."); 

所以,如果$_REQUEST['db'] == 'abc'它会做:

$abcsqli->query("SELECT * FROM ..."); 
+0

我使用多个mysqli对象,因为即时通讯从我的私人管理面板中的多个数据库中选择,显示4个不同网站的统计数据。我发现自己需要在mysqli while语句中切换数据库,以便将数据与另一个网站进行比较..所以我正在尝试这种方式 –

+0

我们一直使用多个dbo(数据库对象)。我认为数据库关键字只是他的应用程序的标志,用于确定查询使用哪个dbo。 –

+1

@JohnnyCraig很好,这很好。你没有在你的问题中指定。但是使用'$ _REQUEST'则会让你非常开放给黑客。 – Neal

1

你的问题是完美的工厂模式使用单例。这个代码是骨架的,这意味着有0验证等,但应该给你一个想法。

class Database 
{ 
    private static $dbos = array(); 

    public static function getDbo($dboKey) 
    { 
     if (!isset(self::$dbos[$dboKey])) { 

      switch ($dboKey) { 
       case 'abcd': 
        $dbo = new mysqli('localhost', 'my_user', 'my_password', 'my_db_1'); 
        break; 

       case 'efgh': 
        $dbo = new new mysqli('localhost', 'my_user', 'my_password', 'my_db_2'); 
        break; 
      } 

      self::$dbos[$dboKey] = $dbo; 
     } 

     return self::$dbos[$dboKey]; 
    }   
} 

$result = Database::getDbo($_REQUEST[db])->query("SELECT * FROM ...");  
+0

这将建立一个新的mysqli对象,如果没有一个?如果有它会返回对象,所以我可以使用它?这是一个很好的功能 –

+1

你明白了。一个工厂是一个黑箱算法,它会返回一个基于最小输入的已知对象,这就是。当你传递一个密钥时,它将指导工厂如何构建对象并返回它。 –

+0

什么是这种类型的功能的确切“名称”?我想详细了解它,看看我可以如何将它应用于其他事情。我一直知道有这样的工作,但没有知道如何找到它没有名字。 –