2012-01-13 69 views
4

Sup!我們有與MySQL連接的核心類,比我們包含插件,我們需要該插件無法訪問我們的數據庫沒有核心類的方法。如何限制從其他類訪問MySQL連接?

的index.php

<?php 
    class Core 
    { 
     function connect() 
     { 
      $db = @mysql_connect($host, $user, $pass); 
      @mysql_select_db($base, $db); 
     } 

     function query($sql) 
     { 
      return mysql_query($sql); 
     } 
    } 

    global $c; 
    $c = new Core(); 

    include('plugin.php'); 
    $p = new Plugin(); 
    echo $p->not_work_connection(); 
    echo $p->work_connection(); 
?> 

plugin.php

<?php 
    class Plugin 
    { 
     function not_work_connection() 
     { 
      $sql = 'SELECT * FROM `net_country` LIMIT 0 , 1'; 
      $result = mysql_query($sql); 
      while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
      { 
       return print_r($row, 1); 
      } 
     } 

     function work_connection() 
     { 
     global $c; 
      $result =$c->query('SELECT * FROM `net_country` LIMIT 0 , 1'); 
      while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
      { 
       return print_r($row, 1); 
      } 
     } 
    } 
?> 

我需要限制從包含腳本的訪問權限,但大公可以使用核心方法進行查詢。我怎麼能做到這一點?

回答

4

的mysql_query沒有第二PARAM使用的mysql_connect由所使用的最後一個環節,所以你可以創建一個真正的後一個虛擬連接:

<?php 
class Core 
{ 
    private $db; 
    function connect() 
    { 
     $this->db = @mysql_connect($host, $user, $pass); 
     @mysql_select_db($base, $db); 

     //dummy 
     @mysql_connect(); 
    } 

    function query($sql) 
    { 
     //notice second param 
     return mysql_query($sql, $this->db); 
    } 
} 

global $c; 
$c = new Core(); 

include('plugin.php'); 
$p = new Plugin(); 
echo $p->not_work_connection(); //doing a mysql_query will use the dummy resource and fail 
echo $p->work_connection(); 
?> 
+0

太棒了。它簡單而有效。但需要創建mysql用戶沒有任何privelegies,並與他連接@mysql_connect('本地主機','假','假');' – Barif 2012-01-14 11:16:36

3

爲每個類創建什麼到單獨的用戶數據庫單獨的連接做了一些,並保持手柄在例如插件類這方面,並利用數據庫庫,使這個手柄操作。我認爲這是很好的解決方案。

當然你可以給用戶設置權限。 (每個類或一組類的單獨用戶)

+0

感謝幫助。我需要包含插件的「沙箱」,它們必須使用核心類中的API,並且無法直接連接到數據庫。 – Barif 2012-01-13 22:44:47

3

不太確定這是否可以幫助,但我通常做的是有一個類的SQL連接和另一個特定的表我會操縱(保存,更新,加載,刪除功能)

然後在我的索引或任何網頁我做到以下幾點:

include_once("class/sql.php") 
$db = new DB(); 
include_once("class/table.php") 
$table = new TableClass(); 

$result =$db->query($table->load(parameters)); 
     while($row = mysql_fetch_array($result)) 
     { 
      return print_r($row, 1); 
     } 

類似的東西僅僅是短暫的,但希望它幫助。